Claw commited on
Commit ·
0e16ab7
1
Parent(s): aaa842f
Fix: use soundfile for audio I/O (avoid torchcodec), add attention_mask for TTS, add soundfile dep
Browse files- app.py +14 -7
- requirements.txt +1 -0
app.py
CHANGED
|
@@ -6,6 +6,7 @@ from pathlib import Path
|
|
| 6 |
|
| 7 |
import gradio as gr
|
| 8 |
import torch
|
|
|
|
| 9 |
import torchaudio
|
| 10 |
from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq
|
| 11 |
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
|
|
@@ -46,17 +47,21 @@ def load_asr():
|
|
| 46 |
|
| 47 |
def transcribe(wav):
|
| 48 |
processor, model = load_asr()
|
| 49 |
-
|
| 50 |
-
audio =
|
|
|
|
|
|
|
| 51 |
if sr != 16000:
|
| 52 |
-
audio = torchaudio.functional.resample(
|
|
|
|
|
|
|
| 53 |
|
| 54 |
-
total =
|
| 55 |
pieces = []
|
| 56 |
chunk = 30
|
| 57 |
|
| 58 |
for start in range(0, int(total + 0.999), chunk):
|
| 59 |
-
x = audio[start*16000:min(int(total*16000),(start+chunk)*16000)]
|
| 60 |
if len(x) < 400:
|
| 61 |
continue
|
| 62 |
inputs = processor(x, sampling_rate=16000, return_tensors="pt")
|
|
@@ -107,10 +112,12 @@ def load_tts():
|
|
| 107 |
|
| 108 |
def tts(text, wav):
|
| 109 |
tokenizer, model = load_tts()
|
| 110 |
-
|
|
|
|
| 111 |
with torch.inference_mode():
|
| 112 |
audio = model(**inputs).waveform.cpu()
|
| 113 |
-
torchaudio.save(
|
|
|
|
| 114 |
|
| 115 |
def fit_audio(src, dst, target):
|
| 116 |
target = max(float(target), 0.1)
|
|
|
|
| 6 |
|
| 7 |
import gradio as gr
|
| 8 |
import torch
|
| 9 |
+
import soundfile as sf
|
| 10 |
import torchaudio
|
| 11 |
from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq
|
| 12 |
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
|
|
|
|
| 47 |
|
| 48 |
def transcribe(wav):
|
| 49 |
processor, model = load_asr()
|
| 50 |
+
# Use soundfile to load (avoids torchcodec issues)
|
| 51 |
+
audio, sr = sf.read(str(wav))
|
| 52 |
+
if len(audio.shape) > 1:
|
| 53 |
+
audio = audio.mean(axis=1)
|
| 54 |
if sr != 16000:
|
| 55 |
+
audio = torchaudio.functional.resample(
|
| 56 |
+
torch.from_numpy(audio).float(), sr, 16000
|
| 57 |
+
).numpy()
|
| 58 |
|
| 59 |
+
total = len(audio) / 16000
|
| 60 |
pieces = []
|
| 61 |
chunk = 30
|
| 62 |
|
| 63 |
for start in range(0, int(total + 0.999), chunk):
|
| 64 |
+
x = audio[start*16000:min(int(total*16000),(start+chunk)*16000)]
|
| 65 |
if len(x) < 400:
|
| 66 |
continue
|
| 67 |
inputs = processor(x, sampling_rate=16000, return_tensors="pt")
|
|
|
|
| 112 |
|
| 113 |
def tts(text, wav):
|
| 114 |
tokenizer, model = load_tts()
|
| 115 |
+
# Add attention_mask to avoid warning
|
| 116 |
+
inputs = tokenizer(text, return_tensors="pt", padding=True)
|
| 117 |
with torch.inference_mode():
|
| 118 |
audio = model(**inputs).waveform.cpu()
|
| 119 |
+
# Use soundfile instead of torchaudio.save (avoids torchcodec)
|
| 120 |
+
sf.write(str(wav), audio.squeeze().numpy(), model.config.sampling_rate)
|
| 121 |
|
| 122 |
def fit_audio(src, dst, target):
|
| 123 |
target = max(float(target), 0.1)
|
requirements.txt
CHANGED
|
@@ -5,3 +5,4 @@ transformers>=4.48,<5
|
|
| 5 |
sentencepiece>=0.2
|
| 6 |
safetensors>=0.4
|
| 7 |
numpy<2.3
|
|
|
|
|
|
| 5 |
sentencepiece>=0.2
|
| 6 |
safetensors>=0.4
|
| 7 |
numpy<2.3
|
| 8 |
+
soundfile>=0.12
|