Qualité de transcription : audio propre pour le moteur (corrige les erreurs)

L'AGC sur-amplifiait (jusqu'à x60) l'audio envoyé au moteur -> signal
déformé/bruité -> mauvaise reconnaissance. Désormais :
- Le VAD détecte sur l'audio amplifié, mais le segment stocke l'audio BRUT
- Le segment est normalisé proprement (mise à l'échelle linéaire unique vers
  crête ~22000, sans saturation) juste avant le moteur
- Segment max ramené de 25 s à 15 s pour un retour plus rapide
Validé bout en bout : micro faible -> détecté -> audio propre -> transcrit.

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
This commit is contained in:
Claude committed 2026-06-13 15:45:33 +00:00
1 parent 55ccef1340
commit 1e72e82965
2 files changed
+26 -15

No files matched your search

+16 -7
View File
@@ -189,19 +189,28 @@ def pcm_to_wav(pcm: bytes) -> bytes:
return buf.getvalue()
QUIET_PEAK = 9000 # niveau crête en dessous duquel on amplifie (échelle int16)
NORM_TARGET_PEAK = 22000 # niveau crête visé (≈0,67 pleine échelle), sans saturer
NORM_MAX_GAIN = 25.0 # amplification maximale
NORM_NOISE_FLOOR = 80 # en dessous : silence, on ne touche pas
def boost_quiet_audio(pcm: bytes) -> tuple[bytes, int]:
"""Amplifie les segments trop faibles (micros Bluetooth mains-libres...).
"""Normalise proprement le niveau du segment pour le moteur ASR.
Retourne (audio, niveau crête d'origine).
Mise à l'échelle linéaire unique du segment entier vers un niveau cible
confortable, SANS saturation (gain = cible / crête), bien meilleure pour
la reconnaissance qu'une amplification par à-coups. Renvoie (audio, crête).
"""
peak = audioop.max(pcm, 2)
if 0 < peak < QUIET_PEAK:
factor = min(6.0, 26000 / peak)
return audioop.mul(pcm, 2, factor), peak
return pcm, peak
if peak < NORM_NOISE_FLOOR:
return pcm, peak
gain = min(NORM_MAX_GAIN, NORM_TARGET_PEAK / peak)
if gain <= 1.05:
return pcm, peak
try:
return audioop.mul(pcm, 2, gain), peak
except Exception:
return pcm, peak
async def _post_transcription(data: dict, wav: bytes) -> httpx.Response: