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
Files changed (2) hide show
  1. app.py +14 -7
  2. 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
- audio, sr = torchaudio.load(str(wav))
50
- audio = audio.mean(0)
 
 
51
  if sr != 16000:
52
- audio = torchaudio.functional.resample(audio, sr, 16000)
 
 
53
 
54
- total = audio.numel() / 16000
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)].numpy()
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
- inputs = tokenizer(text, return_tensors="pt")
 
111
  with torch.inference_mode():
112
  audio = model(**inputs).waveform.cpu()
113
- torchaudio.save(str(wav), audio, model.config.sampling_rate)
 
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