跳到主要内容

文本转语音(TTS)

TTS
text: 你好
TTS...
sdk
sdk
你好(语音)
你好(语音)
RustPBX
RustPBX
电话
电话
TTS 提供商
TTS 提供商
你好(文本)
你好(文本)
你好(语音)
你好(语音)
通话
通话
Text is not SVG - cannot display

TTS 命令将文本转换为语音并播放。

TTS Track

TTS 命令会创建一个 TTS Track 用于转发音频, TTS Track 的开始和结束都分别会触发 Track Start 和 Track End 事件。

转发
转发
TTS/Play Track
TTS/Play Track
RTP. 连接
RTP. 连接
RTP Track
RTP Track
电话
电话
语音流
语音流
外部服务
外部服务
Text is not SVG - cannot display

在 TTS 命令中设置 playId 时,对应的 TrackEnd 事件中会包含该 playId,可用于获取播放完毕通知。

TTS 命令参数

text

需要转换的文本。

信息

部分供应商会限制文本的长度,以及文本的内容,特殊字符可能会报错。请参阅本位末尾的供应商文档。

speaker

设置语音的音色。请注意不同模型支持的音色不同,以及音色支持的语音不同,价格也各不相同。

音色列表

playId

playId 用于使用多条命令完成一次播放。当连续的 TTS 命令使用相同的 playId 时,会复用同一个 TTS Track。

注意

如果 TTS 命令使用和之前的 TTS 命令不同的 playId,且之前的 TTS Track 并未结束,会终止之前的 TTS Track 并创建一个新的 TTS Track。

endOfStream

设置 endOfStream=true 表示当前 playId 的所有 TTS 命令已经发送完毕。TTS Track 将在所有命令结果播放完毕之后退出,并发送 Track End 事件。

TTS Command
TTS Command
TTS Command
TTS Command
TTS Command
TTS Command
TTS Track 1
TTS Track 1
TTS Track 2
TTS Track 2
endOfStream: true
endOfStream: true
TrackStart Event
TrackStart Ev...
TrackEnd Event
TrackEnd Event
playId: 1
playId: 1
playId: 2
playId: 2
Text is not SVG - cannot display

streaming

streaming 用于选择供应商的流式和非流式的 API:

  • 设置 streaming=true,会选择供应商的流式 API,多条 TTS 命令会在同一个 WebSocket 连接里连续发送。

  • 设置 streaming=false (默认), 每条 TTS 命令会使用单独的 http 请求。

流式的文本片段较短,因此会关闭缓存机制。

非流式使用单独的请求,可以设置 max_concurrent_tasks 选项设置请求的并发数, 默认是 1。

base64

设置 base64=true,可以使用 text 字段传入 base64 编码音频。

音频需要是采样率为 16kHz 的 PCM 格式。

autoHangup

设置 autoHangup=true,播放完毕后自动挂断。

waitInputTimeout

设置 waitInputTimeout, 当超过 waitInputTimeout 毫秒后,没有音频输入,将触发 Silence 事件

缓存

当设置 streaming=false 时,会开启缓存机制。

TTS 命令的请求音频结果会保存到 /tmp/mediacache (默认路径)中,文件名为: {文本哈希}-{采样率}-{音色}-{速率}.pcm

当后续的命令使用相同的文本、采样率、音色、速率时,会直接使用缓存中的文件。

缓存路径可以在 RustPBX 的配置文件中修改,示例:

config.toml
[tts]
media_cache_path = "/tmp/mediacache"

其他配置

Invite/Accept 命令的 CallOptiontts 字段和 TTS 命令中的 option 字段均可以配置更多 TTS 选项。

他们的参数是相同的,具体参见 SynthesisOption

如果同时配置,TTS 命令中配置的选项会覆盖 CallOption 中的选项。

主要包括:

  • samplerate:采样率
    • 默认值:16000, 最好设置为与 Track 相同的采样率, 重采样会有额外的性能损耗。
  • speed:语速
    • 默认为提供商的标准语速。其中 deepgram 不支持调整语速。具体配置需参阅提供商文档。
  • volume:音量
    • 默认为提供商的标准音量。其中 deepgram 不支持调整音量,具体配置需参阅提供商文档。
  • emotion:情感
    • 注意模型和音色对情感的支持不同,具体配置需参阅提供商文档。
  • endpoint:自定义服务端点 URL
    • tencent 默认为:非流式 wss://tts.cloud.tencent.com/stream_ws,流式 wss://tts.cloud.tencent.com/stream_wsv2
    • aliyun 默认为:wss://dashscope.aliyuncs.com/api-ws/v1/inference
    • deepgram 默认为:(https/wss)://api.deepgram.com/v1/speak
  • extra:提供商特定参数,会直接传递给提供商。
  • max_concurrent_tasks:非流式 TTS 命令的最大并发任务数,默认为 1。

如果供应商有其他的参数,也可以在 extra 字段中使用相同的字段名。这些参数会直接传递给提供商。

API Key 配置

API Key 可以在启动 RustPBX 时的环境变量中配置,也可以在 SynthesisOption 中配置。

在环境变量中配置:

  • 腾讯云:

    • TENCENT_APPID:腾讯云的 appId
    • TENCENT_SECRET_ID:腾讯云的 secretId
    • TENCENT_SECRET_KEY:腾讯云的 secretKey
  • 阿里云:

    • DASHSCOPE_API_KEY: 阿里云大模型服务平台百炼的 API Key
  • Deepgram:

    • DEEPGRAM_API_KEY:Deepgram 的 API Key

SynthesisOption 中配置:

腾讯云:

  • appId:腾讯云的 appId
  • secretId:腾讯云的 secretId
  • secretKey:腾讯云的 secretKey

其他提供商:

  • secretKey:提供商的 API Key

打断

使用 Interrupt 命令可以打断正在播放的TTS。

  • 如果设置 graceful=true,TTS Track 会在当前 TTS 命令播放完毕后退出(仅在非流式 TTS 中有效)。
  • 如果设置 graceful=false (默认),会立即中断播放。

如果有正在播放的 TTS,并且供应商支持字幕,则会触发 Interruption 事件,事件中包含已播放的时间和文字位置 (如果供应商支持)。

TTS Command
TTS Command
TTS Command
TTS Command
TTS Track 1
TTS Track 1
playId: 1
playId: 1
TTS Command
TTS Command
Interrupt
graceful = true
Interrupt...
TrackEnd
TrackEnd
正在播放
正在播放
Text is not SVG - cannot display
提示

更多信息请参阅: