Tous les articles

· Casimiro Ferreira· 10 min de lecture

Mesurer la qualité de la parole sans panel d'écoute

  • speechonnxmetrics
  • TTS
  • ONNX
  • evaluation

Un modèle de débruitage publie un nouveau checkpoint. Une voix TTS est réentraînée sur plus de données. Un pipeline de clonage vocal change de vocodeur. Dans chaque cas, quelqu’un doit répondre : la sortie est-elle meilleure ou pire qu’avant ? « Ça me semble meilleur » ne passe pas à l’échelle. Ça s’effondre dès que la langue n’est pas une que vous parlez, dès qu’il y a vingt checkpoints à comparer au lieu de deux, ou dès que le changement doit être vérifié à chaque commit plutôt qu’une fois à la main.

La réponse rigoureuse à « est-ce que ça sonne mieux » est un Mean Opinion Score (MOS) : placer l’audio devant un panel d’auditeurs, demander à chacun de le noter de 1 à 5, et moyenner les scores. Le MOS est la métrique de qualité de parole standard précisément parce qu’elle pose la question qui compte — un humain trouverait-il cela acceptable — plutôt qu’une approximation. C’est aussi coûteux. Recruter un panel, le faire tourner de manière cohérente, et répéter l’opération pour chaque langue, chaque condition d’enregistrement et chaque version de modèle qu’une petite équipe publie n’est pas quelque chose qu’un panel d’écoute peut suivre.

speechonnxmetrics est une bibliothèque pour approximer ce jugement sans panel, à chaque build. Elle regroupe ses métriques en trois familles, et choisir la bonne famille pour la situation compte plus que n’importe quel nombre individuel.

Trois familles, trois questions

Les estimateurs MOS sans référence sont des réseaux de neurones entraînés à prédire ce que dirait un panel d’écoute, à partir de l’audio seul. Ils n’ont besoin d’aucun original propre — seulement de la sortie que vous voulez juger. Utilisez cette famille quand il n’y a pas de vérité terrain à laquelle vous comparer : noter la sortie d’un système TTS, ou vérifier un enregistrement réel déjà dégradé après débruitage.

Les métriques intrusives ont besoin d’une référence propre correspondante et mesurent la distance entre elle et le signal dégradé. Utilisez cette famille quand vous avez fabriqué vous-même la dégradation et détenez encore l’original propre : vous avez fait passer un enregistrement connu comme bon à travers un codec, un modèle d’extension de bande passante, ou un convertisseur de voix, et voulez savoir à quel point la sortie s’est éloignée de la source.

Les métriques textuelles basées sur l’ASR transcrivent la sortie avec un système de reconnaissance vocale et comparent la transcription au texte attendu. Cela capture quelque chose que les deux autres familles ne peuvent pas : un audio qui sonne parfaitement naturel et propre mais qui dit les mauvais mots. Un prédicteur MOS sans référence note le naturel, pas l’exactitude — une mauvaise prononciation fluide obtient un bon score. Une métrique intrusive a besoin d’une forme d’onde de référence, pas d’une phrase de référence. Seule la comparaison de texte capture un mot erroné.

La bibliothèque expose tout cela via une seule fonction :

import speechonnxmetrics as s

# No-reference: only the output needed, no ground truth exists
s.score("output.wav", ["utmos"])

# Intrusive: needs a clean reference, ref= is required
s.score("degraded.wav", ["stoi", "mcd", "si_sdr"], ref="clean.wav")

Les métriques textuelles vivent dans un module séparé, speechonnxmetrics.asr, parce qu’elles comparent des chaînes, pas de l’audio — s.score() ne répartit que les métriques qui prennent une forme d’onde.

MOS sans référence : lire les nombres

Quatre estimateurs MOS sont livrés, chacun retournant des valeurs sur une échelle de 1 à 5 où plus haut est meilleur — la même échelle qu’utilise un panel humain :

métriquedimensionsentraîné surusage commercial
utmosun score de naturelparole synthétisée (VoiceMOS Challenge)oui
dnsmossig / bak / ovrl (qualité de la parole / bruit de fond / global)ITU-T P.835oui
dnsmos_p808un MOS d’écoute crowdsourcéeITU-T P.808oui
sigmos7 dimensions (col, disc, loud, noise, reverb, sig, ovrl)ITU-T P.804oui
nisqamos plus décomposition noi/dis/col/loudNISQA-v2non — CC BY-NC-SA 4.0

