Zum Inhalt
Anmelden

/docs · General · Practical

Voice-Agent- und TTS-Anbieter vergleichen und Gesprächsaudio prüfen

Drei API-Aufrufe, zehn Zahlen und wie weit du jeder trauen kannst: ein Leitfaden für QA-Teams, die Voice-Agent-, Text-to-Speech- oder Voice-Isolation-Anbieter vergleichen.

Aktualisiert 15.10.2026


Für wen das ist

Du hast Aufnahmen von zwei oder mehr Voice-Agent-, Text-to-Speech- oder Voice-Isolation-Anbietern oder von einem Anbieter über die Zeit und willst sie mit Zahlen vergleichen: wie laut, wie verrauscht, ob etwas clippt, wie breit das Band ist, wie viele Pausen.

Gedacht ist es für Teams, die darüber ihre eigenen Regeln für Bestehen und Durchfallen setzen. Es ist nicht dafür da zu beurteilen, wie natürlich eine Stimme klingt, und es liest die Wörter nicht. Siehe was AudioLab nicht tut.

Was du bekommst

Für jede Aufnahme etwa zehn Zahlen. Jede hat einen Status, der sagt, wie weit du ihr trauen kannst (fordere measureStatus an, dann trägt die Antwort ihn), und, wo wir es wissen, eine Marge, die sagt, wie weit sie danebenliegen kann. Wir geben dir Startbereiche. Die Entscheidung, ob eine Aufnahme besteht oder durchfällt, bleibt bei dir.

Lieber keinen Code schreiben? Die Werkbank vergleicht zwei Sätze von Aufnahmen in deinem Browser: Melde dich auf /account an, öffne den Tab Voice und schalte im Batch „Compare two sets“ ein. Du bekommst dieselben zehn Zahlen mit denselben Status und, wo wir gemessen haben, mit Margen, dein Audio wird nicht hochgeladen, und der Bericht lässt sich als eine HTML-Datei exportieren.

Bevor du anfängst

  1. Hol dir einen Schlüssel. Er ist kostenlos und braucht keine Karte: Melde dich auf /account an und erzeuge einen. Das Free-Kontingent sind 1.000 Aufrufe im Monat, 2 GB im Monat und 60 Anfragen pro Minute. Die zehn Zahlen kosten drei Aufrufe pro Aufnahme, und die Datei zählt pro Aufruf einmal gegen dein monatliches Datenvolumen, also dreimal.
  2. Nimm bei jedem Anbieter dieselben Sätze. Ein Unterschied zwischen Anbietern bedeutet nur etwas bei demselben Text und demselben Hintergrundrauschen.
  3. Schick das Audio so, wie deine Nutzer es hören. Dieselbe Abtastrate und derselbe Codec wie in der Produktion. Ein Anbieter, der als Studio-WAV gut klingt, kann nach der Telefonleitung anders aussehen.
  4. Fordere die Extras an. Füge der Anfrage "round": true und "measureStatus": true hinzu. Beide sind standardmäßig aus, damit sich an einer bestehenden Integration nichts ändert. round liefert weniger Nachkommastellen (46,7 statt 46,69999999999999). measureStatus fügt einen Schlüssel mit dem Status jeder Messgröße und, wo wir es wissen, ihrer Marge hinzu. Ist der Body eine rohe Datei, setzt du die beiden Optionen stattdessen in den Query-String: ?round=true&measureStatus=true.

Die drei Aufrufe

Eine Aufnahme braucht drei POST-Anfragen mit demselben Body: mixlab/analyze für die Loudness, voicelab/qa für die Stimme und den Hintergrund und signallab für die Bandbreite. Schick eine öffentliche URL (bis zu 150 MB) oder eine kleine Datei als rohen Body (etwa 4,5 MB). Für eine lokale Datei über 4,5 MB lädst du sie zuerst über eine signierte URL hoch und schickst ihren objectPath, wie in der OpenAPI-Spezifikation beschrieben.

