这类问题我又碰上了一次。用 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 的计费口径不一样,有的按标签前文本算,接新厂商先用一条短样本试账。这类问题最好一次改到位,反复小改反而容易把原因搅混。
