zonza/audio_level.py
Ralph Mayola 22080eb997 Zonza : dictée vocale locale macOS (MLX-Whisper + cercle pulsant)
Reconstruction propre de l'ancien projet Dictée. Bundle id neuf
(cloud.mrtechlab.zonza), chemin de build unique vers /Applications
(plus jamais de builds /tmp enregistrés dans LaunchServices).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 23:57:59 +02:00

31 lines
1.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Pont audio → animation : calcule un niveau de volume normalisé.
Unité pure (numpy seulement) — aucune dépendance matérielle, testable sans micro.
"""
import numpy as np
def compute_rms(frames):
"""Niveau RMS d'un bloc audio float32, normalisé et borné dans [0.0, 1.0].
frames : tableau numpy 1-D d'échantillons float32 (typiquement dans [-1, 1]).
Retourne 0.0 pour un bloc vide ou silencieux.
"""
if frames.size == 0:
return 0.0
rms = float(np.sqrt(np.mean(np.square(frames, dtype="float64"))))
return min(1.0, max(0.0, rms))
def shape_level(rms, gain):
"""Met en forme un niveau RMS brut pour l'animation : amplifie et borne dans [0, 1].
Les RMS vocaux sont faibles (~0.020.15) ; appliqués tels quels, le cercle bouge à
peine. On applique un gain puis une courbe en racine carrée : les niveaux faibles sont
boostés (forte réactivité à voix normale) tout en restant bornés à 1.0 (pas de
saturation visuelle). gain=0 → toujours 0 (aucune réaction).
"""
boosted = max(0.0, rms) * gain
shaped = boosted ** 0.5
return min(1.0, max(0.0, shaped))