curl
export AUDIOLAB_KEY=al_live_...
BODY='{"url":"https://example.com/vendor-a/sentence-01.wav","round":true,"measureStatus":true}'

for route in mixlab/analyze voicelab/qa signallab; do
  curl -s "https://audiolab.tools/v1/$route" \
    -H "Authorization: Bearer $AUDIOLAB_KEY" \
    -H "Content-Type: application/json" \
    -d "$BODY" > "vendor-a_sentence-01_${route//\//_}.json"
done
Python

Das Paket audiolabtools hat die zehn Zahlen als einen Aufruf, mit dem Status und der Marge jeder Zahl:

pip install audiolabtools
from audiolabtools import AudioLab

numbers = AudioLab().ten_numbers("https://example.com/vendor-a/sentence-01.wav")
for field, m in numbers.items():
    print(field, m.value, m.unit, m.status, m.margin)

Es liest den Schlüssel aus AUDIOLAB_KEY, macht die drei Aufrufe unten mit eingeschaltetem round und measureStatus und löst pro Fehlercode eine Exception aus (DataQuotaExceeded, RateLimited und so weiter, jede mit code und docs_url). Den Rest findest du in der README des Pakets. Ohne das Paket dasselbe mit requests:

import os, requests

KEY = os.environ["AUDIOLAB_KEY"]

def analyze(route, url):
    r = requests.post(
        f"https://audiolab.tools/v1/{route}",
        headers={"Authorization": f"Bearer {KEY}"},
        json={"url": url, "round": True, "measureStatus": True},
        timeout=120,
    )
    if not r.ok:
        # error.code sagt, was passiert ist, siehe https://audiolab.tools/docs/errors
        raise RuntimeError(r.json()["error"]["code"] + ": " + r.json()["error"]["message"])
    return r.json()

def ten_numbers(url):
    mix, voice, sig = (analyze(r, url) for r in ("mixlab/analyze", "voicelab/qa", "signallab"))
    return {
        "integratedLufs": mix["integratedLufs"],
        "truePeakDb": mix["truePeakDb"],
        "peakDb": mix["peakDb"],
        "speechLevelDb": voice["averageSpeechRmsDb"],
        "noiseFloorDb": voice["noiseFloorDb"],
        "signalToNoiseDb": voice["signalToNoiseDb"],
        "clipping": voice["clipping"]["severity"],
        "speechRatio": voice["speechRatio"],
        "longSilences": voice["longSilences"],
        "bandwidthHz": sig["bandwidthHz"],
    }
TypeScript
const KEY = process.env.AUDIOLAB_KEY!;

async function analyze(route: string, url: string) {
  const r = await fetch(`https://audiolab.tools/v1/${route}`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ url, round: true, measureStatus: true }),
  });
  const body = await r.json();
  // Bei einem Fehler sagt body.error.code, was passiert ist: https://audiolab.tools/docs/errors
  if (!r.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
  return body;
}

export async function tenNumbers(url: string) {
  const [mix, voice, sig] = await Promise.all(['mixlab/analyze', 'voicelab/qa', 'signallab'].map((r) => analyze(r, url)));
  return {
    integratedLufs: mix.integratedLufs, truePeakDb: mix.truePeakDb, peakDb: mix.peakDb,
    speechLevelDb: voice.averageSpeechRmsDb, noiseFloorDb: voice.noiseFloorDb, signalToNoiseDb: voice.signalToNoiseDb,
    clipping: voice.clipping.severity, speechRatio: voice.speechRatio, longSilences: voice.longSilences,
    bandwidthHz: sig.bandwidthHz,
  };
}
MCP (Claude und andere Agenten)

Verbinde den AudioLab-Server, wie auf /connect gezeigt, und frag dann:

Use analyze_loudness, analyze_voice and index_signal on these three URLs. Give me a table with integrated loudness, true peak, peak, speech level, noise floor, signal-to-noise, clipping, speech ratio, long silences and bandwidth for each. Tell me which of these are validated and which are proxies.

Die MCP-Tools liefern dieselben Zahlen. Sie fügen jedem Ergebnis nicht den Status hinzu; jede Tool-Beschreibung nennt ihre validierten Messgrößen und ihre Proxys (das Voice-Tool sagt außerdem, dass das Pausenenergie-Feld keine Nachhall-Messgröße ist), und diese Seite sagt es pro Feld.

Die zehn Zahlen

Zahl Status Marge
integratedLufs Validiert ±0,1 LU
truePeakDb Validiert +0,2 / -0,4 dB
peakDb Validiert keine genannt
averageSpeechRmsDb Validiert keine genannt
noiseFloorDb Validiert keine genannt
signalToNoiseDb Validiert ±6 dB
clipping Validiert keine genannt
speechRatio Proxy keine genannt
longSilences Proxy keine genannt
bandwidthHz Validiert keine genannt
  1. integratedLufs POST /v1/mixlab/analyze · LUFS Validiert

    Wie laut die ganze Aufnahme ist.

    Ein Pegel, keine Qualität. Vergleiche Anbieter an denselben Sätzen. Für Gesprächsaudio gibt es keinen Standard-Zielwert (Broadcast nutzt -23, Podcasts -16).

    Üblicher Bereich: keiner. Wird von deiner eigenen Gain-Staging bestimmt, nicht vom Anbieter. Vergleiche stattdessen Anbieter bei demselben Pegel.
    Marge
    ±0,1 LU. Die Toleranz von EBU Tech 3341, die der Loudness-Benchmark bei jedem Build einhält.

    Getestet gegen, und was es nicht ist: loudness.integrated

  2. truePeakDb POST /v1/mixlab/analyze · dBTP Validiert

    Der höchste Pegel, den das Signal bei der Wiedergabe erreicht, auch zwischen den Samples.

    Eine Information für Gesprächsaudio, kein Bestanden oder Durchgefallen. Über 0 heißt, dass ein Decoder oder Encoder weiter hinten in der Kette es clippen kann.

    Üblicher Bereich: keiner. Wird von deiner eigenen Gain-Staging bestimmt, nicht vom Anbieter. Vergleiche stattdessen Anbieter bei demselben Pegel.
    Marge
    +0,2 / -0,4 dB. Die Toleranz für ein True-Peak-Meter in ITU-R BS.1770, die der Loudness-Benchmark bei jedem Build einhält.

    Getestet gegen, und was es nicht ist: loudness.truePeak

  3. peakDb POST /v1/mixlab/analyze · dBFS Validiert

    Das höchste einzelne Sample.

    0 ist Full Scale. Bei höchstens 1 dB Abstand zu 0 schau auf das Clipping.

    Üblicher Bereich: keiner. Wird von deiner eigenen Gain-Staging bestimmt, nicht vom Anbieter. Vergleiche stattdessen Anbieter bei demselben Pegel.

    Getestet gegen, und was es nicht ist: level.peak

  4. averageSpeechRmsDb POST /v1/voicelab/qa · dBFS Validiert

    Wie laut die Stimme ist, während sie spricht.

    Nur über die Sprache gemessen, in dBFS, also nicht auf derselben Skala wie LUFS. Vergleiche Anbieter bei demselben Text.

    Üblicher Bereich: keiner. Wird von deiner eigenen Gain-Staging bestimmt, nicht vom Anbieter. Vergleiche stattdessen Anbieter bei demselben Pegel.

    Getestet gegen, und was es nicht ist: voice.speechLevel

  5. noiseFloorDb POST /v1/voicelab/qa · dBFS Validiert

    Der Pegel des leisesten Zehntels der Aufnahme: der Hintergrund.

    Niedriger ist sauberer. Bei echtem Rauschen liegt es 1 bis 8 dB unter dem Durchschnittspegel dieses Rauschens, weil es die leisesten Momente liest. Synthetische Stimmen haben oft digitale Stille zwischen den Wörtern: Die Engine liest dann ihre Untergrenze, -120. Es hängt davon ab, wie laut die Datei ist: Vergleiche Anbieter beim selben Sprachpegel oder nimm das Signal-Rausch-Verhältnis, das davon nicht abhängt.

    Synthetische Stimme, sauber
    -120 bis -65,4
    Menschliche Stimme, sauber
    -56,1 bis -54,2
    Menschliche Stimme, Rauschen 10 dB darunter
    -38,8 bis -37
    Synthetische Stimme, Telefonband
    -120 bis -76,1

    Getestet gegen, und was es nicht ist: voice.noiseFloor

  6. signalToNoiseDb POST /v1/voicelab/qa · dB Validiert

    Wie weit die Stimme über diesem Hintergrund steht.

    Eine Schätzung. Innerhalb von 6 dB, wenn das tatsächliche Verhältnis 10 bis 30 dB bei gleichmäßigem Rauschen beträgt. Unter 10 dB liest es sich zu hoch. Über etwa 50 dB sagt es nur, dass die Pausen sehr leise sind, oft digitale Stille: Vergleiche dort keine Zahlen.

    Synthetische Stimme, sauber
    46,8 bis 101,3
    Menschliche Stimme, sauber
    26,6 bis 29,5
    Menschliche Stimme, Rauschen 10 dB darunter
    11,9 bis 13,8
    Synthetische Stimme, Telefonband
    55,4 bis 99,5
    Marge
    ±6 dB. Gilt für gelesene Sprache mit gleichmäßigem Hintergrundrauschen bei einem tatsächlichen Verhältnis von 10 bis 30 dB (90 Prozent der Fälle). Unter 10 dB liest er zu hoch, um 3 dB oder mehr. Mit dem K2-Detektor gilt er ab 5 dB für einen Stadtplatz und für Straßenverkehr sowie gepoolt über Küche, Wohnzimmer, Flur und Kantine (90. Perzentil 4,4 dB bei 5 dB); bei 10 dB liegt der gepoolte Wert über diese vier bei 6,25 dB, und eine U-Bahn erreicht 7,3 dB; bei 0 dB liest er noch etwa 6 dB zu hoch.

    Getestet gegen, und was es nicht ist: voice.snr

  7. clipping POST /v1/voicelab/qa · Schweregrad Validiert

    Ob Samples an die Decke stießen und abgeflacht wurden.

    None, Low, Medium oder High, mit der Anzahl. Bei jeder sauberen Aufnahme, die wir gemessen haben, war es None. Behebe das zuerst: Auf einer geclippten Aufnahme lässt sich nichts anderes gut vergleichen.

    Synthetische Stimme, sauber
    None 48 von 48
    Menschliche Stimme, sauber
    None 40 von 40
    Menschliche Stimme, Rauschen 10 dB darunter
    None 40 von 40
    Synthetische Stimme, Telefonband
    None 48 von 48

    Getestet gegen, und was es nicht ist: voice.clipping

  8. speechRatio POST /v1/voicelab/qa · Anteil Proxy

    Der Anteil der Aufnahme, in dem die Stimme laut genug ist, um als Sprache zu zählen.

    Liest sich bei sauberer Sprache etwa 12 Punkte zu niedrig: leise Wortanfänge und -enden zählen als Pause. Nutze ihn, um Anbieter bei demselben Text zu vergleichen, nicht als wahren Anteil.

    Synthetische Stimme, sauber
    0,63 bis 0,72
    Menschliche Stimme, sauber
    0,54 bis 0,73
    Menschliche Stimme, Rauschen 10 dB darunter
    0,36 bis 0,58
    Synthetische Stimme, Telefonband
    0,57 bis 0,68

    Getestet gegen, und was es nicht ist: voice.speechRatio

  9. longSilences POST /v1/voicelab/qa · Anzahl Proxy

    Wie viele Pausen länger als 1,5 Sekunden zwischen Sprechabschnitten liegen.

    Tote Luft. Exakt bei 7 oder 8 von 10 sauberen Aufnahmen und bei fast allen auf eins genau. Rauschen macht es weniger verlässlich.

    Üblicher Bereich: keiner. Es hängt von deinem Text ab: Ein einzelner Satz hat keine, ein Skript mit Pausen hat mehrere. Zähle sie bei jedem Anbieter an denselben Sätzen.

    Getestet gegen, und was es nicht ist: voice.longSilences

  10. bandwidthHz POST /v1/signallab · Hz Validiert

    Die höchste Frequenz, die noch echten Inhalt trägt.

    Etwa 4.000 ist eine Telefonleitung. Breitbandige Sprache reicht bis etwa 8.000, und eine mit 44,1 oder 48 kHz abgetastete Aufnahme kann mehr zeigen. Ein Abfall bei verrauschtem Hintergrund kann bedeuten, dass der Anbieter die Höhen abschneidet, um es zu verstecken.

    Synthetische Stimme, sauber
    8.000
    Menschliche Stimme, sauber
    8.000
    Menschliche Stimme, Rauschen 10 dB darunter
    8.000
    Synthetische Stimme, Telefonband
    4.100 bis 4.200

    Getestet gegen, und was es nicht ist: provenance.bandwidthHz

