先把当时的情况摆出来。语音合成按输出音频秒数计费,批量生成 2000 条播报,其中 37 条文本是空字符串,接口仍然返回 200 和一段 0.4 秒静音,账单里照样计费。

把日志和配置对完,能解释这个现象的基本就这几处。空文本没有在调用前拦截。还有一种是静音片段也按输出时长计费。

还有一种情况,失败重试重复合成了同一条。另外,批量任务没有做文本去重。

生成前先过滤空文本与纯标点

python -c "import re;rows=[l.strip() for l in open('texts.txt',encoding='utf-8')];print(len([r for r in rows if re.search(r'[\u4e00-\u9fffA-Za-z0-9]',r)]))"

然后统计每条文本的字符数与音频秒数

python -c "import json;rows=[json.loads(l) for l in open('tts.jsonl')];print(sum(r['seconds'] for r in rows))"

接着用返回的时长字段与账单条数对账

python -c "print({'billed':2000,'valid':1963})"

剩下的就是对失败重试加幂等键,避免重复合成

python -c "import hashlib;print(hashlib.md5('第1条'.encode()).hexdigest())"

怎么算真的好了,看的是同一批现象。账单条数与有效文本数一致,空文本不再产生费用,重复合成的记录为 0。

补一句。按秒计费的接口对空输入往往照样返回音频,调用前校验比事后对账便宜得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189