Naar inhoud
Inloggen

/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

upsampledWat het betekentWat je doet
yesDe 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.
noDe band loopt tot de helft van de samplerate: geen teken van opschalen. Status proxy (studie UP-2).Niets te doen.
cannot-sayAl 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 opnameLezingenyesnocannot-say
Door een telefooncodec van 8 kHz en terug naar 16 of 48 kHz (UP-1: G.711, AMR, GSM)4.6924.608 (98,2%)084 (1,8%)
Door een telefooncodec (UP-2: AMR, G.711, GSM)9090 (100%)00
Opgeschaald vanaf 4 kHz450443 (98,4%)07 (1,6%)
Opgeschaald vanaf 8 kHz450436 (96,9%)014 (3,1%)
Opgeschaald vanaf 11,025 kHz4501 (0,2%)0449 (99,8%)
Opgeschaald vanaf 16 kHz naar 44,1 of 48 kHz3.4285 (0,1%)03.423 (99,9%)
FLEURS-spraak op zijn eigen 16 kHz1.08214 (1,3%)1.032 (95,4%)36 (3,3%)
LibriSpeech-spraak op zijn eigen 16 kHz1500141 (94,0%)9 (6,0%)
Spraak afgekapt op 6 kHz, op zijn eigen 16 kHz78217 (2,2%)1 (0,1%)764 (97,7%)
Spraak door een lossy codec (MP3 32 tot 128 kbit/s, AAC 48, Opus 16)3000130 (43,3%)170 (56,7%)

Wat dat voor jou betekent:

  • Geen enkele opgeschaalde lezing kreeg no: 0 van 9.560.
  • yes vindt het telefoonpatroon en opschalen vanaf 4 of 8 kHz. Opschalen vanaf 11,025 kHz of meer komt uit als cannot-say, bijna nooit als yes. Lees cannot-say dus als “kijk hiernaar”, niet als “waarschijnlijk goed”.
  • Bij spraak op zijn eigen rate was een yes fout bij 14 van 1.082 FLEURS-lezingen (1,3%) en bij geen van de 150 LibriSpeech-lezingen. Spraak afgekapt op 6 kHz las yes bij 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-say zouden lezen, is niet gemeten. Een bron van 44,1 kHz die op 48 kHz is opgeslagen, leest no; 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