本文介绍语音合成的音频播放、发音控制、时间戳、调用限制和错误排查等常见问题。
音频与播放
为什么 WAV 文件显示的时长与实际播放时长不一致?
普通语音合成采用边合成边返回数据的流式机制,返回的 WAV 文件头使用预估值,因此文件显示的时长可能与实际播放时长有误差。例如,文件显示 7 秒,但实际语音不足 5 秒。
如果需要准确的时长,可以将 format 设置为 pcm,接收完整的合成音频后,根据实际音频数据添加 WAV 文件头。输出格式的配置方法请参见语音合成接口说明。
为什么把语音合成的响应体作为文本读取时显示乱码?
短文本语音合成接口 /stream/v1/tts 成功时返回二进制音频,不是文本。应按请求中指定的音频格式保存或播放,不能按字符串解析。
异步长文本接口 /rest/v1/tts/async 的提交响应与音频数据不同:先获取任务 ID,再查询合成结果中的音频 URL。完整调用方法请参见长文本语音合成接口说明。
微信小程序 SDK 支持流式接收音频吗?
支持。微信小程序 SDK 的语音合成接口通过 data 事件分片返回二进制音频,并通过 complete 事件通知合成完成。一次提交完整文本不等于一次返回全部音频;可以在 data 事件中处理收到的音频分片。
发音与 SSML
如何控制数字串整体播报或逐位播报?
可以使用 SSML 的 say-as 标签指定数字的读法。SSML 是基于 XML 的语音合成标记语言,可以控制断句分词、发音、语速、停顿、声调和音量等特征,也可以加入背景音乐。标签用法请参见SSML 标记语言介绍。
多音字的发音如何确定?
遇到不构成词组的多音字时,语音合成服务会根据上下文预测读音,并选择一个发音。
发音错误或多音字读音不符合预期时怎么办?
可以尝试将多音字替换为同音的其他汉字,或使用 SSML 控制发音。SSML 还可以控制断句分词、语速、停顿、声调和音量等特征,也可以加入背景音乐。具体用法请参见SSML 标记语言介绍。
支持只调整部分文本的语速吗?
支持,可以使用 SSML 控制部分文本的语速。具体用法请参见SSML 标记语言介绍。
普通语音合成使用 SSML 时需要设置 enable_ssml 吗?
通过 WebSocket 的 SpeechSynthesizer 接口使用 SSML 时,不需要设置 enable_ssml=true。将完整的 SSML 文本作为合成文本提交,并选择支持相应标签的音色。
标签及音色的支持范围请参见SSML 标记语言介绍。
特殊符号和标点符号如何处理?
α、β、γ、ρ、sin、cos、tan 等特殊符号会读出相应发音。百分号按“百分之几”播报,冒号和括号作停顿处理,书名号和破折号暂不支持识别。
语音合成的读音正确率是多少?
语音合成采用概率模型,业界读音正确率在 96%~98% 之间,阿里云智能语音交互在通用场景下的测试准确率约为 97%。并非所有读音错误都能修复,可以尝试换字或使用 SSML 调整发音。
时间戳
语音合成时间戳有什么作用?
语音合成可以在输出音频流的同时返回汉字或英文单词在音频中的时间位置,用于字幕生成等场景。字级别时间戳和音素级别时间戳不是同一功能;音素级别时间戳可用于虚拟人口型驱动,支持范围需按音色确认。
begin_index 和 end_index 表示规范化文本单元的索引,不能直接作为原始输入字符串的字符偏移。字段含义和音色支持范围请参见语音合成时间戳功能介绍。
SSML 停顿会影响字幕时间戳吗?
会。使用 <break> 增加停顿后,后续文字的字幕时间戳会随音频中的停顿后移,而不是扣除停顿时间后计算。字幕应使用返回的音频时间定位,不能把文本索引换算为播放时间。
文本长度与调用方式
长文本语音合成有哪些调用限制?
长文本语音合成可将千字、万字等超长文本转换为音频,支持 PCM、WAV 和 MP3 格式,支持设置语速、语调、音量以及男声、女声,可以通过实时和异步方式获取合成结果。
普通语音合成支持 300 字符以下的文本;长文本语音合成最多支持一次合成 10 万字。具体限制和调用方法请参见长文本语音合成接口说明。
为什么语音合成限制单次调用的文本长度?
文本长度限制用于避免服务端资源浪费:一次合成过多文本,最终可能并未全部使用。通过 API 或 SDK 调用时,可以分段合成后拼接音频。
MRCP 调用多用于客服或呼叫中心。长时间连续播放不适合这类人机交互,通常会被打断或提前结束。对于千字或万字的新闻播报等需求,可以使用长文本语音合成,一次最多合成 10 万字。具体请参见长文本语音合成接口说明。
调用 CosyVoice 需要更换 Appkey 吗?
Appkey 用于标识项目,不区分普通语音合成和 CosyVoice 专用类型。同一项目的 Appkey 可以用于调用已开通的相应服务。调用 CosyVoice 时,仍需开通相应服务,并使用对应的接口协议和音色,不能直接沿用普通语音合成的全部请求参数。
合成延迟
合成延迟较大时如何处理?
合成效果提升通常伴随更高的算法复杂度和计算量,高级音色的合成耗时可能更长。可以采用流式接收方式,边接收音频边保存或播放,不必等待全文合成完成后再处理。
排查时应区分全文合成耗时与首包延迟。首包延迟是客户端发送完合成请求到首次收到服务端二进制音频数据的时间差;关注开始播放的等待时间时,应查看这一指标。接口和参数说明请参见语音合成接口说明。
为什么不同音色的合成延迟不同?
语音合成的实时率与模型算法复杂度有关。最快的模型 1 秒内可合成 33 秒音频,最慢的模型 1 秒内可合成 0.7 秒音频。普通音色和精品音色的延迟不同,算法效果更好的音色相对耗时更长。
错误排查
返回 Missing message appkey 时如何处理?
40000002 错误中的 Gateway:MESSAGE_INVALID:Missing message appkey 表示请求缺少 appkey。检查实际发送的请求是否包含项目 Appkey,并确认应用已加载对应配置。
该错误不同于 40020105 APPKEY_NOT_EXIST。后者表示传入的 Appkey 不存在,应检查是否填写了正确的项目 Appkey。
流式文本语音合成如何避免指令错误和空闲超时?
使用 FlowingSpeechSynthesizer 时,按以下顺序交互:
发送
StartSynthesis,等待服务端返回SynthesisStarted。通过
RunSynthesis发送文本。文本发送完毕后,发送
StopSynthesis,让服务端合成剩余文本并结束任务。结束指令不是小写的stop。
收到 SynthesisStarted 后应及时发送文本。约 10 秒内仍未发送首段文本会触发 40000004 IDLE_TIMEOUT。不要依靠文本末尾的标点代替 StopSynthesis;即使剩余文本没有标点,也应通过该指令结束输入。