nisqa est la seule métrique de toute la bibliothèque aux poids non-commerciaux. Les quatre autres sont sous licence MIT. speechonnxmetrics ne filtre pas cela pour vous ; elle déclare la licence et laisse le choix à l’appelant.

Voici ce que notent de vrais audios. En faisant tourner les propres fixtures embarquées de la bibliothèque — un enregistrement propre (source.wav) et une resynthèse par codec neuronal du même clip (facodec_aria.wav) — à travers UTMOS :

>>> s.score("source.wav", ["utmos"])
{'utmos': 4.41}
>>> s.score("facodec_aria.wav", ["utmos"])
{'utmos': 3.21}

L’enregistrement propre se situe près du haut de l’échelle, comme il se doit — c’est de la vraie parole humaine, pas synthétisée. La resynthèse par codec chute de plus d’un point complet. Cet écart, plus que l’un ou l’autre nombre isolément, est le signal utile : il indique que le codec introduit une dégradation audible, et donne un nombre à suivre à mesure que le codec est ajusté.

DNSMOS sur le même enregistrement propre :

>>> s.score("source.wav", ["dnsmos"])
{'dnsmos.sig': 3.45, 'dnsmos.bak': 3.60, 'dnsmos.ovrl': 2.93}

Trois nombres, pas un, et ils divergent — ovrl se situe nettement en dessous de sig et bak. Cette divergence est informative plutôt qu’un bug : ovrl est la note P.835 de l’expérience d’écoute globale, et elle tend à pénaliser un enregistrement plus durement que ne le suggérerait n’importe lequel des scores composants seul, surtout pour un enregistrement du monde réel plutôt qu’un enregistrement de studio. Quand bak est bas, cherchez du bruit de fond. Quand sig est bas, cherchez des artefacts au niveau de la voix — écrêtage, coupures, timbre robotique. Rapportez plusieurs prédicteurs pour le même clip : ils sont entraînés sur des données différentes et divergent de manière informative, et un large écart entre deux prédicteurs indépendants sur le même clip est une invite à aller écouter.

Métriques intrusives : lire les nombres

Onze métriques référencées mesurent la distance par rapport à un original propre. Celles à connaître en premier :

métriqueplagedirectionmesure
stoi / estoi0–1plus haut est meilleurintelligibilité objective à court terme — quelle proportion du contenu survit, indépendamment du naturel
si_sdr / sdr / snrdB, non bornéplus haut est meilleurrapport signal-distorsion / signal-bruit
mcddB, non bornéplus bas est meilleurdistorsion mel-cepstrale — distance de l’enveloppe spectrale, une métrique classique de qualité TTS/VC
log_f0_rmsenon bornéplus bas est meilleurerreur du contour de hauteur
lsd / msddBplus bas est meilleurdistance log-spectrale / mel-spectrale

Notez que le sens s’inverse : STOI et la famille SDR montent quand la qualité s’améliore ; MCD, l’erreur de hauteur et la distance spectrale descendent. Les confondre en lisant un tableau est une erreur facile.

Noter la même resynthèse par codec par rapport à sa source propre :

>>> s.score("facodec_aria.wav", ["stoi", "mcd", "si_sdr"], ref="source.wav")
{'stoi': 0.662, 'mcd': 10.46, 'si_sdr': -26.94}

Un STOI de 0.66 sur une échelle de 0 à 1 où 1.0 est une correspondance parfaite indique que l’intelligibilité a subi un vrai coup — c’est bien en dessous de ce que noterait un enregistrement légèrement traité. Un SI-SDR d’environ −27 dB le confirme : le SI-SDR est négatif dès que l’énergie de distorsion dépasse le signal, et un grand nombre négatif signifie un changement structurel lourd, pas seulement du bruit ajouté. Un MCD de 10.46 dB est élevé ; les systèmes TTS publiés qui sonnent clairement synthétiques mais restent cohérents en termes de locuteur se situent typiquement à un chiffre, donc 10+ pointe vers une dérive substantielle de l’enveloppe spectrale entre la resynthèse et l’original.

Métriques basées sur l’ASR : lire les nombres

Cinq métriques textuelles proviennent d’un alignement de Levenshtein entre une transcription de référence et une hypothèse (ce que l’audio a réellement été transcrit comme étant) :

