文本转语音
所选 TTS 服务为 ctx.textToSpeech。它返回 ReadableStream,使用方无需等待完整响应即可开始播放或保存。
const speech = await ctx.textToSpeech.synthesize('欢迎登船。', {
voice: 'alloy',
signal,
})
const response = new Response(speech.audio, {
headers: {'content-type': speech.mediaType},
})
结果包含音频流、媒体类型和模型。必须消费或取消该流;流完成或被丢弃前会持续占用并发容量。
voices() 返回可发现的声音。空列表表示提供方无法枚举声音,此时 UI 应允许手动填写声音 ID。
OpenAI 兼容选项
| 选项 | 含义 |
|---|---|
voice | 声音 ID,覆盖配置默认值 |
responseFormat | mp3、opus、aac、flac、wav 或 pcm |
speed | 0.25 到 4 的语速 |
instructions | 模型支持时使用的朗读指令 |
user | 可选最终用户标识 |
合成调用 POST /audio/speech。声音发现调用 GET /audio/voices;HTTP 404 或 405 视为不支持,并返回空列表。
流的所有权
返回流由调用方负责。用于播放时,应交给能在播放被替换或组件卸载时取消读取器的组件;用于持久化时,应将流输送到目标并等待完成,再把资源记录为可用。
const {audio, mediaType, model} = await ctx.textToSpeech.synthesize(text, {
priority: 'foreground',
signal,
})
await audio.pipeTo(destination, {signal})
不要只根据请求格式推断扩展名,应使用返回的 mediaType,因为兼容服务器仍决定实际响应。服务不会解码、重采样或规范化音频;若使用方要求特定采样率或容器,应在合成后自行转换。
声音选择
声音 ID 应视为不透明且属于特定提供方。保存声音时,应同时关联提供该声音的提供方与连接。voices() 返回条目时,可显示其 name 和 description,但提交稳定的 id。发现结果为空时,只需验证手动 ID 非空,再由提供方判断它是否存在。
空合成文本为 invalid-input。若在请求前即可判断格式或指令不受支持,则为 unsupported;提供方拒绝则为 rejected。