ccyyss commited on
Commit
cd06905
·
verified ·
1 Parent(s): 962c1fb

ffmpeg pre-convert inputs to wav (torchaudio 2.0 cannot decode m4a); show_error

Browse files
Files changed (1) hide show
  1. app.py +24 -2
app.py CHANGED
@@ -4,7 +4,10 @@
4
  上传带噪音频(口播、讲座录音等),输出降噪后的 wav。
5
  模型在首次请求时加载并缓存,之后常驻内存。
6
  """
 
 
7
  import threading
 
8
 
9
  import gradio as gr
10
 
@@ -24,13 +27,32 @@ def get_model():
24
  return _model, _df_state
25
 
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  def denoise(audio_path):
28
  if not audio_path:
29
  return None
30
  from df.enhance import enhance, load_audio, save_audio
31
 
32
  model, df_state = get_model()
33
- audio, _ = load_audio(audio_path, sr=df_state.sr())
34
  enhanced = enhance(model, df_state, audio)
35
  out = "/tmp/enhanced.wav"
36
  save_audio(out, enhanced, df_state.sr())
@@ -50,4 +72,4 @@ with gr.Blocks(title="音频降噪增强") as demo:
50
 
51
 
52
  if __name__ == "__main__":
53
- demo.launch()
 
4
  上传带噪音频(口播、讲座录音等),输出降噪后的 wav。
5
  模型在首次请求时加载并缓存,之后常驻内存。
6
  """
7
+ import shutil
8
+ import subprocess
9
  import threading
10
+ import uuid
11
 
12
  import gradio as gr
13
 
 
27
  return _model, _df_state
28
 
29
 
30
+ def to_wav(audio_path):
31
+ """把任意格式(m4a/mp3/flac 等)经 ffmpeg 转成 48k 单声道 wav。
32
+
33
+ df 自带的 torchaudio 2.0 sox 后端解不了 m4a/AAC,这是报错的根源。
34
+ 若容器里没有 ffmpeg,则原样返回,让 load_audio 自己试。
35
+ """
36
+ if shutil.which("ffmpeg") is None:
37
+ return audio_path
38
+ out = f"/tmp/conv_{uuid.uuid4().hex}.wav"
39
+ r = subprocess.run(
40
+ ["ffmpeg", "-y", "-v", "error", "-i", audio_path, "-ar", "48000", "-ac", "1", out],
41
+ capture_output=True,
42
+ text=True,
43
+ )
44
+ if r.returncode != 0:
45
+ raise gr.Error(f"音频转码失败:{r.stderr.strip()[-300:]}")
46
+ return out
47
+
48
+
49
  def denoise(audio_path):
50
  if not audio_path:
51
  return None
52
  from df.enhance import enhance, load_audio, save_audio
53
 
54
  model, df_state = get_model()
55
+ audio, _ = load_audio(to_wav(audio_path), sr=df_state.sr())
56
  enhanced = enhance(model, df_state, audio)
57
  out = "/tmp/enhanced.wav"
58
  save_audio(out, enhanced, df_state.sr())
 
72
 
73
 
74
  if __name__ == "__main__":
75
+ demo.launch(show_error=True)