Fügen Sie den Stream ein, nicht die Seite. Die echte Audioquelle eines Senders liegt unter einer Adresse, die auf .mp3, .aac oder .m3u8 endet, und sobald eine Live-Transkription sie hat, muss niemand mehr zuhören.
Eine Redaktion, die drei Radiosender, zwei Fernsehstreams und ein paar YouTube-Livestreams beobachtet, hat zuerst ein Personalproblem, bevor sie ein Transkriptionsproblem hat. Jemand muss zuhören, und jemand muss die Aufnahme starten. Eine Live-Transkription mit einem Stream als Quelle übernimmt beide Aufgaben: Sie geben ihr die Adresse des Streams, der Server öffnet ihn, dekodiert ihn und transkribiert ihn, während er gesendet wird. So muss niemand am Schreibtisch sitzen, wenn eine Pressekonferenz früher beginnt. Die eigentliche Schwierigkeit ist, wie sich herausstellt, das Finden der Adresse.
Eine Live-Transkription kann ihr Audio aus einem Stream beziehen, den der Server selbst abruft: einem Internetradio, einer HLS-Playlist (.m3u8), einem DASH-Manifest (.mpd) oder einem YouTube-Livestream. Im Dashboard ist das eine neue Live-Transkription unter Transcriptions → New → Live, deren Quelle ein Stream statt des Mikrofons ist. Die Adresse wird beim Anlegen der Transkription festgelegt und ändert sich nie. Ein Monitor wird deshalb einmal eingerichtet und dann gestartet, wann immer der Sender aufnahmewürdig ist.
Die Adresse muss der Stream selbst sein, nicht die Webseite, die ihn abspielt. Die Seite eines Senders ist HTML; das Audio, das sie abspielt, kommt von anderswo, meist von einem Icecast- oder Shoutcast-Server, und der Player der Seite findet diese Adresse per JavaScript, nachdem sie geladen wurde. Suchen Sie auf der Website nach einem Link namens „Listen“, „Direct stream“ oder „Other players“; er endet auf .mp3, .aac, .m3u, .m3u8 oder .pls. Eine .pls- oder .m3u-Datei ist ebenfalls kein Audio. Sie ist eine kurze Textdatei aus wenigen Zeilen, deren jede die Adresse eines Streams nennt; sie existiert, damit Desktop-Player mit einem einzigen Link versorgt werden können, und VocalStack transkribiert den Stream, den sie nennt. Fügen Sie stattdessen die Seite ein, fordert VocalStack sie an, erhält HTML zurück und teilt Ihnen das mit. Jeder Sender versteckt seinen Stream ein wenig anders; die meisten verbergen ihn hinter einem Knopf mit der Aufschrift „Listen“, und genau das ist das Einzige auf der Seite, auf das man nicht klicken sollte.
Zwei Arten von Links werden von vornherein abgelehnt. Links zu Seiten, die Medien abspielen, etwa Spotify, SoundCloud oder Twitch, werden abgewiesen, bevor überhaupt eine Verbindung besteht. Kopiergeschützte Streams werden ebenfalls nicht unterstützt: Eine Playlist oder ein Manifest, das eine DRM-Lizenz benötigt, schlägt mit einer Meldung fehl, die genau das sagt. Manche Streams verweigern außerdem Anfragen von außerhalb des Landes des Senders, sodass eine Adresse, die im Büro abgespielt wird, auf einem Server im Ausland möglicherweise nicht läuft. Spielt ein Stream im Browser, aber nicht in VocalStack, blockt der Sender andere Player; bitten Sie ihn dann um eine Adresse, die andere Apps verwenden dürfen. Die meisten bieten einen MP3-, AAC- oder HLS-Stream an. Sobald Sie die richtige Adresse haben, stellt sich die nächste Frage: Hört der Stream irgendwann auf?
Ein Live-Stream endet nie, daher ist er keine Datei. Der Unterschied ist besonders bei YouTube wichtig. Ein YouTube-Livestream, der gerade sendet, gehört in eine Live-Transkription, und das Dashboard folgt ihm, während er läuft. Ein YouTube-Livestream, der geplant, aber noch nicht gestartet ist, wird als Not live yet angezeigt und kann aufgezeichnet werden, sobald er sendet. Ein abgeschlossenes Video ist etwas anderes: Es hat eine Länge und wird daher als Datei transkribiert. Fügen Sie den Link unter Transcriptions → New ein.
Die Playlist selbst sagt, um welche Art es sich handelt, und so unterscheidet jeder Player zwischen beiden. Eine abgeschlossene HLS-Playlist enthält das Tag #EXT-X-ENDLIST oder #EXT-X-PLAYLIST-TYPE:VOD; eine Live-Playlist hat keines von beiden und wächst weiter, daher lädt der Player sie alle paar Sekunden neu, um neue Segmente zu holen. Ein DASH-Manifest deklariert type="dynamic", solange die Übertragung läuft, und type="static", sobald es eine Aufzeichnung ist. Ein MP3- oder AAC-Stream von einem Icecast-Server hat überhaupt keine Länge; er endet einfach nie.
Aus dem Code heraus klärt GET /v1/transcriptions/probe?url= dies, bevor irgendetwas gespeichert wird. Die Antwort enthält kind: Es ist live für einen YouTube-Livestream, der gerade sendet oder geplant ist, für einen endlosen HTTP-Stream, für eine HLS-Playlist ohne Ende oder für ein dynamisches DASH-Manifest. Es ist file für alles mit einem Ende und unknown, wenn die Probe es nicht feststellen konnte. Wenn sich der Link nicht als Medium öffnen ließ, ist ok gleich false, und problem enthält einen Satz, den Sie anzeigen können. Die Probe speichert nichts und ist auf 60 Aufrufe pro Minute begrenzt.
Dateitranskriptionen laufen um ein Vielfaches schneller als das Audio abgespielt wird, daher dauert eine abgeschlossene Stunde Fernsehen nicht eine Stunde. Ein Live-Stream wird in Echtzeit transkribiert, doch „Echtzeit“ läuft bereits hinter der Sendung zurück, und es lohnt sich zu wissen, um wie viel. Ein Icecast-Stream erreicht einen Player einige Sekunden nach dem Mikrofon. HLS und DASH sind segmentiert, und ein Player startet erst, wenn er zwei oder drei Segmente von je etwa sechs Sekunden hat. Daher liegt ein HLS-Stream typischerweise 10 bis 30 Sekunden hinter der Sendung, bevor die Transkription ihre eigene Verzögerung hinzufügt. Eine Zeile, die scheinbar verspätet ankommt, liegt meist an der Verzögerung des Senders und nicht an der Transkription. Jeder Stream ergibt eine Aufnahme; ein Schreibtisch betreibt mehrere, und am Ende landen alle an derselben Stelle.
Jede Live-Transkription landet in der Transkriptionsbibliothek neben jeder Datei. Jede Aufnahme wird mit ihrem Transkript gespeichert, und sobald die Worte endgültig feststehen, werden für sie ein Titel und eine Zusammenfassung geschrieben, und zwar in jeder Sprache. Die gesprochene Sprache wird automatisch erkannt, und Sprecher dürfen jederzeit die Sprache wechseln. Wenn Sie die Sprache kennen, verbessert ihre Angabe die Transkriptionsqualität.
Die Bibliothek ist sprachübergreifend durchsuchbar: Durchsuchen Sie alle Transkripte, unabhängig von ihrer Sprache, und erhalten Sie die Ergebnisse in Ihrer eigenen. Wer nur Englisch liest, kann die Morgensendung eines rumänischen Senders nach dem Namen eines Ministers durchsuchen und die Treffer auf Englisch lesen, jeweils mit der Transkription, aus der sie stammen, und dem Zeitpunkt, zu dem das Gesagte fiel. Der Name des Ministers wird bei drei Sendern auf drei Arten geschrieben; wer auf Englisch danach sucht, spart sich das Lesen aller drei Varianten.
Eine Transkription kann gleichzeitig in bis zu 10 Sprachen übersetzt werden, sodass dieselbe Aufnahme in jeder Sprache erscheint, mit der die Redaktion arbeitet. Ein Suchtreffer ist nur dann nützlich, wenn Sie ihn zitieren können.
Ein Transkript ist keine Textwand. Der API-Endpunkt GET /v1/recordings/{id}/transcript liefert sentences, segments mit Wortzeitmarken und speakers, sodass ein Zitat auf die Sekunde genau in der Aufnahme verortet werden kann. Das Dashboard spielt eine Live-Aufnahme genau so ab, wie sie eingegangen ist, mit ihrem Audio, sodass ein Satz angehört werden kann, bevor er zitiert wird.
Bevor Sie einem Transkript von Radioaudio vertrauen, gleich aus welchem System, sollten Sie zwei Dinge wissen. Spracherkennung scheitert am häufigsten an Eigennamen, Orten und Zahlen, also genau dem, wonach Reporter suchen. Ein Name, den der Erkenner noch nie gehört hat, wird zum nächstliegenden gängigen Wort, und eine Suche nach der richtigen Schreibweise verfehlt ihn. Suchen Sie stattdessen nach einem markanten Wort, das im selben Atemzug gesagt wurde, und lesen Sie dann die Umgebung des Treffers. Außerdem ist Radio nicht nur Sprache: Musikbetten, Jingles und Werbeblöcke erzeugen Zeilen, die wie Sätze aussehen, es aber nicht sind. Prüfen Sie das Audio, bevor Sie zitieren.
Sprecherkennzeichnungen haben drei Einstellungen: aus, an oder When Needed, das Kennzeichnungen erst zeigt, sobald ein zweiter Sprecher zu hören ist. Sie können einen Sprecher in einer Aufnahme benennen (PUT /v1/recordings/{id}/speakers/{idx}), und sobald die Stimme eines Sprechers registriert ist, erkennen künftige Aufnahmen ihn mit Namen. Bei einem Sender, dessen Moderatoren jeden Morgen wiederkehren, heißen die Kennzeichnungen nach der ersten Woche nicht mehr „Speaker 2“. Ist das Zitat geprüft, muss es das Haus verlassen.
Jedes Format auf dem Export-Reiter einer Transkription hat in der Redaktion eine eigene Aufgabe. SRT geht an den Videoschnitt, sodass ein Clip aus dem Stream Untertitel trägt; ein übersetztes SRT trägt sie in einer anderen Sprache. Excel geht an die Recherche, mit einer Zeile pro Satz samt Zeitangabe, um gefiltert und annotiert zu werden. PDF ist für alle gedacht, die die ganze Stunde unterwegs im Zug lesen wollen. JSON geht an alle, die die eigenen Werkzeuge der Redaktion schreiben. Über die API lautet der Export GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, mit lang= für eine übersetzte Fassung. Download audio liefert die Aufnahme als MP3 für das Paket selbst.
Eine Sendung zur Berichterstattung zu beobachten ist übliche Redaktionspraxis. Einen Ausschnitt davon erneut zu veröffentlichen ist etwas anderes. Dafür gelten die jeweiligen Ausnahmen für Zitate und faires Verwenden (Fair Dealing bzw. Fair Use) am Ort der Redaktion sowie die eigenen Nutzungsbedingungen des Senders, und die üblichen Hausregeln der Redaktion zum Zitieren eines Konkurrenten gelten auch für dessen Audio. Alles oben Genannte ist im Dashboard mit wenigen Klicks erledigt; bei einer Redaktion mit zwanzig Sendern lohnt es sich, es zu skripten.
Der gesamte Weg läuft über die API, ist in jedem Tarif enthalten und wird zum selben Satz abgerechnet wie im Dashboard. Eine Live-Transkription mit einer Stream-Quelle wird im Ruhezustand angelegt, mit ihrer ersten Aufnahme gestartet und über HTTP gesteuert. Da der Server das Audio selbst abruft, gibt der Aufnahmestart keinen Stream zurück, in den Sie etwas senden müssten: Auf Ihrer Seite wird kein Audio übertragen.
API=$VOCALSTACK_API_ORIGIN # the origin shown in the API reference
AUTH="Authorization: Bearer $VOCALSTACK_API_KEY"
# A live transcription whose source the server pulls itself.
TX=$(jq -n '{name: "Morning show", source: {kind: "stream", url: "https://example.org/live.mp3"},
settings: {speakerLabels: "auto"}}' \
| curl -sSf "$API/v1/transcriptions/live" -H "$AUTH" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" -d @- | jq -r .id)
# Start recording: the server opens the stream now.
REC=$(curl -sSf -X POST "$API/v1/transcriptions/$TX/recordings" -H "$AUTH" \
-H "Content-Type: application/json" -d '{}' | jq -r .recording.id)
# Later: pause, then stop (a live recording must be paused before it is stopped).
curl -sSf -X POST "$API/v1/recordings/$REC/pause" -H "$AUTH"
curl -sSf -X POST "$API/v1/recordings/$REC/stop" -H "$AUTH" -H "Content-Type: application/json" -d '{}'
# Search everything that was said, in English.
curl -sSfG "$API/v1/search" -H "$AUTH" --data-urlencode "q=budget" --data-urlencode "lang=en"
Der Idempotency-Key sorgt dafür, dass ein wiederholtes Anlegen die erste Transkription zurückgibt statt einer zweiten. Die TypeScript- und Python-SDKs kapseln dieselben Aufrufe und können im Entwicklerbereich heruntergeladen werden; die API-Referenz enthält jede Route und ihre Frames.
Ein KI-Agent kann die Bibliothek ganz ohne Code bearbeiten. Der MCP-Server unter /v1/mcp stellt dem Agenten eine Reihe von Werkzeugen zur Verfügung, von denen vier hier wichtig sind. search_transcriptions durchsucht, was über alle Transkriptionen des Kontos hinweg gesagt wurde, in jeder Sprache, und liefert die passenden Zeilen zurück, jeweils mit der Transkription, in der sie vorkommen, und dem Zeitpunkt, zu dem sie gesagt wurden. get_summary liefert die Zusammenfassung einer Aufnahme. transcribe_url und wait_for_transcription transkribieren ein abgeschlossenes Video oder den Link einer Aufnahme und warten auf das Ergebnis. Einen Live-Stream-Monitor zu starten bleibt dem Dashboard oder der oben beschriebenen API vorbehalten. Die Einrichtung für Claude Code, Cursor oder jeden Streamable-HTTP-Client finden Sie unter Developers → Connect an AI agent; der MCP-Artikel führt Schritt für Schritt hindurch. Was das Skript im Betrieb kostet, ist die letzte Frage.
Live-Transkription kostet $0.60 pro Stunde Audio, abgerechnet pro Sekunde ($0.01 pro Minute), mit einer Mindestdauer von 5 Minuten pro Transkription. Live ist teurer als eine Datei, weil sie während des Geschehens transkribiert wird, so lange, wie sie läuft. Dateien kosten $0.20 pro Stunde ($0.0033 pro Minute; eine 30-minütige Datei kostet $0.10). Die Preise sind in jedem Tarif und über die API gleich, und Übersetzungen, Zusammenfassungen, die Benennung von Sprechern, Übertragungen und Freigaben erhöhen die Rechnung nie.
Ein Sender, der acht Stunden am Tag an fünf Tagen in der Woche beobachtet wird, sind 40 Live-Stunden: $24 pro Woche, unabhängig davon, in wie vielen Sprachen die Redaktion ihn liest.
Die für das Monitoring wichtigen Grenzen unterscheiden sich je nach Tarif. Jede wird in der Reihenfolge Pay as you go, Premium, Enterprise aufgeführt:
Ein neues Konto startet mit einem Guthaben von $5 und ohne Karte, was mehr als acht Stunden Live-Monitoring zum Ausprobieren ergibt. Die vollständige Tabelle steht auf der Preisseite.