Zum Inhalt
Anmelden

/docs · General · Practical

Ist mein Audio hochgerechnet?

Ein Aufruf pro Datei und ein Feld zum Lesen: bandLimit.upsampled sagt yes, no oder cannot-say, mit dem Grund in einfachen Worten. Was du mit jeder Antwort tust, wie oft jede Antwort in unseren Tests herauskam, und was es nicht sieht.

Aktualisiert 10.11.2026


Für wen das ist

Du baust oder kaufst Sprache für einen Datensatz, der Wideband sein soll, und willst wissen, welche Dateien das nur zu sein scheinen. Die Samplerate im Header sagt, wie eine Datei gespeichert ist, nicht was in ihr steckt: Ein Telefonat, das mit 16 oder 48 kHz gespeichert ist, hört trotzdem bei etwa 4 kHz auf.

Diese Seite gibt dir einen Aufruf, ein Feld zum Lesen und was du mit jeder Antwort tust. Du musst nicht wissen, wie die Engine entscheidet: Die Grenzen stehen in der Antwort selbst.

1. Ruf es auf

Schalte bandLimit in einer Anfrage an die Signalanalyse ein. Für eine lokale Datei mit curl:

curl -s "https://audiolab.tools/v1/signallab?bandLimit=true" \
  -H "Authorization: Bearer $AUDIOLAB_KEY" \
  -F file=@recording.wav

Für eine Datei unter einer öffentlichen URL sendest du 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}'

Mit dem Python-Client (pip install audiolabtools), erst eine Datei, dann ein Ordner, 20 Dateien auf einmal, in eine 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 einem KI-Assistenten mit dem MCP-Server von AudioLab (Version 0.5.1 oder neuer) kennt index_signal die Option bandLimit: true, und analyze_batch auch, mit endpoint: "signallab/index", für 20 Dateien auf einmal. Frag zum Beispiel: „Welche dieser Aufnahmen wurden hochgerechnet?“

Jede Datei ist ein Aufruf und wird an die API hochgeladen, gehostet in der EU; zurück kommen nur Zahlen. Für einen großen Ordner hat das Datensatz-Audit ein vollständiges Skript, das sein Tempo hält, eine Stichprobe ziehen kann und dort weitermacht, wo es aufgehört hat.

2. Lies ein Feld

Lies bandLimit.upsampled. Es ist yes, no oder cannot-say. Daneben sagt bandLimit.reason dasselbe in einfachen Worten, mit der Bandbreite und der Samplerate: Übernimm den Satz so in deinen Bericht. Das ist die Antwort für eine Aufnahme, die wir selbst auf 8 kHz und zurück auf 16 kHz gebracht haben:

