Sprache-zu-Text
POST /v1/audio/transcriptions
Transkribiert Audio in Text. Kompatibel mit der OpenAI Audio Transcriptions API — derselbe Endpoint bedient OpenAI Whisper / GPT-4o-transcribe-Modelle und Google-Gemini-Modelle, und das Gateway leitet anhand der Modell-ID an den richtigen Upstream weiter. Akzeptiert entweder einen multipart/form-data -Upload (OpenAI-SDK-kompatibel) oder einen application/json Body mit Base64-kodiertem Audio.
Anfragetext
| Parameter | Typ | Beschreibung |
|---|---|---|
model* | string | Transkriptionsmodell-ID (z. B. whisper-1, gpt-4o-transcribe, chirp-3, seed-asr-bigmodel, fun-asr, qwen3-asr-flash). Siehe „Unterstützte Modelle“ unten. |
file* | file | nur multipart — die zu transkribierende Audiodatei. Erforderlich, sofern nicht input_audio angegeben ist (JSON). |
input_audio* | object | Nur JSON — { "data": "<base64>", "format": "mp3" } oder { "url": "<fetchable URL>" } für Offline-Modelle (seed-asr-bigmodel). Verwenden Sie dies anstelle von file für application/json-Anfragen. |
response_format | string | Ausgabeformat: json (Standard; gibt {text, usage} zurück), text (reine Transkript-Zeichenkette), verbose_json (Segmente mit Zeitstempeln), diarized_json (sprechermarkierte Segmente — Sprecherdiarisierung). Zulässige Werte hängen vom Modell ab; siehe „Antwortformate“ unten. |
language | string | Optionaler ISO-639-1-Hinweis (z. B. "en") zur Verbesserung von Genauigkeit und Latenz. |
prompt | string | Optionaler Text zur Steuerung des Transkriptionsstils / der Schreibweise von Eigennamen. |
temperature | number | Sampling-Temperatur 0–1. Standard: 0. |
stream | boolean | Bei true werden partielle Transkript-SSE-Events zurückgegeben (unterstützt bei gpt-4o-transcribe und Gemini). Standard: false. |
provider | object | Provider-Pass-through-Konfiguration. Siehe Provider-Pass-through unten. |
Unterstützte Modelle
Unsicher, welches Modell? Wählen Sie nach Ihrem Bedarf
| Voraussetzung | Aktivieren mit | Empfohlene Modelle |
|---|---|---|
| Chinesisch / Kantonesisch, geringe Kosten | — | seed-asr-bigmodel fun-asr |
| Englisch, hohe Qualität | — | gpt-4o-transcribe chirp-3 |
| Sprecher-Diarisierung – wer was gesagt hat | response_format=diarized_json | seed-asr-bigmodel chirp-3 gpt-4o-transcribe-diarize |
| Zeitstempel auf Wortebene | response_format=verbose_json | whisper-1 |
| Echtzeit-Untertitel (während des Sprechens) | stream=true | gpt-4o-transcribe |
| Lange Aufnahmen / Meetings | pass a public URL in input_audio.url | seed-asr-bigmodel fun-asr |
| Modell | Anbieter · Abrechnung | Eingabe | Sprechertrennung | Stream | Am besten für |
|---|---|---|---|---|---|
whisper-1 | OpenAI · $0.006/min | file | — | — | Zeitstempel auf Wortebene (verbose_json); Sprache muss ISO-639-1 sein |
gpt-4o-transcribe | OpenAI · token | file | — | ✓ | Englisch, hohe Genauigkeit; unterstützt Streaming |
gpt-4o-mini-transcribe | OpenAI · token | file | — | ✓ | Günstiger, mehrsprachig; unterstützt Streaming |
gpt-4o-transcribe-diarize | OpenAI · token | file | ✓ | — | Englische Diarisierung; optional known_speaker_names |
chirp-3 | Google · $0.016/min | file | ✓ | — | Hohe Qualität; einzelner Aufruf ≤60 s |
chirp-2 | Google · $0.016/min | file | — | — | Mehrsprachiges USM; für Diarisierung chirp-3 verwenden |
seed-asr-bigmodel | BytePlus · $0.002/min | URL / file | ✓ | — | Chinesisch, lange Aufnahmen; am günstigsten |
fun-asr | Alibaba · $0.0021/min | URL / file | ✓ | — | Chinesisch · Kantonesisch · Dialekte; lange Aufnahmen |
fun-asr-mtl | Alibaba · $0.0021/min | URL / file | ✓ | — | Mehrsprachig + Diarisierung |
fun-asr-flash | Alibaba · $0.0021/min | file | — | — | Schnell, mehrsprachig; ≤10 MB, synchron |
qwen3-asr-flash | Alibaba · $0.0021/min | file | — | — | Mehrsprachig; ≤5 min/Aufruf, exakte Abrechnung |
Diarization = response_format=diarized_json setzen, um segments[].speaker zu erhalten. Standard-Upload-Limit 25 MB (siehe Audioformate).
Google-Modelle können über die Gemini-API oder, mit einem BYOK-Vertex-Dienstkontoschlüssel, über Google Cloud Vertex AI bereitgestellt werden. Die Verfügbarkeit hängt von den für Ihren Workspace aktivierten Kanälen ab — rufen Sie /v1/models um zu sehen, was Sie verwenden können.
Häufige Stolperfallen. (1) Streaming (stream=true) funktioniert nur bei gpt-4o-transcribe / gpt-4o-mini-transcribe — jedes andere Modell gibt 400 zurück. (2) input_audio.url (URL-Eingabe) wird nur von seed-asr-bigmodel unterstützt; alle anderen Modelle erfordern einen file- oder base64-Upload. (3) Der Parameter language bei den OpenAI-Modellen (whisper-1, gpt-4o-*) muss ein ISO-639-1-Code wie en oder zh sein — Locale-Codes wie yue-CN werden abgelehnt; Chirp / Seed ASR / Qwen akzeptieren Locale-Codes, oder lassen Sie language weg zur automatischen Erkennung. (4) Wenn das Audio das Limit eines Modells pro Anfrage überschreitet, teilen Sie es in Abschnitte auf — oder verwenden Sie seed-asr-bigmodel (per URL) für lange Aufnahmen (~20 min/Anfrage). (5) Stilles Audio / Audio ohne Sprache gibt 200 mit einer leeren Zeichenkette {"text":""} zurück, keinen Fehler.
Unterstützte Audioformate
mp3wavoggflacm4a
Bei multipart-Uploads wird das Format aus der Dateiendung abgeleitet. Bei base64-Anfragen (JSON) setzen Sie input_audio.format explizit. Maximale Upload-Größe: 25 MB.
Antwortformate
Der Wert response_format die akzeptierten Werte hängen vom Modell ab. json ist der Standard für alle Modelle (gibt { text, usage }); text gibt den rohen Transkript-String zurück.
whisper-1—json,text,verbose_jsongpt-4o-transcribe,gpt-4o-mini-transcribe—json,textchirp-3,chirp-2,seed-asr-bigmodel,qwen3-asr-flash,fun-asr-flash—json,textgpt-4o-transcribe-diarize,chirp-3,seed-asr-bigmodel,fun-asr,fun-asr-mtl— alsodiarized_json(sprechermarkierte Segmente; siehe unten)
verbose_json (Segment-Zeitstempel) ist nur für whisper-1;
Sprecher-Diarisierung
Setzen Sie response_format=diarized_json, um sprecher-gelabelte Segmente zu erhalten — die Antwort fügt ein segments-Array hinzu, in dem jeder Eintrag ein speaker-Label sowie start/end-Zeitstempel (in Sekunden) trägt. Unterstützt bei gpt-4o-transcribe-diarize (OpenAI), chirp-3 (Google), seed-asr-bigmodel (BytePlus — bestes Preis-Leistungs-Verhältnis für Chinesisch und lange Aufnahmen) und fun-asr / fun-asr-mtl (Alibaba — Offline-Aufnahmedatei, akzeptiert eine URL oder Datei). Andere Modelle ignorieren diarized_json und geben Klartext zurück; chirp-2 lehnt es ab (verwenden Sie chirp-3).
Sprecher-Labels sind anbieterspezifisch (z. B. "0"/"1" bei chirp-3 und seed-asr, "A"/"B" bei gpt-4o-transcribe-diarize); sie unterscheiden einzelne Sprecher, sind aber keine stabilen realen Identitäten. Bei gpt-4o-transcribe-diarize können Sie known_speaker_names übergeben, um die Kennzeichnung zu steuern.
# Chinese meeting, cheapest diarization (BytePlus seed-asr):
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seed-asr-bigmodel",
"input_audio": { "url": "https://your-bucket/signed/meeting.wav", "language": "zh" },
"response_format": "diarized_json"
}'
# English / highest quality (Google chirp-3, <=60 s per request):
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F model=chirp-3 \
-F file=@call.wav \
-F response_format=diarized_json Beispielantwort
{
"task": "transcribe",
"text": "喂 你好 我这边是客服 有什么可以帮您",
"duration": 6.2,
"segments": [
{ "id": 0, "start": 0.10, "end": 0.90, "speaker": "0", "text": "喂 你好" },
{ "id": 1, "start": 1.20, "end": 6.20, "speaker": "1", "text": "我这边是客服 有什么可以帮您" }
]
} Beispielanfrage (multipart)
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F model=gpt-4o-transcribe \
-F file=@meeting.mp3 \
-F response_format=json \
-F language=en Beispielanfrage (base64 JSON)
POST /v1/audio/transcriptions
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"model": "gpt-4o-transcribe",
"input_audio": {
"data": "UklGRiQAAABXQVZFZm10I...",
"format": "wav"
},
"response_format": "json",
"language": "en"
} Beispiel — Offline-ASR (seed-asr-bigmodel)
seed-asr-bigmodel (BytePlus Offline-ASR im Ausland) akzeptiert zwei sich gegenseitig ausschließende Eingaben: eine abrufbare input_audio.url (empfohlen — Ihre eigene zeitlich begrenzte signierte Objektspeicher-URL; das Audio berührt niemals unseren Speicher) oder einen direkten file-/Byte-Upload (wir legen ihn in einem privaten Bucket ab und löschen ihn unmittelbar nach der Transkription). Einschränkungen: kein Streaming (stream=true gibt 400 zurück); file-Uploads bis zu 25 MB (verwenden Sie eine URL für größere Aufnahmen); die Verarbeitung pro Anfrage ist auf ca. 20 Minuten begrenzt, teilen Sie daher sehr lange Audiodateien auf. Abrechnung nach Audiodauer ($0.002/min).
# ① Quick test — replace ONLY YOUR_API_KEY and run it (uses our hosted sample audio).
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seed-asr-bigmodel",
"input_audio": {
"url": "https://synthorai-asr-sample-360831509259.s3.us-west-1.amazonaws.com/seed-asr-sample.wav",
"language": "zh"
}
}'
# → {"text":"..."}
# ② Your own audio file (<=25 MB) — replace key + file path.
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F model=seed-asr-bigmodel \
-F language=zh \
-F file=@/path/to/your-audio.wav
# ③ Your own signed URL (recommended for large files / privacy) — replace key + URL.
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"seed-asr-bigmodel","input_audio":{"url":"https://your-bucket/signed/meeting.wav","language":"zh"}}' Hinweise / Stolperfallen: (1) language ist optional — gängige Werte sind zh (Mandarin), yue-CN (Kantonesisch), en-US; lassen Sie es weg, um die Sprache automatisch zu erkennen. (2) Bei Verwendung von input_audio.url muss die URL für den Transkriptionsdienst öffentlich abrufbar sein — eine private/interne/hinter einer Authentifizierung liegende URL schlägt fehl; eine zeitlich begrenzte signierte (vorsignierte) Objektspeicher-URL ist der empfohlene Weg. (3) File-Upload und URL schließen sich gegenseitig aus; wählen Sie eine Option. (4) Audio ohne erkennbare Sprache (Stille) gibt 200 mit einer leeren Zeichenkette {"text":""} zurück, keinen Fehler.
Beispiel — OpenAI Python SDK
Der Endpunkt ist OpenAI-kompatibel, daher funktioniert das offizielle OpenAI-SDK direkt durch Überschreiben von base_url. Funktioniert identisch für whisper-1, gpt-4o-transcribe und jedes Gemini-Transkriptionsmodell — einfach model.
from openai import OpenAI
client = OpenAI(
base_url="https://synthorai.io/v1",
api_key="YOUR_API_KEY",
)
with open("meeting.mp3", "rb") as f:
result = client.audio.transcriptions.create(
model="gpt-4o-transcribe",
file=f,
language="en",
# prompt="Synthorai, BYOK, transcribe", # optional vocabulary hint
response_format="json",
)
print(result.text)
# Token-level usage on gpt-4o-*:
if getattr(result, "usage", None):
print(result.usage) Beispiel — OpenAI Node.js SDK
import OpenAI from "openai";
import fs from "node:fs";
const client = new OpenAI({
baseURL: "https://synthorai.io/v1",
apiKey: process.env.SYNTHORAI_API_KEY,
});
const result = await client.audio.transcriptions.create({
model: "gpt-4o-transcribe",
file: fs.createReadStream("meeting.mp3"),
language: "en",
response_format: "json",
});
console.log(result.text); Streaming (SSE)
Setzen Sie stream=true bei gpt-4o-transcribe, gpt-4o-mini-transcribe, oder ein beliebiges Gemini-Transkriptionsmodell, um inkrementelle Events zu erhalten, während das Audio dekodiert wird. Der Content-Type der Antwort ist text/event-stream und Events enden mit data: [DONE]. whisper-1 unterstützt kein Streaming (gibt 400 zurück, wenn stream=true).
Event-Typen, die Sie bei gpt-4o-transcribe sehen:
data: {"type":"transcript.text.delta","delta":"Hello "}
data: {"type":"transcript.text.delta","delta":"world."}
data: {"type":"transcript.text.done","text":"Hello world."}
data: {"type":"usage","usage":{"type":"tokens","input_tokens":689,"output_tokens":287,"total_tokens":976,"input_token_details":{"audio_tokens":689,"text_tokens":0,"cached_tokens":0}}}
data: [DONE] Gemini-Streaming verwendet dieselben SSE-Event-Namen, und das Gateway gibt dasselbe kanonische usage Objekt aus, das unter Beispielantwortdokumentiert ist — identisch bei OpenAI und Gemini — sodass Client-Code zwischen Providern portierbar ist. Das finale usage Event trägt immer die vollständige input_token_details Aufschlüsselung für eine genaue Abrechnung zum Audio-Tarif.
Fehler
Alle Fehler folgen dem OpenAI-Envelope: { error: { message, type, code, param? } }. Häufige Fälle:
400 model_not_found— das Modell verfügt in den Channels dieses Workspace nicht über die Transkriptionsfähigkeit.400 byok_strict_no_key— der Workspace ist strikt BYOK (byok_fallback_to_pool=false) und keinen Vault-Schlüssel für den aufgelösten Anbieter hat.400 content_policy_violation— das Feldprompthat eine Guardrail-Regel ausgelöst (z. B. Leck eines BYOK-Schlüssels).402 quota_exceeded— die geschätzten Kosten überschreiten das verbleibende Workspace-Kontingent. BYOK ist ausgenommen.408— der Anfrage-Body wurde nicht innerhalb des Server-Lese-Timeouts vollständig hochgeladen. Häufig bei großen Audiodateien über eine langsame Verbindung; erneut versuchen oder eine kleinere Datei senden.413— das Audio überschreitet die Grenze von 25 MB.502 upstream_error— Upstream-Netzwerkfehler oder Nicht-2xx-Antwort vom Modellanbieter.
Beispielantwort
{
"text": "Thanks for joining today's call. Let's get started.",
"usage": {
"type": "tokens",
"input_tokens": 689,
"output_tokens": 287,
"total_tokens": 976,
"input_token_details": {
"audio_tokens": 689,
"text_tokens": 0,
"cached_tokens": 0
}
}
} Einheitliches Usage-Objekt. Jedes token-abgerechnete Modell (gpt-4o-*, Gemini, Vertex) gibt genau diese Struktur zurück — alle Felder sind immer vorhanden, mit Null gefüllt, wenn ein Anbieter eine Teilzählung nicht meldet — sodass derselbe Client-Code die Nutzung über alle Anbieter hinweg liest. Da die Transkriptionseingabe vollständig Audio ist, melden Gemini/Vertex input_token_details.audio_tokens == input_tokens (keine Textaufteilung); OpenAI meldet seine native Audio-/Textaufteilung. cached_tokens ist der Anteil der Eingabe, der aus einem anbieterseitigen Cache bereitgestellt wird.
whisper-1 ist die einzige Ausnahme: Es wird nach Audiodauer abgerechnet, nicht nach Token, daher enthält seine Antwort kein Token-Usage-Objekt. Mit response_format=text ist der Antwort-Body die rohe Transkript-Zeichenfolge anstelle eines JSON-Objekts.