minhahwang Copilot commited on
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 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 = 24000
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 > 1.0:
172
- waveform = waveform / peak * 0.95
173
- elif peak < 0.01:
174
- waveform = None # Too quiet, likely garbage
 
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
- sf.write(str(path), wav, sample_rate, subtype='FLOAT')
 
 
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