Spaces:
Paused
Paused
Commit ·
60d60e5
1
Parent(s): af03300
fix: correct LFM audio sample rate to 48kHz and normalize volume
Browse files- SAMPLE_RATE 24000 -> 48000 (codec outputs 1920 samples/frame × 25 fps)
- Always normalize to 0.9 peak (was only scaling down, causing quiet output)
- Save answer WAV as PCM_16 for universal compatibility
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- inference_lfm.py +6 -6
- qa_flow.py +3 -2
- test_lfm_48k.wav +3 -0
- test_lfm_local.wav +3 -0
- test_lfm_normalized.wav +3 -0
inference_lfm.py
CHANGED
|
@@ -18,7 +18,7 @@ _model = None
|
|
| 18 |
_model_lock = threading.Lock()
|
| 19 |
|
| 20 |
HF_REPO = "LiquidAI/LFM2.5-Audio-1.5B"
|
| 21 |
-
SAMPLE_RATE =
|
| 22 |
|
| 23 |
|
| 24 |
def _select_device() -> torch.device:
|
|
@@ -163,15 +163,15 @@ def answer_question_audio(
|
|
| 163 |
with GPU_INFERENCE_LOCK, torch.inference_mode():
|
| 164 |
waveform_tensor = processor.decode(audio_codes)
|
| 165 |
waveform = waveform_tensor.detach().cpu().float().numpy().squeeze()
|
| 166 |
-
# Normalize to [-1, 1] range to prevent clipping/distortion
|
| 167 |
if waveform.ndim == 0:
|
| 168 |
waveform = None
|
| 169 |
elif len(waveform) > 0:
|
| 170 |
peak = np.abs(waveform).max()
|
| 171 |
-
if peak
|
| 172 |
-
waveform =
|
| 173 |
-
|
| 174 |
-
|
|
|
|
| 175 |
except Exception as e:
|
| 176 |
logger.warning("Audio decode failed: %s", e)
|
| 177 |
waveform = None
|
|
|
|
| 18 |
_model_lock = threading.Lock()
|
| 19 |
|
| 20 |
HF_REPO = "LiquidAI/LFM2.5-Audio-1.5B"
|
| 21 |
+
SAMPLE_RATE = 48000 # Codec outputs 1920 samples/frame at 25 frames/sec = 48kHz
|
| 22 |
|
| 23 |
|
| 24 |
def _select_device() -> torch.device:
|
|
|
|
| 163 |
with GPU_INFERENCE_LOCK, torch.inference_mode():
|
| 164 |
waveform_tensor = processor.decode(audio_codes)
|
| 165 |
waveform = waveform_tensor.detach().cpu().float().numpy().squeeze()
|
|
|
|
| 166 |
if waveform.ndim == 0:
|
| 167 |
waveform = None
|
| 168 |
elif len(waveform) > 0:
|
| 169 |
peak = np.abs(waveform).max()
|
| 170 |
+
if peak < 0.001:
|
| 171 |
+
waveform = None # Silent, likely garbage
|
| 172 |
+
else:
|
| 173 |
+
# Always normalize to target peak (0.9) for consistent volume
|
| 174 |
+
waveform = waveform * (0.9 / peak)
|
| 175 |
except Exception as e:
|
| 176 |
logger.warning("Audio decode failed: %s", e)
|
| 177 |
waveform = None
|
qa_flow.py
CHANGED
|
@@ -70,9 +70,10 @@ def _default_audio_writer(path: Path, waveform, sample_rate: int) -> None:
|
|
| 70 |
import soundfile as sf
|
| 71 |
import numpy as np
|
| 72 |
|
| 73 |
-
# Ensure float32 for proper WAV encoding
|
| 74 |
wav = np.asarray(waveform, dtype=np.float32)
|
| 75 |
-
|
|
|
|
|
|
|
| 76 |
|
| 77 |
|
| 78 |
def _prune_generated_answers(output_dir: Path) -> None:
|
|
|
|
| 70 |
import soundfile as sf
|
| 71 |
import numpy as np
|
| 72 |
|
|
|
|
| 73 |
wav = np.asarray(waveform, dtype=np.float32)
|
| 74 |
+
# Clip to [-1, 1] before writing as PCM_16 for universal compatibility
|
| 75 |
+
wav = np.clip(wav, -1.0, 1.0)
|
| 76 |
+
sf.write(str(path), wav, sample_rate, subtype='PCM_16')
|
| 77 |
|
| 78 |
|
| 79 |
def _prune_generated_answers(output_dir: Path) -> None:
|
test_lfm_48k.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7af76a2ec139419c4f5ffdd4d0eb41b40ed0709faa1c3405541aa60969755935
|
| 3 |
+
size 503084
|
test_lfm_local.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:8237b2b464343d4b4f00a6e8e573f17cdf7589f1671903e0927bfd1429855670
|
| 3 |
+
size 503084
|
test_lfm_normalized.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:fdbdc9d071ff8976805a1808df663754579807f6663762165d12cfdc47f0b4b9
|
| 3 |
+
size 503084
|