Die Bereiche reichen vom 5. bis zum 95. Perzentil dessen, was die Engine gemessen hat: 48 synthetische niederländische Stimmen, 40 englische Leseaufnahmen mit sehr leisem Grundrauschen, dieselben Aufnahmen mit Wohnzimmerrauschen, das 10 dB unter der Stimme beigemischt wurde, und die synthetischen Stimmen durch ein Telefonband. Sie zeigen, was du erwarten kannst, nicht, was gut ist.

Die Bereiche sind das, was wir an sauberen und an verrauschten Aufnahmen gemessen haben. Sie sind Startpunkte, keine Standards. Für deine eigenen Limits siehe den letzten Schritt unten.

So liest du sie

  1. Schau zuerst auf das Clipping. Ist es nicht None, repariere das Audio. Auf einer geclippten Aufnahme lässt sich nichts anderes gut vergleichen.
  2. Behandle den True Peak als Information. Für Gesprächsaudio gibt es keine Standard-Obergrenze. Unsere eigenen Broadcast- und Streaming-Presets nutzen -1 oder -2 dBTP, und sie existieren für die Auslieferung, nicht für einen Voice Agent. Kodiert deine Pipeline das Audio neu, schau auf den Peak an der Stelle, an der neu kodiert wird.
  3. Lies das Rauschen mit zwei Zahlen. Das Grundrauschen sagt, wie leise der Hintergrund ist. Das Signal-Rausch-Verhältnis sagt, wie weit die Stimme darüber steht. Widersprechen sie sich, schau zuerst auf das Grundrauschen: Es ist die einfachere Messung. Es liest das leiseste Zehntel der Aufnahme, liegt also bei echtem Rauschen 1 bis 8 dB unter dem Durchschnittspegel dieses Rauschens.
  4. Schau auf die Bandbreite neben dem Rauschen. Ein Anbieter, dessen Bandbreite sinkt, wenn der Hintergrund verrauscht ist, schneidet womöglich die hohen Frequenzen ab, um das Rauschen zu verstecken. Das ist ein Kompromiss, den man sehen sollte, nicht unbedingt ein Fehler.
  5. Nutze die Proxys zum Vergleichen, nicht um Tatsachen festzustellen. Sprachanteil und lange Stille sind Proxys: Sie sagen verlässlich, welcher Anbieter bei demselben Text mehr Pausen lässt, aber der Sprachanteil ist nicht der wahre Anteil der Sprache.
  6. Lies eine Lücke, die kleiner ist als die Marge, nicht als Ergebnis. Die Marge sagt, wie weit eine Zahl von der Wahrheit entfernt sein kann. Wie gut die Differenz zwischen zwei Zahlen hält, haben wir nicht gemessen. Liegen zwei Anbieter beim Signal-Rausch-Verhältnis 3 dB auseinander und die Marge beträgt 6 dB, behandle es als Hinweis und hör dir die Aufnahmen an.
  7. Setze deine eigenen Limits aus deinen eigenen guten Aufnahmen. Nimm zwanzig Aufnahmen, die du für gut hältst. Nutze ihr 5. und 95. Perzentil als deinen Bereich und behalte die Startbereiche oben als Plausibilitätsprüfung für die Messung selbst.
  8. Vergleiche Anbieter über viele Sätze, nicht über einen. Nimm bei jedem Anbieter dieselben Sätze. Schau für jede Zahl auf den Median und die Streuung über die Sätze und darauf, bei wie vielen Sätzen es in dieselbe Richtung geht, wenn du zwei Anbieter nebeneinanderlegst. Wie gut die Differenz zwischen zwei Anbietern hält, haben wir nicht gemessen, also ist eine Lücke, die nur bei wenigen Sätzen auftaucht, ein Hinweis.

