Alle artikelen

· Casimiro Ferreira· 9 min leestijd

Spraakkwaliteit meten zonder luisterpanel

  • speechonnxmetrics
  • TTS
  • ONNX
  • evaluation

Een ruisonderdrukkingsmodel brengt een nieuw checkpoint uit. Een TTS-stem wordt hertraind op meer data. Een stemklonings-pijplijn wisselt zijn vocoder. In elk geval moet iemand antwoorden: is de output beter of slechter dan voorheen? “Het klinkt beter voor mij” schaalt niet. Het breekt af zodra de taal er niet een is die u spreekt, zodra er twintig checkpoints te vergelijken zijn in plaats van twee, of zodra de wijziging bij elke commit gecontroleerd moet worden in plaats van eenmaal met de hand.

Het rigoureuze antwoord op “klinkt het beter” is een Mean Opinion Score (MOS): plaats de audio voor een panel van luisteraars, vraag elk om het 1 tot 5 te beoordelen, en middel de scores. MOS is de standaard spraakkwaliteitsmetriek precies omdat hij de vraag stelt die ertoe doet — zou een mens dit acceptabel vinden — in plaats van een benadering ervan. Het is ook duur. Een panel rekruteren, het consistent laten draaien, en het herhalen voor elke taal, elke opnameconditie en elke modelversie die een klein team uitbrengt, is niet iets waar een luisterpanel bij kan blijven.

speechonnxmetrics is een bibliotheek om dat oordeel te benaderen zonder panel, bij elke build. Ze groepeert haar metrieken in drie families, en de juiste familie kiezen voor de situatie is belangrijker dan welk individueel getal ook.

Drie families, drie vragen

No-reference MOS-schatters zijn neurale netwerken getraind om te voorspellen wat een luisterpanel zou zeggen, alleen op basis van de audio. Ze hebben geen schoon origineel nodig — alleen de output die u wilt beoordelen. Gebruik deze familie wanneer er geen ground truth is om mee te vergelijken: het scoren van de output van een TTS-systeem, of het controleren van een echte, al gedegradeerde opname na ruisonderdrukking.

Intrusieve metrieken hebben een bijpassende schone referentie nodig en meten de afstand tussen die en het gedegradeerde signaal. Gebruik deze familie wanneer u de degradatie zelf hebt gefabriceerd en nog steeds het schone origineel bezit: u voerde een bekend-goede opname door een codec, een bandbreedte-extensiemodel, of een stemconverter, en wilt weten hoe ver de output van de bron is afgeweken.

ASR-gebaseerde tekstmetrieken transcriberen de output met een spraakherkenner en vergelijken het transcript met de verwachte tekst. Dit vangt iets dat de andere twee families niet kunnen: audio die perfect natuurlijk en schoon klinkt maar de verkeerde woorden zegt. Een no-reference MOS-voorspeller beoordeelt natuurlijkheid, niet juistheid — een vloeiende verkeerde uitspraak scoort prima. Een intrusieve metriek heeft een referentie-golfvorm nodig, geen referentiezin. Alleen tekstvergelijking vangt een verkeerd woord.

De bibliotheek stelt dit alles bloot via één functie:

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")

Tekstmetrieken leven in een aparte module, speechonnxmetrics.asr, omdat ze strings vergelijken, geen audio — s.score() verzendt alleen metrieken die een golfvorm nemen.

No-reference MOS: de getallen lezen

Vier MOS-schatters worden geleverd, elk met waarden op een schaal van 1-5 waar hoger beter is — dezelfde schaal die een menselijk panel gebruikt:

metriekdimensiesgetraind opcommercieel gebruik
utmoséén natuurlijkheidsscoregesynthetiseerde spraak (VoiceMOS Challenge)ja
dnsmossig / bak / ovrl (spraakkwaliteit / achtergrondruis / algeheel)ITU-T P.835ja
dnsmos_p808één crowdsourced-luister-MOSITU-T P.808ja
sigmos7 dimensies (col, disc, loud, noise, reverb, sig, ovrl)ITU-T P.804ja
nisqamos plus noi/dis/col/loud-uitsplitsingNISQA-v2nee — CC BY-NC-SA 4.0

