关于 speech-to-text
这是一个 Deepgram Skill,指导开发者选择 Nova 或 Flux STT,并发起首次转录请求。内容侧重模型选择、端点和主要差异;详细参数参考另见 `api` Skill。
主要功能
- 01比较 Nova 与 Flux STT
- 02选择端点和模型
- 03开始预录音频转录
- 04通过 WebSocket 流式传音频
- 05配置轮次检测
适用场景
- 01转录录制音频
- 02生成字幕
- 03构建带轮次检测的语音界面
- 04选择 Deepgram 语音模型
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ deepgram/ skills --skill speech-to-text安装后在 Claude Code 中输入/speech-to-text确认已加载。
详细介绍
Deepgram 语音转文本
Deepgram 通过两个端点上的两类模型转录音频。请先选择模型系列;端点、参数和消息格式都取决于这一选择。本技能将帮助你完成第一个请求,并说明接下来要打开哪个技能。它不会重复完整的参数参考;相关内容请参阅 api 技能。
先选择模型系列
| Nova | Flux STT | |
|---|---|---|
| 模型名称 | nova-3(nova-3-general 的别名)、nova-3-medical、nova-3-pharma | flux-general-en(英语)、flux-general-multi(10 种语言) |
| 端点 | /v1/listen,支持 REST 和 WebSocket | /v2/listen,仅支持 WebSocket |
| 输出 | 转录文本流 | TurnInfo 事件,包含轮次状态和每轮的转录文本 |
| 轮次检测 | 未内置;需使用 endpointing 和自定义逻辑 | 内置:StartOfTurn、EagerEndOfTurn、TurnResumed、EndOfTurn |
| 格式化和分析 | smart_format、diarize_model、summarize、sentiment、topics、intents、脱敏 | 词级时间戳、numerals、redact(numbers 或 aggressive_numbers)、keyterm、profanity_filter、mip_opt_out、tag;不支持智能格式化和说话人分离 |
| 语言 | language=<code>;或使用 language=multi 进行语码转换,此时 language_hint 用于提供偏向 | 模型名称决定语言;language_hint 用于为 flux-general-multi 提供偏向 |
选择规则:
- 转录录制文件、生成字幕、需要说话人标签、需要摘要或情感分析,或者流式传输音频且由自己的代码判断短语何时结束时,选择 Nova。
- 当有人与软件交谈,而软件必须知道对方何时停止说话时,选择 Flux STT:例如语音 Agent、电话助手、IVR、Agent 辅助。Flux 不支持预录制模式。
- 如果你希望 Deepgram 同时运行大模型并朗读回复,请不要选择这两者。这是语音 Agent API,由单独的主机
agent.deepgram.com提供服务。请打开voice-agent技能。
首次请求:对预录制文件使用 Nova
在 https://console.deepgram.com 创建密钥,并将其导出为 DEEPGRAM_API_KEY。密钥放在 Authorization 标头中,使用 Token 方案。始终传入 model;否则 API 会回退到 base。
curl -s -X POST 'https://api.deepgram.com/v1/listen?model=nova-3&smart_format=true' \
-H "Authorization: Token $DEEPGRAM_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"url":"https://dpgr.am/spacewalk.wav"}'
转录文本位于 results.channels[0].alternatives[0].transcript。如需改为发送本地文件,请将 Content-Type 设为音频类型(例如 audio/wav),并使用 --data-binary @file.wav,不附带 JSON 请求体。
以下是你常用的 Nova 选项,都是 /v1/listen 的查询参数:
smart_format=true会添加标点、分段和数字格式。它会启用punctuate,因此不要同时设置这两项。diarize_model=latest会标注说话人。它取代了已弃用的diarize=true;同时设置两者的请求会被拒绝。流式传输仅接受latest和v1。language=multi可转录 55 种 Nova-3 多语言语种中的跨语种切换语音。也可以使用任何单一语言代码;默认值为en。language_hint=<code>可按语言重复设置(language_hint=en&language_hint=es),使language=multi倾向于你预期的语言,但不会限制识别范围。与其他任何language值同时使用时会被忽略;使用不在 Nova-3 多语言列表中的代码会导致 400 错误(流式传输时会拒绝 WebSocket 握手);提示在整个流期间固定不变。响应会在languages_hinted中回显规范化后的提示。keyterm=<term>可提高姓名、产品术语和行话的识别权重。它仅适用于 Nova-3 和 Flux STT;其他模型(例如 Nova-2)应改用keywords。每个术语重复设置一次此参数。每个请求的所有 keyterm 总计最多为 500 个 token;超过上限会导致请求失败,并返回Keyterm limit exceeded。Deepgram 建议远低于此上限,只使用 20 到 50 个重要术语。逗号、分号和term:weight不会导致请求被拒绝;API 会将整个值视为一个字面术语,因此你原本想提高权重的内容不会生效。summarize=v2、sentiment=true、topics=true和intents=true会添加音频智能功能。这些功能仅适用于预录制的英语音频。- 实时流式传输使用
wss://api.deepgram.com/v1/listen?model=nova-3、相同的Authorization标头和二进制音频帧。静音期间每隔 3 到 5 秒发送文本帧{"type":"KeepAlive"},如 keep-alive 页面所述;若 10 秒内没有音频或KeepAlive,连接将以NET-0001关闭。结束时发送{"type":"CloseStream"}。如需在流传输期间更改词汇或格式,请发送{"type":"Configure","keyterms":["routing number"],"features":{"numerals":true}}:keyterms会替换整个列表(包括keyterm查询参数;[]会清空列表,省略或设为null则保留列表),且仅适用于 Nova-3 模型;features可切换numerals等布尔选项。发送下一条配置前,请等待ConfigureSuccess或ConfigureFailure;发生失败(CONFIGURE_KEYTERMS_NOT_SUPPORTED、CONFIGURE_KEYTERM_LIMIT_EXCEEDED、CONFIGURE_ALREADY_PENDING、CONFIGURE_INTERNAL_ERROR)时,该消息中的任何设置都不会生效,流仍会继续。区域主机使用相同路径和密钥:wss://api.eu.deepgram.com/v1/listen、wss://api.au.deepgram.com/v1/listen、wss://api.in.deepgram.com/v1/listen。
Flux STT:支持轮次检测的对话音频
通过 WebSocket 连接。Flux 没有 REST 接口。
wss://api.deepgram.com/v2/listen?model=flux-general-en&encoding=linear16&sample_rate=16000
发送相同的 Authorization: Token 标头。音频必须为单声道。对于原始音频(linear16、linear32、mulaw、alaw、opus、ogg-opus),必须提供 encoding 和 sample_rate;对于 WAV、Ogg 或 WebM 容器,两者都省略。每次发送 80 ms 的音频块。Flux STT 没有 KeepAlive 消息:WebSocket ping 会取代它,超时时间为 60 秒。如需在区域内处理,请使用 wss://api.eu.deepgram.com/v2/listen、wss://api.au.deepgram.com/v2/listen 或 wss://api.in.deepgram.com/v2/listen,并使用相同的密钥。
/v2/listen 上有两个值得注意的查询参数:
redact接受numbers或aggressive_numbers;任何其他值都会导致握手失败,并返回 400。每个被遮盖的片段都会变成一个*,而不是[REDACTED]或实体标签。profanity_filter=true在/v2/listen上有效,包括language=multi。
服务端会先发送 Connected,然后发送一系列 TurnInfo 消息。每条消息都包含 event、turn_index、transcript、带时间戳的 words,以及 end_of_turn_confidence。event 的取值如下:
Update:在一个轮次进行期间,大约每 0.25 s 的音频发送一次。StartOfTurn:说话者开始讲话。用它来中断你的 Agent(抢话)。EndOfTurn:说话者结束讲话。将转录文本发送给你的大模型。它包含trigger,取值为model、manual或timeout。EagerEndOfTurn和TurnResumed:仅在设置了eager_eot_threshold时发送。收到第一个事件时开始起草回复;收到第二个事件时取消。EndOfTurn的转录文本与EagerEndOfTurn的转录文本完全一致。预计大模型调用量会增加 50% 到 70%,以换取端到端延迟减少约 100 到 200 ms;建议先只使用EndOfTurn。
以下三个查询参数可调整轮次检测,并且都可以通过下方的 Configure 消息在流传输期间更改:
| 参数 | 范围 | 默认值 | 效果 |
|---|---|---|---|
eot_threshold | 0.5 到 1.0 | 0.7 | 触发 EndOfTurn 所需的置信度。1.0 会禁用模型检测。 |
eager_eot_threshold | 0.3 到 0.9 | 未设置 | 启用 EagerEndOfTurn。值越低,触发越早,但误判也越多。必须小于或等于 eot_threshold。 |
eot_timeout_ms | 500 到 60000 | 5000 | 无论置信度如何,达到此静音时长后都会触发 EndOfTurn。 |
客户端控制消息,每条都是一个 JSON 文本帧:
{"type":"Configure","thresholds":{"eot_threshold":0.8},"keyterms":["Deepgram"],"numerals":true}可在不重新连接的情况下更改阈值、关键词、language_hints或numerals。- 结构和原子性:如示例所示,轮次检测阈值应放在
thresholds下;省略的字段会保留原值。同一条消息中的所有字段会一并生效,或者均不生效:如果有一个字段未通过验证,则所有字段都不会生效。 keyterms:该数组会替换整个列表,最多包含 100 个纯文本词条(不支持term:weight语法)。language_hints:[]会清除提示并恢复自动检测;省略该字段或发送null则会保留现有提示。numerals:以numerals查询参数的值为初始值,并应用于 Flux STT 处理更新后发送的转录文本,不会应用于已发送的转录文本。该值必须是 JSON 布尔值:字符串"true"无法通过架构验证,Flux STT 会返回代码为UNPARSABLE_CLIENT_MESSAGE的Error,并关闭连接。- 回复为
ConfigureSuccess,其中会回显包括numerals在内的完整有效配置;或者为ConfigureFailure,其中包含code和description,指出被拒绝的字段,并保留之前的配置。
- 结构和原子性:如示例所示,轮次检测阈值应放在
{"type":"ForceEndTurn"}(于 2026 年 8 月 28 日新增)会根据你自己的信号结束当前轮次,例如按键通话松开、DTMF 音调或发送按钮。Flux STT 会发出"trigger":"manual"的EndOfTurn。如果当前没有活动轮次,则会忽略此消息,并返回代码为FORCE_END_TURN_NO_ACTIVE_TURN的Warning。设置eot_threshold=1.0可完全由你控制每个轮次,并将eot_timeout_ms设为较高值作为后备机制("trigger":"timeout")。- SDK 方法:JS 5.9.0
sendForceEndTurn、Python 7.8.0send_force_end_turn、Java 0.9.0sendForceEndTurn、Go 3.8.0ForceEndTurn()、Rust 0.10.1force_end_turn()、.NET 7.1.0 的SendForceEndTurn(),该方法位于具体的FluxWebSocketClient上,而非接口上。
- SDK 方法:JS 5.9.0
{"type":"CloseStream"}会完成对已接收音频的解码,发出对应的Update消息,并关闭连接,且不会带有 WebSocket 关闭状态码。它不会结束活动轮次:不会发出EndOfTurn,因此最后一条消息是临时Update。若要以最终转录文本结束,请先发送ForceEndTurn,再发送CloseStream;消息会按顺序处理,因此轮次会先结束,然后连接关闭。若顺序相反,ForceEndTurn将不起作用。
对于非英语或混合语言通话,请使用 model=flux-general-multi,并可选择重复传入 language_hint=<code> 参数(例如 language_hint=en&language_hint=es)。不提供提示时,模型会自行检测语言。此时 TurnInfo 会包含 languages 和 languages_hinted。numerals 会格式化 flux-general-en 中的所有数字;对于 flux-general-multi,它会格式化英语、西班牙语、法语、德语、俄语、葡萄牙语、意大利语和荷兰语数字,而印地语和日语数字则保持口语形式。
常见错误
Authorization: Bearer <api key>会返回 401。API 密钥使用Authorization: Token <key>。Bearer仅用于POST /v1/auth/grant签发的短期 JWT。- 对于拼错的模型名称,以及项目无权使用的真实模型,都会返回包含
{"err_code":"INSUFFICIENT_PERMISSIONS","err_msg":"Project does not have access to the requested model."}的 403 响应。响应正文中包含request_id。申请访问权限前,请先检查名称是否拼写正确。GET https://api.deepgram.com/v1/models会列出公开目录;GET /v1/projects/{project_id}/models会列出项目可用的模型。不存在名为nova-3-conversational的模型;对话音频使用 Flux,即flux-general-en。公开目录不会列出 Flux 模型名称,因此 Flux 文档是查询这些名称的依据。 /v1/listen不支持 Flux,model=flux也不是有效值。请将flux-general-en或flux-general-multi与/v2/listen搭配使用。- 在 Flux 中使用
language=en或language=multi是错误的。模型名称会指定语言。在/v2/listen中,只有flux-general-multi接受language_hint;在其他模型中使用会返回 400。 - 为容器化音频(WAV、Ogg、WebM)设置
encoding或sample_rate会导致错误或输出乱码。请省略这两个参数,让容器声明格式。 - 在
/v1/listen中使用ForceEndTurn会返回错误;该参数仅适用于 Flux。 /v2/listen不支持smart_format、diarize和 intelligence 参数。说话人标签和摘要属于 Nova 的工作。- 作为二进制帧发送的
KeepAlive会被错误处理。请将控制消息作为文本帧发送,将音频作为二进制帧发送。 {"type":"Configure","features":{"numerals":true}}是/v1/listen的写法。Flux STT 不接受features嵌套结构,并会关闭连接;在/v2/listen中,请将numerals作为顶层字段发送:{"type":"Configure","numerals":true}。
定价
Deepgram 按音频分钟数收取语音转文本费用。价格会变动,请访问 https://deepgram.com/pricing 查看,而不要依赖任何技能中的价格信息。
适合使用其他技能的情况
- 需要查看每个参数、响应架构或消息字段:使用
api技能,文件references/listen.md。 - 想查看某个主题的文档页面:使用
docs技能。该技能参考的页面列在 Sources 下。 - 想要一个带 UI 的可运行应用:使用
starters技能(transcription、live-transcription和flux功能)。 - 想要一段少于 50 行、仅涵盖一个功能的代码片段:使用
recipes技能,https://github.com/deepgram/recipes。 - 想将 Deepgram 接入 Twilio、LiveKit、Pipecat、LangChain 或其他平台:使用
examples技能。 - 想要符合语言惯例的 SDK 代码:从相应的 SDK 仓库安装 Nova 对应的
deepgram-{js,python,java,go,rust,dotnet}-speech-to-text,以及 Flux STT 对应的deepgram-{lang}-conversational-stt(依此类推,使用npx skills add deepgram/deepgram-python-sdk)。 - 想通过 SDK 在流中途使用
numerals:deepgram-{lang}-conversational-stt技能未涵盖此功能,因此请参考本技能中Configure条目的消息格式。JavaScript SDK 从 5.13.0 版开始支持发送此消息(socket.sendConfigure({type:"Configure", numerals:true})),Python SDK 从 7.11.0 版开始支持(connection.send_configure(ListenV2Configure(numerals=True))),Java SDK 从 0.10.2 版开始支持(sendConfigure(ListenV2Configure.builder().numerals(true).build())),.NET SDK 从 7.2.0 版开始支持(在 FluxConfigureSchema上设置Numerals)。 - 想在 Go(最高至 3.10.0 版)或 Rust(最高至 0.14.0 版)SDK 中途使用
numerals:它们的 Flux Configure 类型不包含numerals字段,因此请发送原始 JSON Configure 消息,或在连接 URL 上设置numerals。 - 想通过 SDK 使用 Nova
/v1/listenConfigure消息或language_hint:JS 从 5.15.0 版开始支持Configure,从 5.16.0 版开始支持ConfigureSuccess、ConfigureFailure和language_hint;Python 从 7.13.0 版开始支持Configure,从 7.14.0 版开始支持响应,从 7.15.0 版开始支持language_hint;Java 从 0.11.1 版开始支持Configure,从 0.11.2 版开始支持响应和languageHint。.NET 7.2.0 版通过SendConfigure发送Configure,但不对响应进行类型定义(其文档说明,拒绝请求会以Error形式返回),且不支持/v1/listenlanguage_hint。Go 和 Rust 均不支持这些功能,因此请发送原始 JSON,并自行将language_hint添加到 URL。 - 想要分析结果,而不只是转录文本(
/v1/listen上的summarize、sentiment、topics、intents、detect_entities):使用audio-intelligence技能。对于已有文本,请使用/v1/read和text-intelligence技能。 - 想要文本转语音或完整的语音 Agent:使用
text-to-speech或voice-agent技能。 - 想要 shell 命令,而不是应用程序代码:使用
cli技能。 - 想让你的编码工具能够查询文档:使用
setup-mcp技能。
来源
- 入门:https://developers.deepgram.com/docs/stt/getting-started
- Nova 预录音频:https://developers.deepgram.com/docs/pre-recorded-audio
- Nova 实时流式传输:https://developers.deepgram.com/docs/live-streaming-audio and https://developers.deepgram.com/docs/audio-keep-alive
- 模型和语言:https://developers.deepgram.com/docs/models-languages-overview
- 多语言代码切换:https://developers.deepgram.com/docs/multilingual-code-switching
- Smart Format、说话人分离、关键术语:https://developers.deepgram.com/docs/smart-format, https://developers.deepgram.com/docs/diarization, https://developers.deepgram.com/docs/keyterm
- 音频智能:https://developers.deepgram.com/docs/audio-intelligence and https://developers.deepgram.com/docs/stt-intelligence-feature-overview
- Flux 快速入门:https://developers.deepgram.com/docs/flux/quickstart
- Flux 与 Nova-3 的比较:https://developers.deepgram.com/docs/flux/flux-nova-3-comparison
- 从 Nova-3 迁移到 Flux:https://developers.deepgram.com/docs/flux/nova-3-migration
- Flux 状态机:https://developers.deepgram.com/docs/flux/state
- Flux STT 轮次检测参数(阈值表):https://developers.deepgram.com/docs/flux/configuration
- Nova-3 流中途
Configure和语言提示:https://developers.deepgram.com/docs/configure, https://developers.deepgram.com/docs/nova-3-language-prompting - Flux 控制消息:https://developers.deepgram.com/docs/flux/configure, https://developers.deepgram.com/docs/flux/force-end-turn, https://developers.deepgram.com/docs/flux/close-stream
- Flux STT 功能矩阵(脏话过滤、脱敏范围、控制消息):https://developers.deepgram.com/docs/flux/feature-overview
- 脏话过滤,包括 Flux STT
language=multi:https://developers.deepgram.com/docs/profanity-filter - 自行实现轮次检测(
eot_threshold=1.0加上ForceEndTurn):https://developers.deepgram.com/docs/flux/own-turn-detection - 语音 Agent 中的 Flux STT 和提前结束轮次(LLM 调用成本):https://developers.deepgram.com/docs/flux/agent and https://developers.deepgram.com/docs/flux/voice-agent-eager-eot
- 脱敏,包括 Flux STT 的
*占位符:https://developers.deepgram.com/docs/redaction - 区域端点(适用于
/v1/listen和/v2/listen的 EU、AU、India 主机):https://developers.deepgram.com/reference/regional-endpoints - 数字格式,包括 Flux STT 语言列表和流中途切换:https://developers.deepgram.com/docs/numerals
- ForceEndTurn 发布说明:https://developers.deepgram.com/changelog/2026/8/28
- Flux 多语言:https://developers.deepgram.com/docs/flux/language-prompting
- 身份验证:https://developers.deepgram.com/guides/fundamentals/authenticating and https://developers.deepgram.com/guides/fundamentals/token-based-authentication
- 模型端点:https://developers.deepgram.com/guides/fundamentals/model-metadata
- 错误代码:https://developers.deepgram.com/docs/errors
- Voice Agent 主机(agent.deepgram.com):https://developers.deepgram.com/docs/build-a-voice-agent
- API 参考:https://developers.deepgram.com/reference/speech-to-text/listen-pre-recorded, https://developers.deepgram.com/reference/speech-to-text/listen-streaming, https://developers.deepgram.com/reference/speech-to-text/listen-flux