这类问题我又碰上了一次。用 TTS 接口批量合成 2000 条商品播报,脚本里每条前面加了标题和空行,账单字符数比正文统计多出 38%,按正文长度怎么算都对不上。

第一反应是「SSML 标签被当成普通字符」,验证下来不成立。

真正麻烦的地方在于,几个原因的现象几乎一样。计费按请求里的原始文本字符数;空行与换行符也计入;重试的请求重复计费。

算一条请求的真实字符数

python -c "s=open('script.txt',encoding='utf-8').read();print(len(s),len(s.strip()))"

去掉空行与多余空白再提交

python clean_tts.py --in script.txt --out clean.txt --strip-blank

然后分批合成并记录每批字符数

python tts_batch.py --file clean.txt --log tts.jsonl

等前面都确认过,再用去标签后的纯文本对比账单

python -c "import re;s=open('clean.txt',encoding='utf-8').read();print(len(re.sub(r'<[^>]+>','',s)))"

同一份数据我导出了两份,一份留底,一份拿来试。

恢复的判定其实很直接。账单字符数与提交的纯文本长度一致,差异收敛到 1% 以内,空行不再产生费用。

补一句。不同厂商对 SSML 的计费口径不一样,有的按标签前文本算,接新厂商先用一条短样本试账。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189