Aller au contenu
Se connecter

/docs · VoiceLab · Deep

Ce que mesure vraiment la décroissance après la parole

Nous avons construit un estimateur de réverbération bon marché à partir de la décroissance après chaque phrase, puis nous l’avons testé contre 24 pièces mesurées. Il ne mesure pas la réverbération. Voici les chiffres et ce que nous avons changé.

Mis à jour 27 sept. 2026


Le RT60 exige d’injecter un signal connu dans la pièce. Impossible sur un enregistrement déjà réalisé. Pour le contrôle qualité de la voix, nous avons donc construit un estimateur bon marché: mesurer l’énergie qui reste juste après la fin de chaque phrase, par rapport à la phrase elle-même. Une pièce vivante prolonge le son, une pièce traitée non.

Le 27 septembre 2026, nous avons testé cet estimateur contre des pièces dont le temps de réverbération avait réellement été mesuré. Il a échoué. Cette page présente la mesure, le test et ce que nous avons changé, car un résultat négatif reproductible vaut mieux qu’un tableau de seuils qui se lit bien.

La mesure

Trouver les transitions parole vers silence avec une simple porte d’énergie, puis lire l’enveloppe dans la traîne, par rapport au niveau à la transition.

function decayRatio(envelope, mask, hopSec) {
  const decays = [];
  for (let i = 1; i < mask.length - 30; i++) {
    if (mask[i - 1] && !mask[i]) {
      const peak = envelope[i - 1];
      if (peak < 1e-5) continue;
      const window = Math.min(30, Math.floor(0.6 / hopSec));
      let tail = 0;
      for (let k = 0; k < window; k++) tail += envelope[i + k];
      tail /= window;
      decays.push(tail / peak);
    }
  }
  return decays.reduce((a, b) => a + b, 0) / decays.length;
}

Le code n’a rien de faux. Le problème est ce que le chiffre était censé signifier.

Contre quoi nous l’avons testé

  • Des pièces réelles, sans bruit ajouté. Cinq phrases propres à travers 24 réponses impulsionnelles mesurées, avec des temps de réverbération de 0,18 à 1,71 s.
  • Du bruit avec et sans réverbération. 1 280 enregistrements, quatre environnements, rapports signal sur bruit de 20, 10, 5 et 0 dB, chacun avec et sans 0,5 s de réverbération.
  • Une reconstruction qui s’écartait du moteur de 0,0000 sur les 1 760 fichiers, pour que le résultat s’applique au code livré et non à une approximation.

Ce que disent les chiffres

QuestionExigenceRésultat
Suit-il le RT60 mesuré de pièces réelles? (Spearman)0,70 ou mieux0,06
Distingue-t-il réverbération et sec à 20 dB de SNR? (AUC)0,75 ou mieux0,52
La même question à 10 dB de SNR0,75 ou mieux0,55
Reste-t-il insensible au bruit seul? (AUC)entre 0,35 et 0,650,68

Une AUC de 0,5 est un tirage au sort. Le chiffre le plus parlant: une pièce de 1,71 s de réverbération obtient 0,175, une cabine de 0,18 s obtient 0,186. La pièce réverbérante passe donc sous la cabine.

La seule chose que la mesure fait de façon fiable, c’est augmenter avec le bruit de fond. C’est exactement le mauvais comportement pour quelque chose qui s’appelle “pièce”.

Pourquoi il échoue

Trois raisons, chacune réparable seule et insuffisantes ensemble:

  1. Le plancher de bruit est le 10e centile de tout le fichier. Quand le fond varie, le bruit dans une pause est bien au-dessus de ce centile, et l’écart est compté comme traîne.
  2. On ne vérifie pas que la traîne tombe encore dans la pause. La fenêtre va de 60 à 420 ms après la fin de la phrase, et après la fermeture des courts silences, beaucoup de pauses sont plus brèves. La mesure lit alors le début du mot suivant.
  3. L’échelle est fausse même sans ces deux points. Un RT60 réel de 0,5 s donne en théorie un rapport d’environ 0,09, sous la limite de 0,15 qui signifiait “Dry”. Une réverbération moyenne allait donc toujours être appelée sèche.

Avec un pas de 20 ms et les sauts de la parole elle-même, la décroissance après une phrase est trop grossière pour en extraire la réverbération. C’est une question de recherche, pas une petite réparation.

Ce qui a changé le 27 septembre 2026

  • L’étiquette Dry / Tight / Live / Reverberant a disparu de la sortie du moteur, sans valeur par défaut. Un champ toujours vide n’est pas une mesure à livrer.
  • La carte en langage clair conseillant de traiter la pièce a disparu, ainsi que la pénalité que ce chiffre appliquait au score d’intelligibilité. Cette pénalité sanctionnait deux fois un enregistrement bruité.
  • Le chiffre reste, sous le nom de ce qu’il mesure: énergie dans les pauses après la parole, bruit ou réverbération, sans les séparer. Lisez-le comme “ce qui reste dans les silences”, jamais comme un verdict sur la pièce.
  • Dans l’API et le serveur MCP, le champ s’appelle encore roomEchoScore. Renommer un champ publié casse les historiques enregistrés et les intégrations existantes: c’est une décision distincte, pas une partie de cette correction. La description, elle, dit ce qui est mesuré.

Ce qui répondrait vraiment à la question

Pour obtenir un chiffre de réverbération à partir du seul enregistrement, deux candidats honnêtes: une mesure sur le spectre de modulation comme le SRMR, ou un petit modèle entraîné sur des réponses impulsionnelles mesurées. Les deux se testent contre les mêmes 24 pièces.

La règle que nous nous sommes fixée: une nouvelle mesure ne peut s’appeler réverbération qu’après avoir passé ce test. En attendant, elle porte un nom qui décrit le calcul.

Pour aller plus loin

Ensuite dans VoiceLab docs

Mesurer avec un seul claquement combien de temps une pièce résonne →

Le profil room lit le temps de réverbération par bande d’octave à partir d’un claquement, d’un éclatement de ballon, d’une réponse impulsionnelle ou d’un balayage. Comment l’enregistrer, comment lire la réponse et jusqu’où les chiffres sont éprouvés.

More in VoiceLab docs