ページではなく、ストリームを貼り付けます。放送局の実際の音声は .mp3、.aac、.m3u8 で終わるアドレスにあり、一度リアルタイム文字起こしがそれを受け取れば、誰かが聴いている必要はありません。
ラジオ局3つ、テレビ配信2つ、YouTubeのライブ数本を監視する報道部には、文字起こしの前に人手の問題があります。誰かが聴いていなければならず、誰かが録音ボタンを押さなければなりません。ストリームを入力にしたリアルタイム文字起こしが、この両方の仕事を引き受けます。ストリームのアドレスを渡せば、サーバーがそれを開き、デコードし、放送されるそばから文字起こししてくれるので、記者会見が予定より早く始まっても、デスクに誰かがいる必要はありません。難しいのは、そのアドレスを見つけることだと分かってきました。
リアルタイム文字起こしは、サーバーが自分で取得するストリームから音声を得ることができます。インターネットラジオ局、HLSプレイリスト(.m3u8)、DASHマニフェスト(.mpd)、YouTubeのライブがこれにあたります。ダッシュボードでは、マイク入力ではなくストリームを入力とする新しいリアルタイム文字起こしを、Transcriptions → New → Live から作成します。アドレスは文字起こしを作成する時に設定され、後から変わることはありません。そのため、監視の設定は一度行えば、局の放送が記録する価値のある時にいつでも開始できます。
アドレスは、それを再生するウェブページではなく、ストリームそのものでなければなりません。放送局のページはHTMLで、再生される音声は通常、IcecastやShoutcastのサーバーなど別の場所にあり、ページのプレーヤーは読み込まれた後にJavaScriptでそのアドレスを見つけます。サイト内で「Listen」「Direct stream」「Other players」というリンクを探してください。そのリンクは .mp3、.aac、.m3u、.m3u8、.pls で終わります。.pls と .m3u も音声ではありません。数行の短いテキストファイルで、それぞれがストリームのアドレスを示しています。デスクトップのプレーヤーに1つのリンクを渡せるように存在するもので、VocalStackは、そこに書かれたストリームを文字起こしします。代わりにページを貼り付けると、VocalStackはそれを取得し、HTMLが返ってくることを見つけて、そのことを伝えます。放送局ごとにストリームの隠し方は少しずつ違いますが、多くは「Listen」と書かれたボタンの裏に隠しています。ページの中で押す価値が一番ないのが、このボタンです。
2種類のリンクは最初から受け付けません。Spotify、SoundCloud、Twitchのようなメディアを再生するページへのリンクは、接続される前に拒否されます。著作権保護されたストリームも対象外です。DRMライセンスを必要とするプレイリストやマニフェストは、その旨を伝えるメッセージとともに失敗します。また、局の国外からのリクエストを拒否するストリームもあるため、事務所では再生できるアドレスが、海外のサーバーからは再生できないことがあります。ブラウザでは再生できるのにVocalStackでは再生できない場合、その局は他のプレーヤーを拒否しています。他のアプリにもアドレスの利用を認めてほしいと局に頼んでください。ほとんどの局は、MP3、AAC、またはHLSのストリームを提供しています。正しいアドレスが手に入ったら、次の問いは、それが終わるかどうかです。
ライブのストリームは終わることがないので、ファイルではありません。この違いは特にYouTubeで重要です。放送中のYouTubeライブはリアルタイム文字起こしに入れると、ダッシュボードが放送に合わせて追跡します。予定されているがまだ始まっていないYouTubeライブは Not live yet と表示され、放送が始まってから録音できます。終了した動画は別物です。長さがあるため、ファイルとして文字起こしされます。リンクを Transcriptions → New に貼り付けてください。
再生リスト自体が、それがどちらなのかを示しており、どのプレーヤーもその違いを見分けています。終了したHLSのプレイリストには #EXT-X-ENDLIST タグか #EXT-X-PLAYLIST-TYPE:VOD があります。ライブのものにはどちらもなく、新しいセグメントを追加し続けるため、プレーヤーは数秒ごとにそれを取得し直します。DASHのマニフェストは、放送中は type="dynamic"、録画になると type="static" と宣言します。IcecastサーバーのMP3やAACストリームには長さがまったくなく、ただ止まらないのです。
コードから行う場合は、保存される前に GET /v1/transcriptions/probe?url= で判定できます。レスポンスの kind は、放送中または予定されているYouTubeライブ、終わりのないHTTPストリーム、終わりのないHLSプレイリスト、動的なDASHマニフェストの場合は live になります。終わりのあるものは file、probeで判定できなかった場合は unknown になります。リンクがメディアとして開けなかった場合、ok は false になり、problem に画面に表示できる一文が入ります。probeは何も保存せず、1分あたり60回までの呼び出しに制限されています。
ファイルの文字起こしは再生される速度の何倍もの速さで処理されるため、終了した1時間分のテレビ番組が1時間かかるわけではありません。ライブのストリームはリアルタイムで文字起こしされますが、「リアルタイム」でも放送からはすでに遅れており、どれだけ遅れるかを知っておく価値があります。Icecastストリームは、マイクに入ってから数秒遅れてプレーヤーに届きます。HLSやDASHはセグメントに分けられており、プレーヤーは約6秒のセグメントを2〜3個受け取るまで再生を始めません。そのためHLSストリームは、文字起こしが独自に加える遅延の前に、通常10〜30秒遅れて届きます。文字起こしの行が遅れて届くように見える場合、多くは文字起こし側ではなく局側の遅延です。1本のストリームからは1つの録音が作られます。デスクでは複数を並行して扱いますが、すべて同じ場所に集まります。
リアルタイム文字起こしはどれも、ファイルと並んで文字起こしライブラリに入ります。各録音は文字起こしテキストとともに保存され、言葉が確定すると、すべての言語でタイトルと要約が書かれます。話されている言語は自動的に検出され、話し手はいつでも言語を切り替えてかまいません。言語が分かっている場合は、それを指定すると文字起こしの品質が上がります。
ライブラリは言語をまたいで検索できます。どの言語の文字起こしもまとめて検索し、結果を自分の言語で受け取れます。英語しか読まない記者でも、ルーマニア語の放送局の朝の番組を、大臣の名前で検索し、結果を英語で読めます。それぞれの結果には、元の文字起こしと発言された時刻が付いています。その大臣の名前は、3つの局で3通りに綴られているかもしれません。英語で検索すれば、3通りの綴りをそれぞれ探して読む手間が省けます。
文字起こしは、1つの録音を最大10の言語に同時に翻訳できるため、デスクが扱うすべての言語で同じ録音を読めます。検索結果は、引用できて初めて役立ちます。
文字起こしは、ただの長い文章ではありません。APIの GET /v1/recordings/{id}/transcript は sentences、単語ごとのタイミングを含む segments、そして speakers を返すため、引用を録音のどの秒にあたるかまで特定できます。ダッシュボードはライブ録音を到着したままの音声とともに再生するので、引用する前にその文を聴いて確認できます。
ラジオ音声の文字起こしは、どのシステムのものであっても、信用する前に知っておくべき点が2つあります。音声認識は固有名詞、地名、数字で最も間違えやすく、これは記者が検索するまさにそれらの語です。認識器が一度も見たことのない名前は、最も近い一般的な単語として出力され、正しい綴りで検索すると見つかりません。代わりに、同じ息継ぎの中で話された、特徴のある単語を検索し、その前後を読んでください。また、ラジオは音声だけではありません。背景の音楽、ジングル、広告の枠は、文のように見えても文ではない行を生みます。引用する前に音声を確認してください。
話者ラベルには3つの設定があります。オフ、オン、または When Needed で、2人目の話者が聞こえた時点でラベルを表示します。録音内の話者に名前を付けられ(PUT /v1/recordings/{id}/speakers/{idx})、一度その話者の声が登録されると、以降の録音ではその人を名前で認識します。毎朝出演する番組を持つ局では、最初の1週間が過ぎると、ラベルは「Speaker 2」ではなくなります。引用を確認したら、次はそれを記事として外に出す番です。
文字起こしのExportタブにある各形式には、報道部での役割があります。SRTは動画編集者に渡し、ストリームから切り出したクリップに字幕を付けます。翻訳したSRTは、別の言語の字幕を付けます。Excelは調査担当者に渡します。1文につき1行で時刻が付いており、絞り込みや注釈付けができます。PDFは、電車の中で1時間分をまるごと読みたい編集者に向きます。JSONは、デスクの独自ツールを書いている人に渡します。APIでは、エクスポートは GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf で行い、翻訳版には lang= を付けます。Download audio は、パッケージ用に録音をMP3で渡します。
放送を監視して報道に使うのは、報道では普通のことです。一方、その一部を再掲載することは別の行為です。それは、お住まいの地域のフェアディーリングまたはフェアユースの規定と、放送局自身の利用規約に従います。そのため、競合他社の報道を引用する際のデスクの通常のルールは、競合他社の音声にも適用されます。上記のすべてはダッシュボードでの数クリックで行えますが、20の局を扱うデスクでは、スクリプト化したほうが良いでしょう。
この一連の流れはすべてAPIにあり、どのプランにも含まれ、ダッシュボードと同じ料金で課金されます。ストリームを入力とするリアルタイム文字起こしは、待機状態で作成され、最初の録音によって開始され、HTTPで制御します。サーバーが音声を取得するため、録音を開始しても、音声を送るためのストリームは返されません。こちら側で音声を送信する処理は不要です。
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"
Idempotency-Key を付けると、再試行された作成リクエストは2つ目の文字起こしを作るのではなく、最初の文字起こしを返します。TypeScriptとPythonのSDKは同じ呼び出しをラップしており、開発者向けエリア からダウンロードできます。すべてのルートとそのリクエスト・レスポンスの形式は APIリファレンス にあります。
AIエージェントは、コードをまったく書かずにライブラリを操作できます。/v1/mcp のMCPサーバーは、エージェントにツールのセットを提供します。このうちここで重要なのは4つです。search_transcriptions はアカウント内のすべての文字起こしを、どの言語でも検索し、一致した行を、それが含まれる文字起こしと発言された時刻とともに返します。get_summary は録音の要約を返します。transcribe_url と wait_for_transcription は、終了した動画や録音のリンクを文字起こしし、結果を待ちます。ライブストリームの監視を開始する作業は、ダッシュボードか上記のAPIに任せてください。Claude Code、Cursor、その他のStreamable HTTPクライアントの設定は、開発者向けエリアの「Developers → Connect an AI agent」にあります。MCPの記事 で手順を説明しています。このスクリプトを動かす費用が、最後の問題です。
リアルタイム文字起こしは、音声1時間あたり$0.60で、1秒単位で課金されます(1分あたり$0.01)。最低課金は1回の文字起こしにつき5分です。ライブは、リアルタイムで文字起こしし、実行されている間ずっと料金がかかるため、ファイルよりも高くなります。ファイルは1時間あたり$0.20(1分あたり$0.0033、30分のファイルは$0.10)です。料金はすべてのプランとAPIで同じで、翻訳、要約、話者への名前付け、ブロードキャスト、共有は、請求額には加算されません。
1日8時間、週5日、1局を監視すると、ライブは40時間になり、週あたり$24です。デスクがどの言語で読むかは関係ありません。
監視に関わる上限はプランによって異なります。各項目は、従量課金、Premium、Enterpriseの順に記載します。
新規アカウントには、$5のサインアップクレジットがカードなしで付与されます。これは、8時間を超えるライブ監視を試すのに十分な額です。全料金表は料金ページにあります。