Was es nicht kann

  • Es transkribiert nicht, und es sagt keine Transkriptionsfehler aus der Audioqualität voraus. In unserem eigenen Test mit 1.248 Transkriptionen sagte das Signal-Rausch-Verhältnis keine Erkennungsfehler voraus.
  • Es sagt nicht, ob eine Stimme natürlich oder roboterhaft klingt, und es unterscheidet keine Stimmen.
  • Es misst keine Latenz, keine Unterbrechungen und keinen Sprecherwechsel.
  • Seine Hintergrund-Hinweise (sceneBackground und die anderen scene-Felder) sind Heuristiken auf den Pausen, keine Erkennung dessen, was das Rauschen erzeugt.

Die vollständige Liste steht unter was AudioLab nicht tut.

Datenschutz und Limits

  • Dein Audio wird nicht aufbewahrt. Es wird im Arbeitsspeicher in Frankfurt analysiert. Eine komprimierte Datei (MP3, FLAC, M4A) läuft über eine temporäre Datei, die gleich nach dem Dekodieren gelöscht wird. Eine Datei, die du über den Signed-Upload-Weg hochlädst, wird innerhalb einer Stunde entfernt. Wir behalten die Zahlen und, wenn du es erlaubst, den Dateinamen. Siehe /privacy.
  • Limits. Free: 1.000 Aufrufe und 2 GB im Monat, 60 Anfragen pro Minute. Plus: 10.000 Aufrufe, 20 GB, 120 pro Minute. Eine Datei darf 150 MB groß sein, wenn du eine öffentliche URL oder einen objectPath schickst. Jede akzeptierte Anfrage zählt, auch eine, die danach fehlschlägt. Ein Fehler sagt dir, was zu tun ist: /docs/errors.
  • Wo du stehst. GET /v1/usage mit deinem Schlüssel liefert den Tarif, die in diesem Monat verbrauchten Aufrufe und Daten gegenüber den Limits und die Anfragen pro Minute: dieselben Zahlen wie auf /account. Das Lesen ist kostenlos und zählt nicht als Aufruf. Prüfe es vor einem großen Batch, statt es an einem 402 zu merken.
  • Fragen zu einer Zahl. Schreib an support@audiolab.tools mit dem Feldnamen und der Datei, und wir sagen, was wir wissen.

Weiter

Weiter in General docs

Audioqualität in der CI prüfen: einen Build scheitern lassen, wenn eine Datei deine Regeln bricht →

Ein kurzes Python-Skript und ein GitHub-Workflow, die jede Audiodatei mit der AudioLab-API messen, die Zahlen mit deinen Limits vergleichen und den Build mit einer Meldung scheitern lassen, die sagt, warum.

More in General docs