diablofx commited on
Commit
bbc6118
·
1 Parent(s): 444a75d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -52
app.py CHANGED
@@ -1,32 +1,36 @@
1
- from pydub import AudioSegment
2
  import gradio as gr
 
3
  import os
 
 
4
  import math
 
5
 
6
- class SplitWavAudioMubin:
7
- def __init__(self, folder, filename):
8
- self.folder = folder
9
- self.filename = filename
10
- self.filepath = os.path.join(folder, filename)
11
- self.audio = AudioSegment.from_wav(self.filepath)
12
-
 
 
13
  def get_duration(self):
14
- return self.audio.duration_seconds
15
-
16
- def single_split(self, from_min, to_min, split_filename):
17
- t1 = from_min * 60 * 1000
18
- t2 = to_min * 60 * 1000
19
- split_audio = self.audio[t1:t2]
20
- split_audio.export(os.path.join(self.folder, split_filename), format="wav")
21
-
22
- def multiple_split(self, min_per_split):
23
- total_mins = math.ceil(self.get_duration() / 60)
24
- for i in range(0, total_mins, min_per_split):
25
- split_fn = f"{i}_{self.filename}"
26
- self.single_split(i, i + min_per_split, split_fn)
27
- print(f"{i} Done")
28
- if i == total_mins - min_per_split:
29
- print("All split successfully")
30
 
31
  def main():
32
  # Gradio Interface
@@ -40,46 +44,51 @@ def main():
40
  with gr.Row():
41
  with gr.Column():
42
  audio_input = gr.Audio(type='filepath')
43
- get_info_butt = gr.Button(value='Get Audio File Info', variant='primary')
44
- interval_input = gr.Number(value=5, label="Enter Interval (seconds):")
45
- cut_audio_butt = gr.Button(value='Cut and Compile Audio', variant='success', visible=False)
46
  with gr.Column():
47
  output_markdown = gr.Markdown(value="", visible=True)
48
 
49
- get_info_butt.click(fn=get_audio_file_info, inputs=[audio_input, interval_input, cut_audio_butt, output_markdown])
50
- cut_audio_butt.click(fn=cut_and_compile_audio, inputs=[audio_input, interval_input], outputs=[output_markdown, cut_audio_butt])
51
-
 
52
  app.queue(max_size=1022).launch(share=True)
53
 
54
- def get_audio_file_info(audio_file, interval, cut_audio_butt, output_markdown):
55
- # Read the audio data from the file
56
- audio_splitter = SplitWavAudioMubin('/mnt/data/audio_clips', 'audio_file.wav')
57
- audio_duration = audio_splitter.get_duration()
 
58
 
59
- # Display audio file information
60
- output_markdown.value = f"""
61
- **Audio File Information:**
62
- - File Name: {os.path.basename(audio_file)}
63
- - Duration: {int(audio_duration / 60)} minutes {int(audio_duration % 60)} seconds
64
- - Interval: {interval} seconds
 
 
65
  """
66
 
67
- # Enable the button for cutting audio
68
  cut_audio_butt.visible = True
69
 
70
- def cut_and_compile_audio(audio_file, interval):
71
- # Read the audio data from the file
72
- audio_splitter = SplitWavAudioMubin('/mnt/data/audio_clips', 'audio_file.wav')
73
- audio_splitter.multiple_split(min_per_split=interval)
74
-
75
- # Provide a download link for a zip file containing all clips
76
- zip_file_path = '/mnt/data/audio_clips.zip'
77
- os.system(f"zip -j {zip_file_path} {audio_splitter.folder}/*")
78
 
79
- # Provide a download link for the zip file
80
- download_link = f"[Download All Clips](sandbox:{zip_file_path})"
 
 
 
81
 
82
- return f"Audio cut and compiled successfully. {download_link}"
 
 
 
 
 
83
 
84
  # Create the Gradio interface
85
  main()
 
 
1
  import gradio as gr
2
+ import numpy as np
3
  import os
