关于 text-to-speech
此技能为开发者提供 Deepgram 文本转语音集成指引,涵盖 Aura 和 Flux TTS 端点、语音选择、流式与批量请求及其控制选项。
主要功能
- 01选择 Aura 或 Flux TTS 端点
- 02通过 WebSocket 流式生成语音
- 03通过批量请求生成音频
- 04选择语音及语言变体
- 05设置语速、发音和停顿控制
适用场景
- 01构建支持打断处理的流式语音 Agent
- 02生成语音文件或 IVR 提示
- 03配置多语言语音输出
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ deepgram/ skills --skill text-to-speech安装后在 Claude Code 中输入/text-to-speech确认已加载。
详细介绍
Deepgram 文本转语音
Deepgram 在不同的端点上提供两个文本转语音系列,两者的语音不重叠。
Aura 语音只能用于 /v1/speak。Flux TTS 语音只能用于 /v2/speak。/v2/speak 是一个新增端点。/v1/speak 未作更改,仍受支持。
先选择系列
| 需求 | 系列 | 端点 |
|---|---|---|
| 流式传输 LLM 输出且必须能应对插话的语音 Agent | Flux TTS | wss://api.deepgram.com/v2/speak |
| 单次生成音频:文件、IVR 提示词、通知 | Flux TTS 批量模式 | POST https://api.deepgram.com/v2/speak |
| 在同一条响应中切换英语和西班牙语 | Aura-2 代码切换语音 | /v1/speak |
| Voice Agent 中的非英语语音 | Aura-2 | agent.speak.provider.version: "v1" |
必须保留的现有 aura-2-* 或 aura-{voice}-en 语音 | Aura-2 或 Aura-1 | /v1/speak |
经验法则:对于任何新的构建,推荐使用 Flux TTS 系列,可支持其 42 种语言中的任意一种。
Flux TTS 语音支持英语(美国、英国、爱尔兰、澳大利亚、印度、新加坡和菲律宾口音)及其他 41 种语言;语言名称是模型字符串的后缀(flux-anouk-nl 是荷兰语)。文本规范化(数字、日期、缩写)支持英语、德语、荷兰语、法语、印地语、意大利语、日语、葡萄牙语、俄语和西班牙语;其他 32 种语言为 Early Access,不支持文本规范化,因此请将数字和日期写成文字。非英语语音可通过 api.deepgram.com、api.eu.deepgram.com 和 api.in.deepgram.com 提供,目前尚未通过 api.au.deepgram.com 提供。Aura-2 是上一代产品(支持英语、西班牙语、德语、法语、荷兰语、意大利语和日语),Aura-1 是第一代产品,仅支持英语。在 Voice Agent 中,非英语语音以及压缩或封装格式的输出需要使用 Aura(v1)语音(参见错误 7)。
首个请求:通过 REST 使用 Aura
curl --request POST \
--url "https://api.deepgram.com/v1/speak?model=aura-2-thalia-en&encoding=linear16&container=wav" \
--header "Authorization: Token $DEEPGRAM_API_KEY" \
--header "Content-Type: application/json" \
--data '{"text": "Hello, how can I help you today?"}' \
--output hello.wav \
--fail-with-body --silent || echo "Request failed"
预期行为:
- 2xx 响应正文是二进制音频。错误响应为 JSON。解析前请检查 HTTP 状态。
- 选项放在查询字符串中。JSON 正文仅包含
text。 - 如果未指定
encoding,REST 将返回mp3。对于 WAV,请发送encoding=linear16&container=wav。其他 REST 编码包括:opus、flac、aac、mulaw、alaw,并可搭配container、bit_rate、sample_rate。 - 如果省略
model,/v1/speak将使用aura-asteria-en,这是一种 Aura-1 语音。请务必设置model。 - Aura-2 的
speed接受0.7到1.5,且仅适用于英语和西班牙语语音。西班牙语语音请使用0.9到1.5;低于0.9的值可能会导致语流不连贯。 - Aura-2 发音控制已在
/v1/speak正式发布,英语和西班牙语语音均可使用,与 Flux TTS 使用相同的转义语法\{"word":"...","pronounce":"<IPA>"\},输入上限为 2000 个字符。Aura-2 不支持停顿控制。
通过 WebSocket 使用 Aura
使用相同的 Authorization: Token 标头连接到 wss://api.deepgram.com/v1/speak?model=aura-2-thalia-en&encoding=linear16&sample_rate=24000。
发送 JSON 文本帧:{"type":"Speak","text":"..."} 用于排入文本,{"type":"Flush"} 用于强制输出音频,{"type":"Clear"} 用于清空缓冲区,{"type":"Close"} 用于结束。音频以二进制帧形式传入;Metadata、Flushed、Cleared 和
Warning 以 JSON 形式传入。LLM 完成响应后发送 Flush。每 60 秒最多发送 20 次 Flush。流式输出仅支持原始 linear16(默认)、mulaw 或 alaw。
Aura 套接字的限制:每个请求最多 2000 个文本字符(关闭代码 1009,负载 BIG-0001),每分钟发送到套接字的文本总计最多 2400 个字符(统计所有 Speak 消息;关闭代码 1008,DATA-0001),每个连接从初始连接开始最多持续 60 分钟(关闭代码 1011,NET-0003);如需进行更长时间的对话,请打开新套接字。关闭帧代码以及升级失败时的 dg-error 标头列于 https://developers.deepgram.com/docs/tts-troubleshooting-websocket-net-and-data-errors。区域主机 api.eu.deepgram.com、api.au.deepgram.com 和 api.in.deepgram.com 均提供 /v1/speak、REST 和 WebSocket 服务,并使用相同的密钥。
面向语音 Agent 的 Flux TTS
连接到 wss://api.deepgram.com/v2/speak?model=flux-haley-en。必须指定 model,且必须是 flux-* 语音。没有默认值,并且会拒绝 Aura 字符串。要在区域内处理,请使用
wss://api.eu.deepgram.com/v2/speak、wss://api.au.deepgram.com/v2/speak 或
wss://api.in.deepgram.com/v2/speak;如果某个区域不可用,请求会失败,而不会路由到其他区域。
一个会话由一系列轮次组成。流式传入 token,然后结束该轮次:
{"type": "Speak", "text": "Sure, I can "}
{"type": "Speak", "text": "help you cancel your subscription."}
{"type": "Flush"}
- 音频会在你调用
Flush之前开始流式传输。Flush会结束当前轮次;随后服务端会发送Flushed和SpeechMetadata,其中包含计费和时间信息。将SpeechMetadata视为轮次结束标志;Flushed会更早到达。 - 服务端会在每轮的
SpeechStarted和SpeechMetadata中分配speech_id。切勿自行发送。 - 第一条消息是
Connected,包含request_id、model_name、model_version和model_uuids。 正常关闭时的最后一条消息是SessionMetadata,其中包含会话累计总量;Interrupt会根据客户端实际播放的音频, 重新计算total_audio_duration_ms。 - 服务端的 JSON 消息包括
Connected、SpeechStarted、Flushed、SpeechMetadata、SpeechInterrupted、ConfigureSuccess、ConfigureFailure、Warning、Error和SessionMetadata。Warning包含code和description,但不会关闭会话。Error是致命错误:每个DOMAIN-NNNN代码(MESSAGE-0000、DATA-0000、DATA-0002、BIG-0000、NET-0000到NET-0004)之后都会关闭 WebSocket。 - 用户打断时,先停止本地播放,然后发送
{"type":"Interrupt","playback_offset":{"type":"time_ms","value":2340}}。SpeechInterrupted会返回text_spoken和text_remaining;将text_spoken反馈到 LLM 上下文中。不提供playback_offset时,不会返回文本拆分结果。value表示自会话开始以来已播放的毫秒数,而非自本轮开始以来的毫秒数。每次Interrupt的偏移量都必须大于上一次,否则会因INVALID_INTERRUPT_OFFSET被忽略。读取SpeechInterrupted中的audio_played_ms,作为下一个偏移量的基准。
{"type":"Configure","speed":1.15}可在会话中途更改语速;更改会在下一个片段边界生效。speed的范围为0.5到1.5,步进为0.05,默认值为1.0。- 服务端会通过
ConfigureSuccess返回已应用的配置applied;或者通过ConfigureFailure返回code和description(如果失败与某个字段有关,还会返回field和value),并保留之前的配置。 0.45和1.55会返回'speed' must be between 0.5 and 1.5,而1.07会返回'speed' must be provided in increments of 0.05。ConfigureFailure代码包括:SPEED_OUT_OF_RANGE、SPEED_INCREMENT_INVALID、SPEED_NOT_SUPPORTED、CONTROL_COMBINATION_INVALID(排队的轮次仍携带发音控制;请先对该轮次执行Flush)以及INTERNAL_ERROR(配置有效,但服务端无法应用)。
- 服务端会通过
expressivity的范围为-2(平静)到2(生动),默认值为0。必须为整数。无效值会在 WebSocket 升级完成前被拒绝,并返回 HTTP 400,因此不会收到Connected消息:小数值(如1.5)会返回EXPRESSIVITY_INCREMENT_INVALID,超出-2到2范围的值会返回EXPRESSIVITY_OUT_OF_RANGE。该参数处于 Beta 阶段,每个连接建立后固定不变(Configure无法更改),且目前仅对0的生产环境使用情形进行了验证。- Flux TTS
/v2/speak的发音控制处于 Early Access 阶段(Aura-2/v1/speak已正式发布,参见 Aura REST 部分)。它是在文本中使用转义 JSON 对象,适用于 WebSocket 和批量请求:\{"word":"dupilumab","pronounce":"duːˈpɪljuːmæb"\}。- 限制:每个请求最多 500 条;IPA 最多 128 个字符,且不得超过源词长度的 10 倍,最小上限为 15。
- 仅在
speed为1.0时有效:在 WebSocket 中,如果会话以其他语速开启时发送发音控制,或发送已由Configure设置的语速值,会导致连接因DATA-0002失败;在批量请求中,请求会返回 400CONTROL_COMBINATION_INVALID。 - 无效的 IPA 仍会尽力应用,并通过 WebSocket 上的
PRONUNCIATION_WARNINGS警告以及批量请求中的dg-warnings响应头报告。 - 语法和 IPA 指南:https://developers.deepgram.com/docs/tts-voice-controls
- 暂停控制
\{pause:500ms\}仅适用于批量请求。- 限制:500 到 3000 ms,步进为 100 ms;每个请求最多 8 个;相邻暂停之间必须有文本;存在暂停时,
speed上限为1.15(PAUSE_SPEED_CAP_EXCEEDED)。暂停时长与请求时长的偏差约在 100 ms 以内。 - 在 WebSocket 上使用暂停标记会导致连接因
DATA-0002失败;暂停与发音控制组合使用会被CONTROL_COMBINATION_INVALID拒绝。 - 其他批量请求的 400 错误代码包括:
BREAK_OUT_OF_RANGE、BREAK_INCREMENT_INVALID、BREAKS_LIMIT_EXCEEDED和BREAK_SYNTAX_INVALID。触发该错误的情况有两种:使用不带反斜杠的简单标记,或使用带反斜杠的结构化标记。 - 可接受的形式包括
\{pause:500\}(纯数字表示毫秒)、\{pause:500ms\}、\{pause:1.5s\},以及未转义的结构化形式{pause:{duration_ms:500}}。
- 限制:500 到 3000 ms,步进为 100 ms;每个请求最多 8 个;相邻暂停之间必须有文本;存在暂停时,
- 每轮的
SpeechMetadata.controls_applied会统计pronunciations_applied、breaks_applied和pronunciation_warnings;批量请求会通过dg-pronunciations-applied和dg-breaks-applied响应头返回统计结果。 - WebSocket 仅流式传输原始音频,默认格式为
linear16(参见错误 5)。仅适用于批量请求的参数 (container、bit_rate、callback、callback_method、priority)以及任何未知参数都会导致连接失败。 - 空闲会话会在 60 秒后关闭(
NET-0004);两轮之间无活动时,请发送 WebSocket Ping。每个会话都会在 1 小时后关闭 (NET-0003)。 - 批量请求:
POST https://api.deepgram.com/v2/speak?model=flux-haley-en,正文为{"text": "..."},会返回一条 音频响应;默认格式为mp3,支持opus、flac、aac、container、bit_rate,且只有这种传输方式支持内联暂停。 - SDK:每个 Deepgram SDK 都包含 Flux TTS 客户端。Python、JavaScript 和 Java 将其命名为
speak.v2; .NET 提供FluxSpeakRESTClient和FluxSpeakWebSocketClient;Rust 提供speak::flux;Go 从 v3.8.0 起提供pkg/client/speak/v2。只有 Rust SDK 技能文档完整介绍了 Flux TTS;Python 技能包含一个 Flux 批量请求部分 (使用其TextBuilder辅助工具),而 JS、Java、Go 和 .NET 的text-to-speechSDK 技能仅介绍/v1/speak, 因此请从本技能文档中获取/v2/speak的消息格式。
语音
- Aura:英语、西班牙语、德语、法语、荷兰语、意大利语和日语使用
aura-2-{voice}-{lang},此外还有 12 种 Aura-1 英语语音,名称为aura-{voice}-en。其中 5 种西班牙语语音可在一次请求中切换使用英语和西班牙语:aura-2-aquila-es、aura-2-carina-es、aura-2-diana-es、aura-2-javier-es和aura-2-selena-es。语音目录:https://developers.deepgram.com/docs/tts-models - Flux TTS:使用带有双字母语言后缀的
flux-{voice}-{language},支持英语和另外 41 种语言。不同地区的变体共用相同后缀:巴西葡萄牙语和欧洲葡萄牙语都使用-pt,佛兰芒语使用-nl,瑞士德语使用-de,普通话、台湾普通话和粤语都使用-zh,因此请从目录中按名称选择语音。推荐的英语语音包括flux-haley-en、flux-alexis-en和flux-kit-en。语音目录:https://developers.deepgram.com/docs/flux-tts/voices
定价
Flux TTS、Aura-2 和 Aura-1 的文本转语音费用均按输入文本的每 1,000 个字符计费。费率因模型和套餐而异,且会随时间变化。请在 https://deepgram.com/pricing 查看费率;不要凭记忆引用价格。
常见错误
-
认证方案错误。API 密钥应放在
Authorization: Token <key>中。Bearer仅用于POST https://api.deepgram.com/v1/auth/grant返回的短时 JWT。使用Bearer发送密钥会返回 401。 -
误读模型错误。不存在的模型名称(包括拼写错误)会返回 400:
{"err_code":"Bad Request","err_msg":"Bad Request: No such model/language/tier combination found."}。 模型存在,但你的项目无权使用时,会返回 403:{"err_code":"INSUFFICIENT_PERMISSIONS","err_msg":"Project does not have access to the requested model."}。遇到 400 时,请对照上方目录检查名称;只有遇到 403 时才申请访问权限。GET https://api.deepgram.com/v1/models返回的是公开目录,而不是你的密钥可使用的模型。其tts列表中只有 Aura 语音,没有任何flux-*条目,因此请在 https://developers.deepgram.com/docs/flux-tts/voices 查看 Flux TTS 语音名称。 -
将音频解析为 JSON。这两个端点的成功响应体都是字节。请先根据状态码分支处理。
-
混淆两类语音。在
/v2/speak上使用 Aura 语音,或在/v1/speak上使用 Flux TTS 语音,都会失败;/v2/speak也会拒绝缺少model的请求。 -
向 WebSocket 请求
mp3。这两个端点的流式响应都是原始音频。需要压缩输出时,请使用 REST。 -
以为 Flux TTS 会整理文本。
Speak文本会原样拼接,因此"Hello world."后接"How are you?"会变成"Hello world.How are you?"。拼接回复、工具结果和另一条回复时,请插入空格。请发送纯文本。系统不会解析 SSML;Flux TTS 仅支持其自身的转义控制标记,其中发音标记适用于两种传输方式,暂停标记仅适用于批处理。检测到的 SSML、ElevenLabs 和 Cartesia 标签会被剥除,每个
Speak会产生一条INPUT_MARKUP_STRIPPED警告;检测器未识别的标记(Markdown、HTML、自定义 XML)会原样转发,并可能被读出。参见 https://developers.deepgram.com/docs/flux-tts/client-messages。 -
将 Voice Agent 指向 api.deepgram.com。Voice Agent API 位于
wss://agent.deepgram.com,并根据agent.speak.provider.version选择 TTS 类型:Flux TTS 使用v2,Aura 使用v1。省略agent.speak时,默认使用 Flux TTS 和flux-kit-en。- Agent 仅接受英文 Flux TTS 语音;目前其他 41 种语言仅支持
/v2/speak,因此非英文 Agent 语音应使用 Aura-2(v1)语音或第三方提供商。 - Agent 中的语速和
expressivity应设置在agent.speak.provider中;参见 https://developers.deepgram.com/docs/voice-agent-tts-controls。 - 行内暂停标记不会被读出,也不会返回错误,因此包含此标记的文本会变成静音;请通过标点和数字分组来控制节奏。
- 在
audio.output中指定压缩编码(mp3、opus、flac、aac)或wav等容器会返回INVALID_SETTINGS;因此,对于这些格式,请配置 Aura(v1)语音,包括省略agent.speak的情况。
- Agent 仅接受英文 Flux TTS 语音;目前其他 41 种语言仅支持
-
在不支持语音控制的语言中使用这些控制。Flux TTS 的
speed、暂停和发音功能仅适用于英文语音;Aura-2 的语速和发音功能仅支持英语和西班牙语。对于其他语音,请改用标点来控制语速。
以下情况请使用其他技能
- 需要查看所有参数、枚举或消息架构:使用
api技能,文件为references/speak.md。 - 需要查看无法确定名称的文档页面:使用
docs技能。 - 想要可运行的应用:使用
starters技能。功能包括text-to-speech(Aura REST)、live-text-to-speech(Aura WebSocket)和flux-tts(仅限 node、flask、fastapi、django、java)。 - 想要一段少于 50 行的代码片段:使用
recipes技能。Recipes 仅涵盖/v1/speak上的 Aura;目前 还没有 Flux TTS recipes。 - 想要接入第三方平台:使用
examples技能(目前支持 Aura)。如需通过 Twilio 使用 Flux TTS, 请参考 https://developers.deepgram.com/docs/twilio-and-deepgram-tts,该功能需要deepgram-sdk7.6.0 或更高版本。 - 想在编码工具中查看文档:使用
setup-mcp技能。 - 想要某种语言的惯用代码:使用 SDK 仓库中的
deepgram-{js,python,java,go,rust,dotnet}-text-to-speech技能(例如npx skills add deepgram/deepgram-python-sdk)。只有 Rust SDK 技能完整记录了 Flux TTS; 请参阅 Flux TTS 部分中的 SDK 列表。 - 想让 Deepgram 通过一个连接运行语音转文本、大模型和 TTS:使用
voice-agent技能和deepgram-{lang}-voice-agent。 - 要进行转录而非语音合成:使用
speech-to-text技能。请注意,“Flux”既指/v2/listen上的 语音转文本产品,也指/v2/speak上的这款文本转语音产品。
资料来源
每个页面均提供 Markdown 版本(在任意 URL 后添加 .md);索引位于 https://developers.deepgram.com/llms.txt。
- 模型系列和区域:https://developers.deepgram.com/docs/tts-models-languages-overview https://developers.deepgram.com/reference/regional-endpoints
- Aura:https://developers.deepgram.com/docs/text-to-speech https://developers.deepgram.com/docs/streaming-text-to-speech https://developers.deepgram.com/docs/tts-models https://developers.deepgram.com/docs/tts-voice-controls https://developers.deepgram.com/docs/tts-encoding https://developers.deepgram.com/docs/tts-media-output-settings https://developers.deepgram.com/docs/tts-ws-flush https://developers.deepgram.com/docs/tts-ws-clear https://developers.deepgram.com/docs/tts-ws-close https://developers.deepgram.com/docs/tts-troubleshooting-websocket-net-and-data-errors https://developers.deepgram.com/docs/text-to-speech-prompting
- Flux TTS:https://developers.deepgram.com/docs/flux-tts/overview https://developers.deepgram.com/docs/flux-tts/feature-overview https://developers.deepgram.com/docs/flux-tts/quickstart https://developers.deepgram.com/docs/flux-tts/batch https://developers.deepgram.com/docs/flux-tts/batch-vs-streaming https://developers.deepgram.com/docs/flux-tts/voices https://developers.deepgram.com/docs/flux-tts/client-messages https://developers.deepgram.com/docs/flux-tts/server-messages https://developers.deepgram.com/docs/flux-tts/state https://developers.deepgram.com/docs/flux-tts/context https://developers.deepgram.com/docs/flux-tts/interrupt-handling https://developers.deepgram.com/docs/flux-tts/migrating https://developers.deepgram.com/docs/flux-tts/voice-agent https://developers.deepgram.com/docs/flux-tts/template-apps https://developers.deepgram.com/docs/tts-expressivity
- API 参考:https://developers.deepgram.com/reference/text-to-speech/speak-request https://developers.deepgram.com/reference/text-to-speech/speak-streaming https://developers.deepgram.com/reference/text-to-speech/speak-flux https://developers.deepgram.com/reference/speak/v-2/audio/generate https://developers.deepgram.com/reference/manage/models/list
- 身份验证、错误、Agent、集成、定价:https://developers.deepgram.com/reference/authentication https://developers.deepgram.com/reference/auth/tokens/grant https://developers.deepgram.com/docs/errors https://developers.deepgram.com/docs/voice-agent-tts-models https://developers.deepgram.com/docs/voice-agent-tts-controls https://developers.deepgram.com/reference/voice-agent/voice-agent https://developers.deepgram.com/docs/twilio-and-deepgram-tts https://deepgram.com/pricing