nisqa is de enige metriek in de hele bibliotheek met niet-commerciële gewichten. De andere vier zijn MIT-gelicentieerd. speechonnxmetrics filtert dit niet voor u; het vermeldt de licentie en laat de keuze aan de aanroeper.

Hier is wat echte audio scoort. Door de eigen meegeleverde fixtures van de bibliotheek te draaien — een schone opname (source.wav) en een neurale-codec-resynthese van dezelfde clip (facodec_aria.wav) — door UTMOS:

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

De schone opname landt dicht bij de top van de schaal, zoals het hoort — het is echte menselijke spraak, niet gesynthetiseerd. De codec-resynthese zakt meer dan een heel punt. Dat gat, meer dan een van beide getallen apart, is het bruikbare signaal: het vertelt u dat de codec hoorbare degradatie introduceert, en geeft u een getal om te volgen naarmate de codec wordt afgesteld.

DNSMOS op dezelfde schone opname:

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

Drie getallen, geen één, en ze divergeren — ovrl zit merkbaar onder zowel sig als bak. Die divergentie is informatief in plaats van een bug: ovrl is de P.835-beoordeling van de algehele luisterervaring, en die neigt ertoe een opname harder te straffen dan een van de componentscores alleen zou suggereren, vooral voor een opname uit de echte wereld in plaats van een studio-opname. Wanneer bak laag is, zoek naar achtergrondruis. Wanneer sig laag is, zoek naar artefacten op stemniveau — clipping, uitval, robotisch timbre. Rapporteer meer dan één voorspeller voor dezelfde clip: ze zijn getraind op verschillende data en zijn het op informatieve manieren oneens, en een groot gat tussen twee onafhankelijke voorspellers op dezelfde clip is een aanwijzing om te gaan luisteren.

Intrusieve metrieken: de getallen lezen

Elf referentiegebaseerde metrieken meten afstand van een schoon origineel. Degene die het eerst het kennen waard zijn:

metriekbereikrichtingmeet
stoi / estoi0–1hoger is betershort-time objective intelligibility — hoeveel van de inhoud overleeft, onafhankelijk van hoe natuurlijk het klinkt
si_sdr / sdr / snrdB, onbegrensdhoger is betersignaal-tot-vervorming / signaal-tot-ruis-verhouding
mcddB, onbegrensdlager is betermel-cepstrale vervorming — afstand van de spectrale envelope, een klassieke TTS/VC-kwaliteitsmetriek
log_f0_rmseonbegrensdlager is betertoonhoogtecontourfout
lsd / msddBlager is beterlog-spectrale / mel-spectrale afstand

Merk op dat de richting omslaat: STOI en de SDR-familie gaan omhoog wanneer de kwaliteit beter is; MCD, toonhoogtefout en spectrale afstand gaan omlaag. Ze door elkaar halen bij het lezen van een tabel is een makkelijke vergissing.

Dezelfde codec-resynthese scoren tegen zijn schone bron:

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

Een STOI van 0.66 op een schaal van 0-1 waar 1.0 een perfecte match is, zegt dat verstaanbaarheid een echte klap kreeg — dit is ver onder wat een licht verwerkte opname zou scoren. Een SI-SDR van ongeveer −27 dB bevestigt dit: SI-SDR is negatief wanneer de vervormingsenergie het signaal overtreft, en een groot negatief getal betekent zware structurele verandering, niet alleen toegevoegde ruis. Een MCD van 10.46 dB is hoog; gepubliceerde TTS-systemen die duidelijk synthetisch klinken maar toch sprekerconsistent zijn, landen doorgaans in enkele cijfers, dus 10+ wijst op substantiële spectrale-envelope-drift tussen de resynthese en het origineel.

ASR-gebaseerde metrieken: de getallen lezen

Vijf tekstmetrieken komen van één Levenshtein-alignering tussen een referentietranscript en een hypothese (waar de audio daadwerkelijk als getranscribeerd werd):

