/docs · VoiceLab · Deep
Wat het envelope-verval na spraak werkelijk meet
We bouwden een goedkope galmschatter uit het verval na elke frase en toetsten hem tegen 24 gemeten ruimtes. Hij meet geen galm. Hier staan de cijfers en wat we hebben veranderd.
Bijgewerkt 27 sep 2026
RT60 vraagt om een bekend signaal in de ruimte. Dat kan niet op een opname die iemand al gemaakt heeft, dus voor spraak-QA bouwden we een goedkope schatter: meet hoeveel energie er net na het einde van elke frase nog staat, tegen de frase zelf. Een levendige ruimte galmt na, een behandelde niet.
Op 27 september 2026 hebben we die schatter getoetst tegen ruimtes waarvan de nagalmtijd echt gemeten is. Hij zakte. Deze pagina is de meting, de toets, en wat we hebben veranderd, want een negatief resultaat dat na te rekenen is, is meer waard dan een drempeltabel die lekker leest.
De meting
Zoek de overgangen van spraak naar stilte met een simpele energiepoort en lees daarna de envelope in de staart, tegen het niveau op de overgang.
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;
}
Aan de code is niets mis. Het probleem is wat het getal zou betekenen.
Waartegen we hem getoetst hebben
- Echte ruimtes, zonder toegevoegde ruis. Vijf schone zinnen door 24 gemeten impulsresponsies, met nagalmtijden van 0,18 tot 1,71 s.
- Ruis met en zonder galm. 1.280 opnames, vier omgevingen, signaal-ruisverhoudingen van 20, 10, 5 en 0 dB, elk met en zonder 0,5 s galm.
- Een herbouw die 0,0000 van de engine afweek op alle 1.760 bestanden, zodat de uitkomst geldt voor de code die draait en niet voor een benadering ervan.
Wat de cijfers zeiden
| Vraag | Eis | Uitkomst |
|---|---|---|
| Volgt hij de gemeten RT60 van echte ruimtes? (Spearman) | 0,70 of beter | 0,06 |
| Scheidt hij galm van droog bij 20 dB SNR? (AUC) | 0,75 of beter | 0,52 |
| Dezelfde vraag bij 10 dB SNR | 0,75 of beter | 0,55 |
| Blijft hij onbewogen door alleen ruis? (AUC) | tussen 0,35 en 0,65 | 0,68 |
Een AUC van 0,5 is munt of kop. Het duidelijkste losse cijfer: een ruimte met 1,71 s nagalm kwam uit op 0,175, een cabine met 0,18 s op 0,186. De galmende ruimte scoorde dus lager dan de cabine.
Het enige wat de maat betrouwbaar doet, is oplopen met achtergrondruis. Dat is precies het verkeerde gedrag voor iets wat “ruimte” heet.
Waarom hij zakt
Drie redenen, elk los te repareren en samen niet genoeg:
- De ruisvloer is het 10e percentiel van het hele bestand. Bij wisselende achtergrond ligt de ruis in een pauze ruim boven dat percentiel, en dat verschil wordt als staart geteld.
- Er wordt niet gecontroleerd of de staart nog in de pauze valt. Het venster loopt van 60 tot 420 ms na het einde van de frase, en nadat korte gaten zijn dichtgeschoven zijn veel pauzes korter dan dat. Dan meet hij het begin van het volgende woord.
- De schaal klopt ook zonder die twee niet. Een echte RT60 van 0,5 s levert in theorie een verhouding van ongeveer 0,09 op, en dat ligt onder de grens van 0,15 die “Dry” betekende. Matige galm zou dus altijd droog heten.
Met een stap van 20 ms en de sprongen van spraak zelf is het verval na een frase te grof om galm uit te halen. Dat is een onderzoeksvraag, geen kleine reparatie.
Wat er op 27 september 2026 is veranderd
- Het etiket
Dry/Tight/Live/Reverberantis uit de engine verdwenen, niet op een standaardwaarde gezet. Een veld dat altijd leeg is, is geen meting om te leveren. - De platte-taalkaart met het advies om je ruimte te behandelen is weg, en het strafpunt dat dit getal in de verstaanbaarheidsscore gaf ook. Dat strafpunt rekende een ruisige opname twee keer af.
- Het getal blijft, onder de naam van wat het meet: energie in de pauzes na spraak, ruis of nagalm, en het scheidt die twee niet. Lees het als “hoeveel staat er nog in de gaten”, nooit als een oordeel over de ruimte.
- In de API en de MCP-server heet het veld nog
roomEchoScore. Een gepubliceerd veld omdopen breekt opgeslagen geschiedenis en bestaande koppelingen, dus dat is een apart besluit en geen onderdeel van deze correctie. De beschrijving zegt wel wat er gemeten wordt.
Wat de vraag wel zou beantwoorden
Wie een galmgetal uit alleen een opname wil, heeft twee eerlijke kandidaten: een maat op het modulatiespectrum zoals SRMR, of een klein model getraind op gemeten impulsresponsies. Beide zijn tegen dezelfde 24 ruimtes te toetsen.
De regel die we voor onszelf hebben gezet: een nieuwe maat mag pas galm heten als hij door die toets komt. Tot dan krijgt hij een naam die de rekensom beschrijft.
Verder lezen
- Meet met één klap hoe lang een ruimte nagalmt: het profiel dat wel galm meet, uit een klap, een knal, een impulsrespons of een sweep
- Pragmatische loudness voor podcasts
- Gehoorondersteuning ontwerpen zonder te medicaliseren
Volgende in VoiceLab docs
Meet met één klap hoe lang een ruimte nagalmt →
Het profiel room leest de nagalmtijd per octaafband uit één klap, een ballonknal, een impulsrespons of een sweep. Hoe je het opneemt, hoe je het antwoord leest en hoe ver de cijfers getoetst zijn.
More in VoiceLab docs
- Intro
Waarom stopwoorddichtheid belangrijker is dan het aantal stopwoorden
Het tellen van "uhms" is de verkeerde maatstaf. Dichtheid laat zien of ze een probleem vormen.
- Practical
Een pragmatisch loudness-doel voor podcasts
Het juiste loudness-doel voor gesproken-woordpodcasts is niet hetzelfde als voor muziek. Hier zijn de getallen en het waarom.
- Practical
Toonhoogte en stemkwaliteit: wat het profiel geeft en wat het achterhoudt
Het profiel pitch leest waar een stem zit, hoeveel hij beweegt, hoe stemhebbend de opname is en hoe schoon de stem is. De testcijfers, de grenzen en waarom jitter en shimmer nog niet worden aangeboden.
- Practical
Verloren pakketten in een opname vinden
Het profiel chain telt de gaten van digitale stilte die een verloren pakket midden in spraak achterlaat. Hoe het beslist, de testcijfers, wat het niet ziet en de echo- en slapbackmaat.