4
+ import soundfile as sf
5
+ from pydub import AudioSegment
6
  import math
7
+ import shutil
8
 
9
+ class SplitWavAudio:
10
+ def __init__(self, audio_file):
11
+ self.audio_file = audio_file
12
+ self.audio_data, self.sample_rate = sf.read(audio_file)
13
+ if len(self.audio_data.shape) > 1:
14
+ self.audio_data = np.mean(self.audio_data, axis=1)
15
+ self.audio_info = sf.info(audio_file)
16
+ self.bit_depth = {'PCM_16': 16, 'FLOAT': 32}.get(self.audio_info.subtype, 0)
17
+
18
  def get_duration(self):
19
+ return self.audio_info.duration
20
+
21
+ def single_split(self, from_sec, to_sec, split_filename):
22
+ t1 = int(from_sec * self.sample_rate)
23
+ t2 = int(to_sec * self.sample_rate)
24
+ split_audio = self.audio_data[t1:t2]
25
+ sf.write(split_filename, split_audio, self.sample_rate, subtype=self.audio_info.subtype)
26
+
27
+ def multiple_split(self, sec_per_split):
28
+ total_sec = self.get_duration()
29
+ for i in range(0, int(total_sec), sec_per_split):
30
+ split_filename = f"{i}_{os.path.basename(self.audio_file)}"
31
+ self.single_split(i, i + sec_per_split, split_filename)
32
+ print(f"{i} seconds Done")
33
+ print('All split successfully')
 
34
 
35
  def main():
36
  # Gradio Interface
 
44
  with gr.Row():
45
  with gr.Column():
46
  audio_input = gr.Audio(type='filepath')
47
+ create_info_butt = gr.Button(value='Get Audio File Info', variant='primary')
48
+ interval_input = gr.Number(min=1, placeholder='Enter Interval (seconds)', visible=False)
49
+ cut_audio_butt = gr.Button(value='Cut Audio', variant='success', visible=False)
50
  with gr.Column():
51
  output_markdown = gr.Markdown(value="", visible=True)
52
 
53
+ create_info_butt.click(fn=get_audio_file_info, inputs=[audio_input, interval_input, cut_audio_butt],
54
+ outputs=[output_markdown])
55
+ cut_audio_butt.click(fn=cut_audio, inputs=[audio_input, interval_input])
56
+
57
  app.queue(max_size=1022).launch(share=True)
58
 
59
+ def get_audio_file_info(audio_file, interval_input, cut_audio_butt):
60
+ audio_info = SplitWavAudio(audio_file)
61
+ bit_depth = audio_info.bit_depth
62
+ minutes, seconds = divmod(audio_info.get_duration(), 60)
63
+ speed_in_kbps = audio_info.sample_rate * bit_depth / 1000
64
 
65
+ info_table = f"""
66
+ | Information | Value |
67
+ | :---: | :---: |
68
+ | File Name | {os.path.basename(audio_file)} |
69
+ | Duration | {int(minutes)} minutes - {int(seconds)} seconds |
70
+ | Bitrate | {speed_in_kbps} kbp/s |
71
+ | Audio Channels | {audio_info.audio_info.channels} |
72
+ | Samples per second | {audio_info.sample_rate} Hz |
73
  """
74
 
75
+ interval_input.visible = True
76
  cut_audio_butt.visible = True
77
 
78
+ return info_table
 
 
 
 
 
 
 
79
 
80
+ def cut_audio(audio_file, interval_input):
81
+ audio_info = SplitWavAudio(audio_file)
82
+ sec_per_split = interval_input
83
+ temp_folder = 'temp_audio_splits'
84
+ os.makedirs(temp_folder, exist_ok=True)
85
 
86
+ try:
87
+ audio_info.multiple_split(sec_per_split)
88
+ shutil.make_archive('audio_splits', 'zip', temp_folder)
89
+ print('Audio splits compiled successfully!')
90
+ finally:
91
+ shutil.rmtree(temp_folder)
92
 
93
  # Create the Gradio interface
94
  main()