metriekbereikrichtingbetekenis
wer≥ 0 (meestal 0–1, kan 1 overschrijden)lager is beterword error rate: substituties + verwijderingen + invoegingen, gedeeld door het aantal referentiewoorden
cer0–1lager is beterhetzelfde idee op tekenniveau — vergevingsgezinder voor kleine spellings-/tokenisatie-mismatches
mer0–1lager is betermatch error rate
wil0–1lager is beterverloren woordinformatie
wip0–1hoger is beterbehouden woordinformatie (1 − wil)

Een uitgewerkt voorbeeld: referentie “the quick brown fox jumps over the lazy dog” tegen hypothese “the quick brown fox jumped over a lazy dog” (één substitutie, “jumps” → “jumped”, één verwijdering van “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

Een WER van 0.22 betekent dat ongeveer één op de vijf woorden fout is — merkbaar, de moeite van het beluisteren waard. CER is lager op hetzelfde paar omdat scoring op tekenniveau een substitutie van één woord behandelt als een handvol tekenbewerkingen binnen een veel langere tekenreeks, niet als een heel ontbrekend token; CER en WER beantwoorden verschillende vragen en zijn niet direct met elkaar vergelijkbaar. Een WER boven ongeveer 0.3–0.4 op natuurlijke spraak betekent meestal dat het ASR-systeem, of de audio die het transcribeert, een echt probleem heeft, geen afrondingsfout.

speechonnxmetrics normaliseert tekst nooit namens u — een ruwe vergelijking telt hoofdlettergebruik en interpunctie als fouten, wat zelden is wat u wilt wanneer u uitspraak beoordeelt in plaats van exacte transcriptopmaak. Geef expliciet een normalizer mee: BASIC zet om naar kleine letters en reduceert witruimte, STRICT breidt ook samentrekkingen uit en verwijdert diakritische tekens, interpunctie en stopwoorden.

De belangrijkste kanttekening

Elk no-reference MOS-getal in deze bibliotheek is een voorspelling van een model, geen meting van een feit. UTMOS, DNSMOS, SIGMOS en NISQA zijn elk getraind op een specifieke set luistertestdata, in specifieke talen en opnamecondities. Een voorspeller die vooral getraind is op Engelse studio-opnamen kan een taal die hij nooit tijdens training zag, een accent dat zijn trainingspanel nooit beoordeelde, of een opnameconditie — telefoonaudio, een lawaaierige kamer, een microfoon van lage kwaliteit — buiten zijn trainingsdistributie verkeerd beoordelen. Het model liegt niet; het extrapoleert, en extrapolatie vanuit onbekende inputs is waar neurale voorspellers het minst betrouwbaar zijn.

Behandel een voorspelde MOS als bewijs, niet als grondwaarheid. Het is betrouwbaar voor waar het goed in is: grote regressies opvangen, meerdere kandidaten tegen elkaar rangschikken, en een run signaleren die een mens echt moet beluisteren. Het is geen vervanging voor een echt luisterpanel wanneer een beslissing veel op het spel zet, en het zou niet het laatste woord moeten zijn over een taal of conditie waarop het onderliggende model niet getraind is om te beoordelen. Meerdere voorspellers samen rapporteren, en onenigheid tussen hen behandelen als een aanleiding om te luisteren in plaats van ruis om weg te middelen, is de praktische verzachting.

Waarom dit is wat een vergelijking bruikbaar maakt

Niets hiervan is nuttig op zichzelf. Het wordt nuttig op het moment dat meerdere engines op dezelfde voet vergeleken moeten worden — welke TTS-engine, welke STT-engine, welk verbeteringsmodel als standaard te gebruiken. De pure-ONNX-spraakbibliotheken die speechonnxmetrics gebouwd werd om te evalueren — TTS, ASR, ruisonderdrukking, stemklonen — publiceren vergelijkingen per engine geproduceerd met precies de metrieken hierboven: no-reference MOS voor systemen zonder ground truth, intrusieve metrieken waar een schone referentie bestaat, WER/CER overal waar de juistheid van het transcript in het geding is. Dat is wat “we kozen deze engine” verandert in een getal dat iemand anders kan controleren.

Als uw project een taal, een engine of een opnameconditie nodig heeft die op deze manier geëvalueerd moet worden en dat nog niet gedekt is, neem dan contact op of bekijk onze diensten.