ffmpeg pre-convert inputs to wav (torchaudio 2.0 cannot decode m4a); show_error
Browse files
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)
|