事情本身不复杂,线索都在日志里。用 Azure 语音合成读商品文案,把重读成 chong、行读成 xing,整段听起来别扭;换成 gpt-4o-mini-tts 也一样,试过在文本里插拼音和空格都不稳定,短句里缺乏足够语境。

第一反应是「没有用 SSML 的读音控制标签」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。多音字依赖上下文判断,短句里信息不够。还有一种是合成接口不接受拼音,插进去会被读成字母。

另外,文案里混着型号和符号,分词边界被打乱。

上来先用 SSML 给多音字指定读音

curl https://eastasia.tts.speech.microsoft.com/cognitiveservices/v1 -H "Ocp-Apim-Subscription-Key: $KEY" -H "Content-Type: application/ssml+xml" --data-binary @ssml.xml

然后把读音写成 phoneme 标签而不是插进正文

python -c "print(open('ssml.xml',encoding='utf-8').read())"

再往下合成后检查音频时长是否合理

ffprobe -v error -show_entries format=duration -of csv=p=0 out.mp3

剩下的就是对多音字词表做一轮批量回归

python tts_regress.py --cases polyphone.csv --engine azure

怎么算真的好了,看的是同一批现象。抽查二十个多音字词,读音与人工标注一致,整段音频时长偏差在两秒以内,没有再把拼音读成字母。

多音字要在合成层用读音标签解决,往正文里塞拼音只会让模型把字母一个个念出来。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189