/docs · General · Practical
Is mijn audio opgeschaald?
Eén aanroep per bestand en één veld om te lezen: bandLimit.upsampled zegt yes, no of cannot-say, met de reden in gewone woorden. Wat je met elk antwoord doet, hoe vaak elk antwoord uitkwam in onze toetsen, en wat het niet ziet.
Bijgewerkt 10 nov 2026
Voor wie dit is
Je bouwt of koopt spraak voor een dataset die wideband moet zijn, en je wilt weten welke bestanden dat alleen lijken. De samplerate in de header zegt hoe een bestand is opgeslagen, niet wat erin zit: een telefoongesprek dat op 16 of 48 kHz is opgeslagen, houdt nog steeds op rond 4 kHz.
Deze pagina geeft je één aanroep, één veld om te lezen en wat je met elk antwoord doet. Je hoeft niet te weten hoe de engine beslist: de grenzen staan in het antwoord zelf.
1. Roep het aan
Zet bandLimit aan in een verzoek aan de signaalanalyse. Voor één lokaal bestand met curl:
curl -s "https://audiolab.tools/v1/signallab?bandLimit=true" \
-H "Authorization: Bearer $AUDIOLAB_KEY" \
-F file=@recording.wav
Voor een bestand op een openbare URL stuur je JSON:
curl -s https://audiolab.tools/v1/signallab \
-H "Authorization: Bearer $AUDIOLAB_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/recording.wav", "bandLimit": true}'
Met de Python-client (pip install audiolabtools), eerst één bestand, dan een map, 20 bestanden per keer, naar een CSV:
import csv
from pathlib import Path
from audiolabtools import AudioLab
lab = AudioLab() # reads AUDIOLAB_KEY
band = lab.signal("recording.wav", bandLimit=True)["bandLimit"]
print(band["upsampled"], band["reason"])
files = sorted(str(p) for p in Path("recordings").glob("*.wav"))
with open("upsampled.csv", "w", newline="", encoding="utf-8") as f:
out = csv.writer(f)
out.writerow(["file", "upsampled", "ratio", "reason"])
for i in range(0, len(files), 20):
chunk = files[i : i + 20]
answer = lab.batch(chunk, endpoint="signallab", bandLimit=True)
for name, r in zip(chunk, answer["results"]):
b = (r.get("data") or {}).get("bandLimit") or {}
out.writerow([name, b.get("upsampled", "error"), b.get("ratio"),
b.get("reason", r.get("error"))])
In een AI-assistent met de MCP-server van AudioLab (versie 0.5.1 of later) kent index_signal de optie bandLimit: true, en analyze_batch ook, met endpoint: "signallab/index", voor 20 bestanden per keer. Vraag bijvoorbeeld: “Welke van deze opnames zijn opgeschaald?”
Elk bestand is één aanroep en wordt geüpload naar de API, gehost in de EU; alleen getallen komen terug. Voor een grote map heeft de dataset-audit een volledig script dat zijn tempo bewaakt, een steekproef kan nemen en verdergaat waar het stopte.
2. Lees één veld
Lees bandLimit.upsampled. Dat is yes, no of cannot-say. Ernaast zegt bandLimit.reason hetzelfde in gewone woorden, met de bandbreedte en de samplerate: neem die zin zo over in je rapport. Dit is het antwoord voor een opname die we zelf naar 8 kHz brachten en terug naar 16 kHz:
{
"bandLimit": {
"upsampled": "yes",
"status": "validated",
"reason": "The band stops at 4.3 kHz in a 16 kHz file: the audio was probably at 8 kHz or less, as in a telephone call, before it was stored at this rate. In study UP-1, 0.1 to 1.8% of untouched recordings read the same way.",
"basis": [
{
"check": "telephone-origin (UP-1)",
"status": "validated",
"result": "fires"
},
{
"check": "band-limit ratio (UP-2)",
"status": "proxy",
"result": "band-limited",
"ratio": 0.537
}
],
"bandwidthHz": 4296.9,
"sampleRate": 16000,
"ratio": 0.537,
"verdict": "band-limited",
"reasonCode": "ratio-below-L"
}
}
status is alleen bij een yes validated. basis noemt elke voorwaarde waar het antwoord op rust, met haar eigen status, zodat je ziet waarom. Om te handelen heb je het niet nodig.
3. Wat je met elk antwoord doet
upsampled | Wat het betekent | Wat je doet |
|---|---|---|
yes | De band houdt op onder 5 kHz in een bestand van 16 kHz of meer, minstens 2 seconden lang: de audio zat waarschijnlijk op 8 kHz of minder, zoals bij een telefoongesprek, voordat hij op deze rate is opgeslagen. Status validated (studie UP-1). | Gebruik het niet als echte wideband. |
no | De band loopt tot de helft van de samplerate: geen teken van opschalen. Status proxy (studie UP-2). | Niets te doen. |
cannot-say | Al het andere: een band die vroeg ophoudt zonder het telefoonpatroon, een band tussen 80 en 90 procent van de halve samplerate, een bestand onder 2 seconden, een tonaal spectrum of stilte. De reden zegt welke. | Zet het apart. Mag je dataset alleen echte wideband bevatten, laat het dan weg of luister ernaar. Wil je een getal om op te filteren, dan is bandLimit.ratio de bandbreedte gedeeld door de halve samplerate. |
Waarom een band die alleen vroeg ophoudt geen yes is: een smalle bron ziet er hetzelfde uit. In studie UP-2 las een LibriSpeech-spreker, opgenomen op zijn eigen rate, als begrensd, en een microfoon of een filter dat de top afsnijdt doet hetzelfde.
4. Hoe vaak elk antwoord uitkwam in onze toetsen
We lazen de opnames van beide studies opnieuw met de beslissing, op 10 november 2026. De twee regels lagen vast voordat die studies draaiden, en hoe ze samen één antwoord geven lag vast voor deze lezing. Dit is dus een beschrijving van hoe de drie antwoorden vallen, geen nieuwe toets. De opnames van UP-1 zijn twee keer gelezen, op hun eigen rate en gedecodeerd op 48 kHz, dus de tellingen zijn lezingen, geen bestanden.
| Soort opname | Lezingen | yes | no | cannot-say |
|---|---|---|---|---|
| Door een telefooncodec van 8 kHz en terug naar 16 of 48 kHz (UP-1: G.711, AMR, GSM) | 4.692 | 4.608 (98,2%) | 0 | 84 (1,8%) |
| Door een telefooncodec (UP-2: AMR, G.711, GSM) | 90 | 90 (100%) | 0 | 0 |
| Opgeschaald vanaf 4 kHz | 450 | 443 (98,4%) | 0 | 7 (1,6%) |
| Opgeschaald vanaf 8 kHz | 450 | 436 (96,9%) | 0 | 14 (3,1%) |
| Opgeschaald vanaf 11,025 kHz | 450 | 1 (0,2%) | 0 | 449 (99,8%) |
| Opgeschaald vanaf 16 kHz naar 44,1 of 48 kHz | 3.428 | 5 (0,1%) | 0 | 3.423 (99,9%) |
| FLEURS-spraak op zijn eigen 16 kHz | 1.082 | 14 (1,3%) | 1.032 (95,4%) | 36 (3,3%) |
| LibriSpeech-spraak op zijn eigen 16 kHz | 150 | 0 | 141 (94,0%) | 9 (6,0%) |
| Spraak afgekapt op 6 kHz, op zijn eigen 16 kHz | 782 | 17 (2,2%) | 1 (0,1%) | 764 (97,7%) |
| Spraak door een lossy codec (MP3 32 tot 128 kbit/s, AAC 48, Opus 16) | 300 | 0 | 130 (43,3%) | 170 (56,7%) |
Wat dat voor jou betekent:
- Geen enkele opgeschaalde lezing kreeg
no: 0 van 9.560. yesvindt het telefoonpatroon en opschalen vanaf 4 of 8 kHz. Opschalen vanaf 11,025 kHz of meer komt uit alscannot-say, bijna nooit alsyes. Leescannot-saydus als “kijk hiernaar”, niet als “waarschijnlijk goed”.- Bij spraak op zijn eigen rate was een
yesfout bij 14 van 1.082 FLEURS-lezingen (1,3%) en bij geen van de 150 LibriSpeech-lezingen. Spraak afgekapt op 6 kHz lasyesbij 17 van 782 (2,2%).
Wat het niet ziet
- Echte telefoonlijnen, VoIP-codecs (Opus, G.722) en Bluetooth-headsets. UP-1 gebruikte telefooncodecs die we zelf draaiden.
- Opnames die van zichzelf 44,1 of 48 kHz zijn: hoe vaak die
cannot-sayzouden lezen, is niet gemeten. Een bron van 44,1 kHz die op 48 kHz is opgeslagen, leestno; die stap ziet de regel niet. - Een opschaler die zelf hoge frequenties bijmaakt, zoals een model dat de band herstelt, leest
no. - Het noemt geen bronrate, behalve bij de telefoonherkomst.
De twee studies, met hun voorregistratie en uitslag, staan op de pagina met studies. Waarop de bandgrens getoetst is, staat ook op zijn pagina.
Volgende in General docs
Een respons lezen: wat elk veld betekent en hoe ver je het kunt vertrouwen →
Een echt antwoord van de API, veld voor veld: wat het zegt, de status en de marge, en wat je er wel en niet uit mag afleiden.
More in General docs
- Practical
Voice-agent- en TTS-vendors vergelijken, en gespreksaudio controleren
Drie API-aanroepen, tien getallen, en hoe ver je elk getal kunt vertrouwen: een gids voor QA-teams die voice-agent-, text-to-speech- of voice-isolation-vendors vergelijken.
- Practical
Audiokwaliteit controleren in CI: laat een build falen als een bestand je regels breekt
Een kort Python-script en een GitHub-workflow die elk audiobestand met de AudioLab-API meten, de getallen vergelijken met limieten die je zelf instelt, en de build laten falen met een bericht dat zegt waarom.
- Practical
Een dataset met gesprekken auditen: waar de audio echt vandaan komt
Meet een map met opnames van gesprekken, voice-agents of text-to-speech op opschalen, een lossy bron, plakplekken, mono vermomd als stereo, clipping en bitdiepte, 20 bestanden per keer, en weet wanneer de audio wordt geüpload en wanneer niet.
- Intro
Wat AudioLab niet doet
De grenzen van de analyse, zonder omwegen: AudioLab transcribeert niet, voorspelt geen herkenningsfouten, beoordeelt geen natuurlijkheid, herkent geen sprekers en meet geen latency, en de achtergrondaanwijzingen zijn gissingen.
- Intro
Wijzigingen en deprecation: wat er verandert, wanneer, en hoe je het te weten komt
De belofte achter /v1, wat telt als een wijziging die aangekondigd moet worden, hoe we die aankondigen, en wat er vandaag deprecated is.