Integrated, short-term en momentary LUFS
De loudness-uitlezingen van MixLab implementeren ITU-R BS.1770-4 letterlijk, de aanbeveling die het algoritme achter LUFS definieert, de maatstaf die elk groot streamingplatform gebruikt voor afspeelnormalisatie. De standaard schrijft een tweetraps-filter, een energie-sommatiestap en een gate met relatieve drempel voor.
De K-weging-filterketen
Het signaal wordt voorgefilterd met twee biquad-trappen die samen de frequentierespons van de menselijke loudness-waarneming modelleren:
- Een high-shelf op ~1681 Hz met +4 dB versterking, die de resonantie van het buitenoor modelleert.
- Een high-pass op ~38 Hz (het "RLB"-filter, BS.1770 revised low-frequency B-weighting) die sub-bas-energie verzwakt die niet bijdraagt aan de waargenomen loudness.
De biquad-coëfficiënten zijn genormaliseerd voor 48 kHz; voor elke andere samplefrequentie berekenen we de equivalente coëfficiënten via de bilineaire transformatie van het analoge prototype, geen naïef hergebruik van coëfficiënten. Tegen de testcases van EBU Tech 3341 komt de geïntegreerde loudness van AudioLab uit binnen 0,06 LU van de verwachtingswaarden van de standaard, binnen de ±0,1 LU die de standaard zelf toestaat, en de loudness range komt exact overeen met Tech 3342. Je hoeft dat niet aan te nemen: de signalen definieert de standaard zelf, dus je kunt ze synthetiseren en elke meter aan dezelfde verwachtingswaarden houden. Elke case die wij meten staat in de tabel op de API-pagina.
Eén eerlijke beperking, uit diezelfde benchmark. Buiten de frequenties van de standaard (een toon van 12 kHz waarvan de samples op −3 dBFS liggen) herstelt onze true-peak-meting 1,93 dB van de 3 dB inter-sample peak en rapporteert −1,07 dBTP waar een ideale meter richting 0 zou gaan. Elke true-peak-case binnen de standaard slaagt; deze valt erbuiten en staat er als informatief bij in plaats van weggelaten.
Van gefilterde energie naar LUFS
Na K-weging wordt het signaal gekwadrateerd en gemiddeld over een schuivend venster van 400 ms met 75% overlap. Kanalen worden gesommeerd met kanaalgewichten: 1,0 voor L/R/C, 1,41 voor surrounds. AudioLab meet stereomateriaal, dus de kanaalsom is simpelweg het L² + R² mean-square.
De momentane loudness in LUFS is dan:
L = -0.691 + 10·log₁₀( Σ Gᵢ · meanSquareᵢ )
where Gᵢ is the channel weight and meanSquareᵢ is the time-averaged
squared sample value after K-weighting on channel i. Drie tijdschalen, drie getallen
- Momentary (M): 400 ms ongegate. Het snelle getal, gebruikt om transiënte pieken te vangen.
- Short-term (S): 3 s ongegate. De basis voor de LRA-berekening volgens EBU 3342.
- Integrated (I): Het volledige programma, met tweetraps-gating: een absolute gate op –70 LUFS, dan een relatieve gate op –10 LU onder het ongegate gemiddelde. Gating verwijdert stilte en zeer rustige passages, zodat het getal weergeeft "wat je werkelijk hebt gehoord" en niet het rekenkundige gemiddelde inclusief stilte.
LRA (loudness range)
EBU Tech 3342. We sorteren de short-term-LUFS-waarden, nemen het 10e en 95e percentiel na het toepassen van een relatieve gate (–20 LU onder het ongegate short-term-gemiddelde) en rapporteren hun verschil in LU. Het resultaat drukt uit hoeveel de loudness "ademt" over het programma heen.
Referentie
ITU-R BS.1770-4 (10/2015), Algorithms to measure audio programme loudness and true-peak audio level; EBU Tech 3341 (loudness-metering), 3342 (LRA), 3343 (productierichtlijnen).
Inter-sample-pieken via 4× oversampling
De maximale samplewaarde in een digitale opname is niet hetzelfde als de maximale waarde van de onderliggende continue golfvorm. Tussen twee samples die beide comfortabel onder 0 dBFS liggen, kan het gereconstrueerde analoge signaal kortstondig 0 dB overschrijden, een zogeheten inter-sample-piek. Limiters die alleen naar samplewaarden kijken, missen die. De referentiedecoders van streamingplatforms niet.
BS.1770-4 Annex 2 schrijft 4× oversampling voor via een FIR-interpolator, gevolgd door piekdetectie op het opgesamplede signaal. AudioLab gebruikt een 4-punts kubische interpolator die tussen elk paar originelen drie tussenliggende samples invoegt. De maximale absolute waarde over de opgesamplede buffer wordt gerapporteerd als de true peak.
Kubische interpolatie volstaat voor de 4×-factor die BS.1770 voorschrijft (de referentie van de standaard gebruikt een 12-taps FIR; wij blijven binnen 0,1 dBTP op standaard-testsignalen). Voor mastering-grade analyse verdient een kernel van hogere orde de voorkeur; de uitlezing van AudioLab is bedoeld voor diagnostisch loudness-werk, niet als vervanging voor een gekalibreerd labinstrument.
Pearson-correlatie, mid/side-energie, Lissajous
Stereocorrelatie in MixLab is de Pearson-correlatiecoëfficiënt tussen het linker- en rechterkanaal, sample voor sample berekend over het hele programma (offline) of over een schuivend venster van 1024 samples (tijdens het afspelen). De waarden lopen van +1 (perfect mono) via 0 (gedecorreleerd) tot –1 (perfect geïnverteerd, niet mono-compatibel: valt weg bij mono-sommatie).
De fasescope is een Lissajous-figuur: een 2D-plot met L op de ene as en R op de andere, getekend uit een schuivend venster van recente samples. Een verticale lijn betekent mono-content; een cirkel betekent ongecorreleerde stereo; een horizontale lijn betekent polariteit-geïnverteerd materiaal dat bij mono-weergave tot stilte ineenklapt. Het display benadert niet, het tekent daadwerkelijke samplepaaren.
Mid en side worden afgeleid uit de standaard som en het verschil: M = (L + R) / 2, S = (L – R) / 2. We nemen de RMS van elk over het hele programma; de verhouding van side tot mid, gedeeld door 1,5 en begrensd op 1, is de stereobreedte die we rapporteren (0 is mono, 1 is breed).
FFT, Hann-venster en de zevenbands tonale kaart
De realtime spectrumweergave gebruikt de ingebouwde AnalyserNode van de browser,
die intern een FFT met een Blackman-venster implementeert. Voor de offline-analyse gebruiken we een Hann-venster
en een 4096-punts FFT met 50% overlap. De vensterkeuze verslechtert het dynamisch bereik iets ten opzichte van
Blackman, maar behoudt een betere main-lobe-resolutie, handig voor de visuele leesbaarheid in de analyser-weergave.
De zevenbandsmeter aggregeert FFT-bins tot perceptueel verdeelde banden. De keuzes volgen gangbare conventies van mastering-tools:
Sub 20 Hz – 60 Hz
Bass 60 Hz – 200 Hz
Low-mid 200 Hz – 500 Hz
Mid 500 Hz – 2 kHz
High-mid 2 kHz – 4 kHz
Presence 4 kHz – 8 kHz
Air 8 kHz – 16 kHz Elke band rapporteert de gemiddelde spectrale magnitude van de bakken binnen haar grenzen, geschaald zodat de sterkste band 1 leest. De zeven waarden zijn relatief ten opzichte van elkaar, geen niveaus in dBFS. De bakbreedte bij 48 kHz met een FFT van 4096 punten is 11,7 Hz, dus de subband heeft maar ongeveer vier bakken en is de grofste van de zeven.
Spraakdetectie, SNR, tempo en sisklanken
VoiceLab QA rapporteert losse metingen, geen enkele samengestelde score. Ze zijn eigenzinnig, ontworpen voor podcast- en voice-overproducenten, en uitdrukkelijk geen klinische maatstaf. Wat volgt is wat de engine vandaag doet. Waar een maat fout bleek, staat dat in sectie 08.
- Spraakdetectie: het niveau (RMS) wordt elke 20 ms bepaald over een venster van 40 ms, en een frase is een stuk boven een drempel die uit de eigen niveaupercentielen van die opname komt: de grootste van drie keer het 10e percentiel en het midden tussen het 10e en het 70e, nooit onder ongeveer −55 dBFS, en begrensd op de helft van het 70e percentiel waar de drempel anders boven het 95e zou uitkomen en niets meer zou vinden. Pauzes korter dan 160 ms worden overbrugd en stukken korter dan 100 ms vallen af. Dit is een niveaupoort en geen spraakherkenner, en hij is te foppen. We hebben gemeten hoezeer, op 111 opnames met de schone bronzin als grondwaarheid: bij 10 dB signaal-ruis vindt hij gemiddeld 1,2 s te weinig spraak, bij 5 dB 2,4 s. Die spraak valt dan buiten het spraakniveau en de SNR.
- Wat het actieve materiaal is: elk frame krijgt het etiket stem, muziek, ruis of stilte, op grond van zijn niveau en van hoeveel de nuldoorgangsfrequentie varieert over ongeveer een halve seconde aan weerszijden (spraak wisselt klinkers en medeklinkers af, muziek is spectraal gelijkmatiger). De grenzen zijn gefit op een gelabeld korpus: spraak in 32 ruis- en galmcondities, tonale en beatgedreven muziek, en kale kamerruis. Het resultaat leest als stem vanaf 60% stemachtige frames, als gemengd vanaf 40%, en anders als muziek of ruis. De geschreven feedback oordeelt niet over SNR, tempo of sisklanken bij materiaal dat niet als stem leest.
- Ruisvloer en SNR: de ruisvloer is het 10e percentiel van het niveau. De totale SNR is het gemiddelde spraakniveau min die vloer. Een televisie of een passerende vrachtwagen verhoogt de vloer maar in een deel van een opname, dus de engine geeft ook een SNR per frase, tegen de vloer in een venster van ongeveer een halve seconde rond die frase, en het slechtste tiende daarvan: één onverstaanbare zin is genoeg om een melding te missen, en een gemiddelde verbergt dat. Frases korter dan 200 ms krijgen geen eigen SNR.
- Tempo: de dominante modulatiefrequentie van de spraakenvelop tussen 2 en 8 Hz, in lettergrepen per seconde, over de span van de eerste tot de laatste frase, pauzes inbegrepen. Dat wordt vertaald naar een label traag, normaal of snel. Pieken in de envelop tellen is geprobeerd en verworpen: op één zin voorgelezen in drie tempo's, waar de werkelijke verhouding 1,63 : 1,00 : 0,69 was, gaf dat 1,12 : 1,00 : 0,98.
- Sisklanken: in frames van 4096 monsters met een Hann-venster, het aandeel van de spectrale magnitude tussen 5 en 9 kHz. De mediaan over de frames, maal vijf en begrensd op 1, is de score: laag onder 0,25, gemiddeld onder 0,55, hoog daarboven.
- Helderheid: afgeleid van het spectrale zwaartepunt, op vermogen gewogen en alleen tot 8 kHz geteld. Daarboven heeft spraak vrijwel niets, en de duizenden bijna lege bakken bepaalden vroeger de uitkomst: een ruisvloer op −96 dBFS, ver onder wat je hoort, verschoof de helderheid van 0,513 naar 0,590.
- Clipping: telt reeksen opeenvolgende monsters die op de piek zitten en geeft dat aantal een gradatie: geen, laag, gemiddeld of hoog.
- Verstaanbaarheid, als proxy: de zwakste van twee hellingen: het slechtste tiende van de SNR per frase en het spraakniveau boven de achtergrond in de pauzes. Elk leest 0 bij 3 dB en 1 bij 18 dB, en wordt bij gemiddelde clipping met 15% verlaagd en bij zware clipping met 40%. Goed te volgen vanaf 0,65, op het randje vanaf 0,35, anders ondergesneeuwd, en alleen met minstens twee meetbare frases. Het is een proxy en heet er ook een: geen Speech Transmission Index, want die vraagt een testsignaal dat in de ruimte wordt afgespeeld. Het is een proxy voor hoe goed een luisteraar de stem kan volgen, niet voor de nauwkeurigheid van spraakherkenning: in onze eigen test met 1.248 transcripties voorspelde het de herkenningsfouten niet (zie de status op de lensespagina).
Er is geen enkel samengesteld getal. De metingen komen terug als losse velden, dus je stelt zelf vast wat een voldoende is. Het verstaanbaarheidslabel is de ene uitzondering, en het heet een proxy. Een eerdere versie van deze pagina beschreef een score van 0–100; die heeft de engine nooit teruggegeven.
Regiodetectie en contentclassificatie
SignalLab deelt een willekeurig audiobestand in gelabelde regio's in: stem, muziek, ruis, stilte en clipping. Het is één pijplijn, die VoiceLab deelt.
- Framelabels: niveau (RMS) en nuldoorgangsfrequentie elke 20 ms. Elk frame krijgt zijn etiket van zijn niveau en van hoeveel de nuldoorgangsfrequentie varieert over ongeveer een halve seconde aan weerszijden: spraak wisselt medeklinkers en klinkers af (een spreiding van 0,05 of meer), muziek is spectraal gelijkmatig (0,02 of minder). De grenzen zijn gefit op een gelabeld korpus (spraak in 32 ruis- en galmcondities, tonale en beatgedreven muziek, kale kamerruis) en niet geraden, en VoiceLab gebruikt dezelfde functie, dus de twee labs kunnen het niet oneens zijn over wat stem is.
- Regio's samenvoegen: opeenvolgende frames met hetzelfde etiket worden één regio, en regio's korter dan 0,3 s gaan op in de vorige. Clipping is een aparte ronde: een stuk waar in een venster meer dan drie monsters op of boven 0,98 van de volle schaal zitten, wordt een clippingregio, bij bestanden met veel clipping.
De regellabels zijn heuristisch; het tagschema is gepubliceerd op /docs/signallab/tag-schema. Ze zijn nuttig voor navigatie en bulkfiltering. De tijdlijn van regio's komt uit deze eenvoudige frameclassifier; voor productie-indexering op schaal wil je daar ook een geleerd model voor.
Het bestandsoordeel, het contenttype (voice, music, mixed, noise of unknown), is een aparte stap. Op de site komt het uit een klein geleerd model (v2) over 25 eenvoudige kenmerken per venster van 10 seconden; in de API is het een opt-in (contentModel v2) tot 15 januari 2027, wanneer het de standaard wordt. We hebben het eerste model op 12 oktober 2026 op echte opnames getoetst: 600 fragmenten van 20 seconden uit het MUSAN-corpus (200 spraak, 200 muziek en 200 ruis), één run, achteraf niets bijgesteld. Het haalde de lat niet die we vooraf hadden gelegd (recall en precisie van 0,80 of meer voor alle drie de klassen): het vond 164 van de 200 spraakfragmenten, 91 van de 200 muziekfragmenten en 3 van de 200 ruisfragmenten. Daarna hebben we v2 één keer op dezelfde manier getoetst, op dezelfde 600 fragmenten plus 90 fragmenten van drie omgevingen die het nooit zag: het vond 197 van de 200 spraakfragmenten (precisie 0,95), 190 van de 200 muziekfragmenten (0,86) en 40 van de 90 fragmenten met stationaire ruis (precisie 1,00; straatverkeer en metro heten vooral unknown). Het haalde de lat voor spraak en muziek en niet voor ruis, dus het blijft een proxy. De volledige cijfers staan bij signal.contentType op /lenses.
Wat we aanhalen
ITU-R BS.1770-4
Algoritmes voor loudness- en true-peak-meting (10/2015)
EBU R128
Loudness-normalisatie en toegestaan maximumniveau (versie 5.0, november 2023)
EBU Tech 3341
Loudness-metering in EBU Mode
EBU Tech 3342
Definitie van loudness range (LRA)
EBU Tech 3343
Richtlijnen voor het maken van programma's volgens R 128
AES17-2020
Meting van digitale audioapparatuur
IEC 61672-1
Geluidsniveaumeters: specificaties (ter context)
W3C WebAudio
Specificaties voor AudioContext, AnalyserNode, AudioWorklet
EBU R 128 s2
Loudness in streaming (supplement 2 bij R 128)
Hoe ver je elke maat kunt vertrouwen
Elke meting die de engine levert draagt een van vier statussen, en dezelfde woorden staan op de lensespagina, de API-pagina, het OpenAPI-document en de MCP-toolbeschrijvingen. Beta betekent dat er nog geen grondwaarheidstest is, niet dat de maat fout is. Een maat wordt pas gevalideerd met een vastgelegde toets tegen een bekende waarde, met een tolerantie, en een proxy blijft tot dan een proxy.
Bij elke maat op de lensespagina (Engels) staat waartegen hij getoetst is, waarop niet, en wat hij niet is. De meeste loudness-getallen zijn gevalideerd tegen de EBU-testsignalen; de scène-, content- en verstaanbaarheidsmaten zijn proxy’s; de galmscore die faalde is ingetrokken (zie de correcties hieronder). Elke maat zegt ook hoe hij werkt: klassieke signaalverwerking, of signaalverwerking met een klein geleerd model, dat dan wordt genoemd, met waarop het getraind is.
Waar we ernaast zaten, en wat we hebben veranderd
Een meting is alleen te vertrouwen als de maker zegt wanneer hij ernaast zat. Dit zijn de gevallen van september en oktober 2026. Elk is gevonden door een bewering te toetsen aan iets wat gemeten is, en elk is in de engine opgelost en niet alleen in de tekst.
- Een galmscore die geen galm mat. Het galmetiket van VoiceLab (Dry, Tight, Live, Reverberant) liep op met achtergrondruis en niet met galm. Tegen de gemeten nagalmtijden van 24 ruimtes, van 0,18 tot 1,71 s, was de rangcorrelatie 0,06, en een ruimte van 1,71 s scoorde lager dan een cabine van 0,18 s. Op 27 september ingetrokken uit de engine, de apps, de API en de MCP-server. Het getal blijft onder de naam van wat het meet, energie in de pauzes na spraak, en verlaagt de verstaanbaarheidsproxy niet meer. De uitleg met de cijfers. Een nieuwe galmmaat mag pas galm heten als hij door dezelfde toets komt.
- Getallen zonder spraak. Bij een muziekstuk met zang vond VoiceLab geen enkele frase en meldde toch een SNR van −66 dB, een tempo van 0,0 lettergrepen per seconde, een sisklankrisico gemiddeld en 14,3 s stilte. Geen van de vier was gemeten. Ze zijn nu leeg als er geen spraak is gevonden, en het lab zegt wat het materiaal lijkt te zijn.
- Twee labs, twee antwoorden. VoiceLab en SignalLab berekenden elk hun eigen niveaucurve en drempel en liepen uiteen op hetzelfde bestand: 14,3 s stilte tegen 6,3 s stem. Ze delen nu één set feiten, en een controle op een synthetisch bestand houdt ze eraan.
- Een platform dat zich niet gedraagt zoals aangenomen. Na YouTube-normalisatie werd een zacht bestand als "boven het plafond" getoond, maar YouTube draait zachte uploads volgens metingen van derden niet omhoog. Spotify doet dat wel, tot 1 dB marge. Een uitkomst na normalisatie wordt nu alleen getoond waar het platform publiceert wat het doet, en waar dat niet zo is zegt de tool dat.
- Loudness-getallen en de standaard. Deze pagina zei eerst dat de engine tot op 0,05 LU overeenkomt met de referentie-implementatie van de EBU. De benchmark vergelijkt met de gepubliceerde verwachte waarden van de standaard, nooit met een andere implementatie, en het slechtste geval is 0,06 LU. De tekst zegt dat nu.
Controles die bij elke build draaien houden dit tegen: de prijspagina tegen de code, gedocumenteerde API-endpoints tegen echte, de privacypagina's tegen wat er werkelijk laadt, ingetrokken claims tegen de tekst, de loudness tegen de EBU-signalen Tech 3341 en 3342, en een zelfcheck per module. Een aparte sweep breekt met opzet dingen om te bewijzen dat elke controle rood kan worden.
Vragen die we krijgen
Kan ik dit niet in een middag door een AI laten bouwen?
Een interface kun je laten genereren, en een pagina die getallen toont is zo gemaakt. Wat je niet kunt laten genereren is wat een getal vertrouwenswaardig maakt: het toetsen aan iets wat gemeten is. Onze loudness is gecontroleerd tegen de signalen die de EBU-standaard definieert en komt in het slechtste geval op 0,06 LU uit. Onze galmscore is gecontroleerd tegen 24 ruimtes met gemeten nagalmtijden, viel door de mand en is ingetrokken; de sectie hierboven heeft de cijfers. Een kopie die nooit getest wordt, houdt zo'n score. Wat overblijft is niet de code maar het testen, een eerlijke lijst van wat we niet meten, en één engine achter de browserlabs, de API en de MCP-server.
Is het open source?
Nee. De meetengine is closed source. Wat wel openbaar is: de API-specificatie op /openapi.yaml, de MCP-server en de AI SDK op npm, en een openbare repository voor de MCP-server op github.com/Audio-Launch/audiolab-mcp-server. De standaarden die we implementeren en de testsignalen waartegen we controleren zijn gepubliceerd door hun eigenaren, en de loudness-sectie zegt hoe je de controles zelf nabouwt. De browserlabs sturen geen audio naar ons, en het netwerktabblad van je browser laat dat zien.
Heeft AI het geschreven, en is het vibe-coded?
Veel van de code wordt met AI-tools geschreven, en het is niet vibe-coded. Het verschil zit in wat er gebeurt nadat de code er is. Vibe-coden is accepteren wat eruit komt en het live zetten omdat het draait. AI-geassisteerd betekent dat een mens bepaalt wat er gemeten wordt en waartegen, en dat niets op zijn woord wordt geloofd: elke push draait de loudness-benchmark tegen de EBU-testsignalen, een zelfcheck per module, en controles dat de prijspagina, de API-documentatie en de privacypagina's kloppen met wat er echt draait. Blijkt een maat fout, dan wordt hij ingetrokken en zegt de pagina dat. De sectie hierboven noemt die gevallen; werk dat nooit is nagekeken of getest heeft er geen om te noemen.
Wat dit niet is
De getallen zijn nauwkeurig binnen de hierboven gedocumenteerde toleranties, maar dit is een browsergebaseerde analyser die draait op de CPU van de gebruiker. Het is geen vervanging voor:
- Een gekalibreerde hardware-loudnessmeter voor broadcast-compliance-audits.
- Een lab-grade audioanalyser voor het testen van versterkers of converters.
- Een klinisch audiometrie-instrument. HearLab is uitdrukkelijk niet-medisch.
- Een referentie-encoder/-decoder voor het verifiëren van codec-compliance.
- Een galmmeter voor een opname. VoiceLab rapporteert de energie in de pauzes na spraak, en die loopt op met ruis én galm. Voor galm meet RoomLab die uit een klap.
- Een teller van woorden, stopwoorden of sprekerwisselingen. Geen enkele lens telt ze.
Wat het wel is, in de geest van de rest van de site: een werkende, snelle, verdedigbare meting die je in de browserlabs op elk audiobestand kunt uitvoeren zonder iets naar een server te uploaden, met de wiskunde volledig gedocumenteerd en het codepad vanaf elke demo terug te linken naar hier.