ernestchu commited on
Commit
96edf76
1 Parent(s): f6c8d4d

add yt functionality

Browse files
Files changed (2) hide show
  1. .gitignore +1 -0
  2. app.py +35 -5
.gitignore CHANGED
@@ -4,4 +4,5 @@ __pycache__
4
  *.swp
5
  *.egg-info
6
  build
 
7
 
 
4
  *.swp
5
  *.egg-info
6
  build
7
+ yt-audio
8
 
app.py CHANGED
@@ -2,10 +2,12 @@ import os
2
  from tsmnet import Stretcher
3
  import gradio as gr
4
  from gradio import processing_utils
5
- import torch
6
  import torchaudio
 
7
 
8
  model_root = './weights'
 
9
  available_models = ['speech', 'pop-music', 'classical-music']
10
  working_sr = 22050
11
 
@@ -15,13 +17,40 @@ def prepare_models():
15
  for weight in available_models
16
  }
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  def prepare_audio_file(rec, audio_file, yt_url):
19
  if rec is not None:
20
  return rec
21
  if audio_file is not None:
22
  return audio_file
23
  if yt_url != '':
24
- pass
25
  else:
26
  raise gr.Error('No audio found!')
27
 
@@ -45,6 +74,7 @@ def run(rec, audio_file, yt_url, speed, model, start_time, end_time):
45
  # @@@@@@@ Start of the program @@@@@@@@
46
 
47
  models = prepare_models()
 
48
 
49
  with gr.Blocks() as demo:
50
  gr.Markdown('# TSM-Net')
@@ -56,7 +86,7 @@ with gr.Blocks() as demo:
56
  with gr.Tab('From file'):
57
  audio_file_box = gr.Audio(label='Audio sample', type='filepath')
58
  with gr.Tab('From YouTube'):
59
- yt_url_box = gr.Textbox(label='YouTube URL', placeholder='Under Construction', interactive=False)
60
 
61
  rec_box.change(lambda: [None] * 2, outputs=[audio_file_box, yt_url_box])
62
  audio_file_box.change(lambda: [None] * 2, outputs=[rec_box, yt_url_box])
@@ -68,7 +98,7 @@ with gr.Blocks() as demo:
68
  # gr.Markdown('### Trim audio sample (sec)')
69
  with gr.Row():
70
  start_time_box = gr.Number(label='Start', value=0)
71
- end_time_box = gr.Number(label='End', value=20)
72
  model_box = gr.Dropdown(label='Model weight', choices=available_models, value=available_models[0])
73
 
74
  submit_btn = gr.Button('Submit')
@@ -76,7 +106,7 @@ with gr.Blocks() as demo:
76
  with gr.Column():
77
  with gr.Accordion('Hint', open=False):
78
  gr.Markdown('You can find more settings under the **Fine-grained settings**')
79
- gr.Markdown('- Feeling slow? Try to adjust the start/end timestamp')
80
  gr.Markdown('- Low audio quality? Try to switch to a proper model weight')
81
  outputs=gr.Audio(label='Output')
82
 
 
2
  from tsmnet import Stretcher
3
  import gradio as gr
4
  from gradio import processing_utils
5
+ # import torch
6
  import torchaudio
7
+ import yt_dlp
8
 
9
  model_root = './weights'
10
+ yt_dl_dir = 'yt-audio'
11
  available_models = ['speech', 'pop-music', 'classical-music']
12
  working_sr = 22050
13
 
 
17
  for weight in available_models
18
  }
19
 
20
+ def download_yt_audio(url):
21
+ # purge outdated audio files (older than 1 days)
22
+ os.system(f'find {yt_dl_dir} -audio -mtime +1 -delete')
23
+
24
+ ydl_opts = {
25
+ 'format': 'm4a/bestaudio/best',
26
+ 'postprocessors': [{ # Extract audio using ffmpeg
27
+ 'key': 'FFmpegExtractAudio',
28
+ 'preferredcodec': 'wav',
29
+ }],
30
+ 'outtmpl': f"{yt_dl_dir}/%(id)s.%(ext)s"
31
+ }
32
+
33
+ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
34
+ try:
35
+ ydl.cache.remove()
36
+ meta = ydl.extract_info(url, download=False)
37
+ audio_file = os.path.join(yt_dl_dir, meta['id'] + '.wav')
38
+ if not os.path.isfile(audio_file):
39
+ ydl.download(url)
40
+
41
+ except yt_dlp.DownloadError as error:
42
+ raise gr.Error(f'Failed to download from YouTube: {error}')
43
+
44
+ return audio_file
45
+
46
+
47
  def prepare_audio_file(rec, audio_file, yt_url):
48
  if rec is not None:
49
  return rec
50
  if audio_file is not None:
51
  return audio_file
52
  if yt_url != '':
53
+ return download_yt_audio(yt_url)
54
  else:
55
  raise gr.Error('No audio found!')
56
 
 
74
  # @@@@@@@ Start of the program @@@@@@@@
75
 
76
  models = prepare_models()
77
+ os.makedirs(yt_dl_dir, exist_ok=True)
78
 
79
  with gr.Blocks() as demo:
80
  gr.Markdown('# TSM-Net')
 
86
  with gr.Tab('From file'):
87
  audio_file_box = gr.Audio(label='Audio sample', type='filepath')
88
  with gr.Tab('From YouTube'):
89
+ yt_url_box = gr.Textbox(label='YouTube URL', placeholder='https://youtu.be/q6EoRBvdVPQ')
90
 
91
  rec_box.change(lambda: [None] * 2, outputs=[audio_file_box, yt_url_box])
92
  audio_file_box.change(lambda: [None] * 2, outputs=[rec_box, yt_url_box])
 
98
  # gr.Markdown('### Trim audio sample (sec)')
99
  with gr.Row():
100
  start_time_box = gr.Number(label='Start', value=0)
101
+ end_time_box = gr.Number(label='End', value=60)
102
  model_box = gr.Dropdown(label='Model weight', choices=available_models, value=available_models[0])
103
 
104
  submit_btn = gr.Button('Submit')
 
106
  with gr.Column():
107
  with gr.Accordion('Hint', open=False):
108
  gr.Markdown('You can find more settings under the **Fine-grained settings**')
109
+ gr.Markdown('- Waiting too long? Try to adjust the start/end timestamp')
110
  gr.Markdown('- Low audio quality? Try to switch to a proper model weight')
111
  outputs=gr.Audio(label='Output')
112