{
  "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 ist nur bei einem yes validated. basis nennt jede Bedingung, auf der die Antwort beruht, mit ihrem eigenen Status, damit du siehst, warum. Zum Handeln brauchst du es nicht.

3. Was du mit jeder Antwort tust

upsampledWas es bedeutetWas du tust
yesDas Band endet unter 5 kHz in einer Datei mit 16 kHz oder mehr, mindestens 2 Sekunden lang: Das Audio lag wahrscheinlich bei 8 kHz oder weniger, wie bei einem Telefonat, bevor es mit dieser Rate gespeichert wurde. Status validated (Studie UP-1).Nicht als echtes Wideband verwenden.
noDas Band reicht bis zur Hälfte der Samplerate: kein Zeichen von Hochrechnen. Status proxy (Studie UP-2).Nichts zu tun.
cannot-sayAlles andere: ein Band, das früh endet, ohne das Telefonmuster, ein Band zwischen 80 und 90 Prozent der halben Samplerate, eine Datei unter 2 Sekunden, ein tonales Spektrum oder Stille. Der Grund sagt, was davon.Leg es beiseite. Darf dein Datensatz nur echtes Wideband enthalten, lass es weg oder hör es an. Brauchst du eine Zahl zum Filtern, ist bandLimit.ratio die Bandbreite geteilt durch die halbe Samplerate.

Warum ein Band, das nur früh endet, kein yes ist: Eine schmale Quelle sieht genauso aus. In Studie UP-2 las ein LibriSpeech-Sprecher, aufgenommen mit seiner eigenen Rate, als begrenzt, und ein Mikrofon oder ein Filter, das die Höhen abschneidet, tut dasselbe.

4. Wie oft jede Antwort in unseren Tests herauskam

Wir haben die Aufnahmen beider Studien am 10. November 2026 mit der Entscheidung erneut gelesen. Die beiden Regeln lagen fest, bevor diese Studien liefen, und wie sie zusammen eine Antwort geben, lag vor dieser Lesung fest. Das ist also eine Beschreibung, wie die drei Antworten fallen, kein neuer Test. Die Aufnahmen von UP-1 wurden zweimal gelesen, mit ihrer eigenen Rate und auf 48 kHz decodiert, die Zahlen sind also Lesungen, keine Dateien.

Art der AufnahmeLesungenyesnocannot-say
Durch einen 8-kHz-Telefoncodec und zurück auf 16 oder 48 kHz (UP-1: G.711, AMR, GSM)4.6924.608 (98,2 %)084 (1,8 %)
Durch einen Telefoncodec (UP-2: AMR, G.711, GSM)9090 (100 %)00
Hochgerechnet von 4 kHz450443 (98,4 %)07 (1,6 %)
Hochgerechnet von 8 kHz450436 (96,9 %)014 (3,1 %)
Hochgerechnet von 11,025 kHz4501 (0,2 %)0449 (99,8 %)
Hochgerechnet von 16 kHz auf 44,1 oder 48 kHz3.4285 (0,1 %)03.423 (99,9 %)
FLEURS-Sprache mit ihren eigenen 16 kHz1.08214 (1,3 %)1.032 (95,4 %)36 (3,3 %)
LibriSpeech-Sprache mit ihren eigenen 16 kHz1500141 (94,0 %)9 (6,0 %)
Sprache bei 6 kHz abgeschnitten, mit ihren eigenen 16 kHz78217 (2,2 %)1 (0,1 %)764 (97,7 %)
Sprache durch einen verlustbehafteten Codec (MP3 32 bis 128 kbit/s, AAC 48, Opus 16)3000130 (43,3 %)170 (56,7 %)

Was das für dich heißt:

  • Keine hochgerechnete Lesung bekam no: 0 von 9.560.
  • yes findet das Telefonmuster und Hochrechnen von 4 oder 8 kHz. Hochrechnen von 11,025 kHz oder mehr kommt als cannot-say heraus, fast nie als yes. Lies cannot-say also als “ansehen”, nicht als “wahrscheinlich in Ordnung”.
  • Bei Sprache mit ihrer eigenen Rate war ein yes falsch bei 14 von 1.082 FLEURS-Lesungen (1,3 %) und bei keiner der 150 LibriSpeech-Lesungen. Bei 6 kHz abgeschnittene Sprache las yes bei 17 von 782 (2,2 %).

Was es nicht sieht

  • Echte Telefonleitungen, VoIP-Codecs (Opus, G.722) und Bluetooth-Headsets. UP-1 verwendete Telefoncodecs, die wir selbst ausgeführt haben.
  • Aufnahmen, die von sich aus 44,1 oder 48 kHz haben: Wie oft sie cannot-say lesen würden, ist nicht gemessen. Eine 44,1-kHz-Quelle, die mit 48 kHz gespeichert ist, liest no; diesen Schritt sieht die Regel nicht.
  • Ein Hochrechner, der selbst hohe Frequenzen erzeugt, etwa ein Modell, das das Band wiederherstellt, liest no.
  • Es nennt keine Quellrate, außer beim Telefonursprung.

Die beiden Studien, mit ihrer Vorregistrierung und ihrem Ergebnis, stehen auf der Seite mit den Studien. Worauf die Bandgrenze getestet wurde, steht auch auf ihrer Seite.

Weiter in General docs

Eine Antwort lesen: was jedes Feld bedeutet und wie weit du ihm trauen kannst →

Eine echte Antwort der API, Feld für Feld: was sie sagt, ihr Status und ihre Marge und was du daraus schließen darfst und was nicht.

More in General docs