粘贴流媒体地址,而不是网页。电台的真实音频位于以 .mp3、.aac 或 .m3u8 结尾的地址;实时转录一旦获取到该地址,就无需有人守着收听。
一个同时监测三家电台、两路电视直播流和几个 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 同样不是音频,它们是只有几行的短文本文件,每行给出一个流媒体地址;它们的存在是为了让桌面播放器只需一个链接即可打开,而 VocalStack 会转录它所指向的流。如果您粘贴的是网页,VocalStack 会请求该页面,发现返回的是 HTML,并告知您。每家电台隐藏流媒体地址的方式略有不同,大多数藏在标有“Listen”的按钮后面,而这恰恰是页面上最不值得点击的东西。
有两类链接会被直接拒绝。播放媒体的页面(如 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 为 live 时,表示正在播出或已预定的 YouTube 直播、无尽头的 HTTP 流、没有结尾的 HLS 播放列表,或动态 DASH 清单。kind 为 file 时,表示有明确结尾的内容;无法判断时则为 unknown。如果链接无法作为媒体打开,ok 为 false,problem 则是一句可以直接展示的说明。探测不保存任何内容,并限制为每分钟 60 次调用。
文件转录的运行速度远快于音频的播放速度,因此一小时的电视节目并不需要一小时才能完成。实时流则按实时速度转录,但“实时”本身已经落后于播出,落后多少值得了解。Icecast 流在麦克风收音之后数秒才会到达播放器。HLS 和 DASH 是分段传输的,播放器必须先缓存两到三个各约六秒的分段才会开始播放,因此 HLS 流通常比播出落后 10 至 30 秒,转录本身还会再增加延迟。看似迟到的字幕,通常是电台的延迟,而不是转录器的问题。一个流生成一条录音;一张办公桌可以同时运行多路,它们最终都汇集到同一处。
每个实时转录都会进入转录资料库,与所有文件并列。每条录音都与其转录文本一同保存;一旦文字定稿,系统就会为其生成标题和摘要,并提供所有语言版本。口语语言会被自动检测,说话人也可以随时切换语言。若您已知语言,指定语言可以提高转录质量。
资料库支持跨语言搜索:可以在任何语言的所有转录文本中搜索,并以您的语言获得结果。一位只会阅读英语的记者,可以在一家罗马尼亚电台的晨间节目中搜索某位部长的名字,并以英语阅读命中结果,每条都附带其来源转录和说出的时间。同一个名字在三家电台的拼写可能各不相同;用英语搜索,就无需逐一阅读三种写法。
转录可同时翻译成最多 10 种语言,因此同一段录音可以用编辑部所用的每种语言阅读。搜索结果只有能够被引用时才有用。
转录文本并非一大段文字。API 的 GET /v1/recordings/{id}/transcript 会返回 sentences、带有词级时间的 segments 以及 speakers,因此可以把引语精确到录音中的秒。控制台会按原样重放实时录音及其音频,因此在引用之前,可以先听一遍这句话。
在信任任何广播音频的转录文本之前,无论来自哪个系统,有两点值得了解。语音识别最容易在专有名词、地名和数字上出错,而这些恰恰是记者搜索的内容。识别器从未见过的名字会被识别为最接近的常见词,因此搜索正确拼写会漏掉它。应改为搜索与它同一口气说出的一个独特词,然后阅读命中结果的上下文。另外,广播并非全是语音:配乐、片头曲和广告时段会产生看似句子、实则不是句子的文字行。引用之前请核对音频。
说话人标签有三种设置:关闭、开启,或 When Needed,后者会在听到第二位说话人后才显示标签。您可以为录音中的说话人命名(PUT /v1/recordings/{id}/speakers/{idx}),一旦某位说话人的声音被登记,之后的录音就能按名字识别他。对于每天早上都会出现的主持人所在的电台,标签在第一周之后就不再是“Speaker 2”了。引语核对无误后,就该送出编辑部了。
在转录的 Export 标签页中,每种格式都有其在新闻编辑室中的用途。SRT 交给视频编辑,因此从流中剪出的片段可以带上字幕;翻译后的 SRT 则带有另一种语言的字幕。Excel 交给研究人员,每句一行并附上时间,便于筛选和批注。PDF 给想在火车上阅读整小时内容的编辑。JSON 给正在编写编辑部自有工具的人。通过 API 导出为 GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf,若需要翻译版本,则加上 lang=。Download audio 会将录音以 MP3 格式提供,供直接用于稿件包。
为广播做监测是新闻报道的常规做法,而转播其中的片段则是另一回事。它受您所在地的合理使用或公平使用原则约束,同时也受电台自身条款的约束,因此编辑部引用竞争对手内容的常规规定,同样适用于竞争对手的音频。以上所有操作在控制台中只需几次点击即可完成;如果编辑部要监测二十家电台,则更适合用脚本实现。
完整流程都在 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 可确保重试的创建请求返回第一次创建的转录,而不是产生第二个。TypeScript 和 Python SDK 封装了同样的调用,可从 Developers area 下载;API reference 列出了每条路由及其帧格式。
AI 智能体无需任何代码即可操作该资料库。位于 /v1/mcp 的 MCP 服务器为智能体提供一组工具,其中有四个与此相关。search_transcriptions 在账户的所有转录中搜索说过的内容,不限语言,并返回匹配的文字行,每行附带其所在的转录及说出的时间。get_summary 返回录音的摘要。transcribe_url 和 wait_for_transcription 用于转录一个已结束的视频或录音链接,并等待结果。启动实时流监测仍需通过上述控制台或 API 完成。Claude Code、Cursor 或任何 Streamable HTTP 客户端的设置位于 Developers → Connect an AI agent 下;MCP 文章详细介绍了配置步骤。最后一个问题是,这套脚本运行要花多少钱。
实时转录每小时音频 $0.60,按秒计费(即每分钟 $0.01),每次转录最低 5 分钟。由于实时转录是边播出边转录,且运行多久就计费多久,因此它比文件转录更贵。文件转录为每小时 $0.20(即每分钟 $0.0033;一个 30 分钟的文件费用为 $0.10)。各套餐及 API 的费率相同,翻译、摘要、说话人命名、广播和分享均不会增加费用。
每天监测一家电台八小时、每周五天,即每周 40 个实时小时:每周 $24,无论编辑部以几种语言阅读。
对监测任务影响最大的限制因套餐而异。以下每项均按按量付费、Premium、Enterprise 的顺序列出:
新账户会获得 $5 的注册额度,无需绑定银行卡,足以用来试用超过八小时的实时监测。完整的表格见价格页面。