métriqueplagedirectionsignification
wer≥ 0 (généralement 0–1, peut dépasser 1)plus bas est meilleurtaux d’erreur au mot : substitutions + suppressions + insertions, divisé par le nombre de mots de référence
cer0–1plus bas est meilleurla même idée au niveau du caractère — plus indulgent face aux petits désaccords d’orthographe/tokenisation
mer0–1plus bas est meilleurtaux d’erreur de correspondance
wil0–1plus bas est meilleurinformation de mot perdue
wip0–1plus haut est meilleurinformation de mot préservée (1 − wil)

Un exemple travaillé : référence « the quick brown fox jumps over the lazy dog » contre hypothèse « the quick brown fox jumped over a lazy dog » (une substitution, « jumps » → « jumped », une suppression de « the ») :

>>> from speechonnxmetrics import asr
>>> from speechonnxmetrics.asr import BASIC
>>> asr.wer(reference, hypothesis, normalizer=BASIC)
0.222
>>> asr.cer(reference, hypothesis, normalizer=BASIC)
0.116

Un WER de 0.22 signifie qu’environ un mot sur cinq est faux — notable, mérite d’être écouté. Le CER est plus bas sur la même paire parce que la notation au niveau du caractère traite une substitution d’un mot comme une poignée d’éditions de caractères à l’intérieur d’une chaîne bien plus longue, pas comme tout un token manquant ; CER et WER répondent à des questions différentes et ne sont pas directement comparables l’un à l’autre. Un WER au-dessus d’environ 0.3–0.4 sur de la parole naturelle signifie généralement que le système ASR, ou l’audio qu’il transcrit, a un vrai problème, pas une erreur d’arrondi.

speechonnxmetrics ne normalise jamais le texte à votre place — une comparaison brute compte la casse et la ponctuation comme des erreurs, ce qui est rarement ce que vous voulez quand vous notez la prononciation plutôt que le formatage exact de la transcription. Passez un normaliseur explicitement : BASIC met en minuscules et réduit les espaces, STRICT développe aussi les contractions et retire les diacritiques, la ponctuation et les mots de remplissage.

La mise en garde la plus importante

Chaque nombre MOS sans référence de cette bibliothèque est une prédiction d’un modèle, pas la mesure d’un fait. UTMOS, DNSMOS, SIGMOS et NISQA ont chacun été entraînés sur un jeu spécifique de données de tests d’écoute, dans des langues et des conditions d’enregistrement spécifiques. Un prédicteur entraîné surtout sur des enregistrements de studio en anglais peut mal juger une langue qu’il n’a jamais vue à l’entraînement, un accent que son panel d’entraînement n’a jamais noté, ou une condition d’enregistrement — audio téléphonique, pièce bruyante, microphone bas de gamme — en dehors de sa distribution d’entraînement. Le modèle ne ment pas ; il extrapole, et l’extrapolation à partir d’entrées inconnues est là où les prédicteurs neuronaux sont les moins fiables.

Traitez un MOS prédit comme une preuve, pas comme une vérité terrain. Il est digne de confiance pour ce en quoi il excelle : détecter de grandes régressions, classer plusieurs candidats les uns contre les autres, et signaler une exécution qui nécessite qu’un humain écoute réellement. Ce n’est pas un substitut à un vrai panel d’écoute quand une décision est critique, et cela ne devrait pas avoir le dernier mot sur une langue ou une condition que le modèle sous-jacent n’a pas été entraîné à juger. Rapporter plusieurs prédicteurs ensemble, et traiter leur désaccord comme une invite à écouter plutôt que du bruit à moyenner, est le palliatif pratique.

Pourquoi c’est ce qui rend une comparaison utilisable

Rien de tout cela n’est utile isolément. Cela devient utile au moment où plusieurs moteurs doivent être comparés sur un pied d’égalité — quel moteur TTS, quel moteur STT, quel modèle d’amélioration adopter par défaut. Les bibliothèques de parole en ONNX pur que speechonnxmetrics a été construite pour évaluer — TTS, ASR, débruitage, clonage vocal — publient des comparaisons par moteur produites avec exactement les métriques ci-dessus : MOS sans référence pour les systèmes sans vérité terrain, métriques intrusives là où une référence propre existe, WER/CER partout où la justesse de la transcription est en question. C’est ce qui transforme « nous avons choisi ce moteur » en un nombre que quelqu’un d’autre peut vérifier.

Si votre projet a besoin d’une langue, d’un moteur ou d’une condition d’enregistrement évalués de cette manière et que ce n’est pas encore couvert, contactez-nous ou consultez nos services.