问题定义:三行价格没有公共分母
目录价里同时挂着三种量纲:按万字符、按音频秒、按百万词元。1.5 元、0.8 元、0.00022 元并排比大小,得到的结论不成立。要横比,得先把每一单的数字折回同一个分母。
环境:一个装了百炼 CLI skill 的 coding agent(Node.js 18+,skill 包安装说明,合成与识别要 API Key,签发入口,参数见官方文档)。终端直装 npm install -g bailian-cli 命令一样。我对 Agent 说:
用百炼的 qwen-audio-3.1-tts-flash 和 cosyvoice-v3-flash 各合成一次 text-zh.txt,把两单的 usage 字段和产物时长都列出来。
单位层:目录扫出来的三套量纲
bl model list --capability TTS --page-size 60 --output json
bl model list --capability ASR --page-size 60 --output json
bl model list --model cosyvoice-v3-flash --output json
取价免登录、不消耗额度。19 族合成候选里两种单位并存:老的 cosyvoice、qwen3-tts 是"每万字符",新上架的 3.1 是"每百万tokens"。18 族识别候选更杂:fun-asr、paraformer、qwen3-asr 全按秒,只有 3.1-ASR 按词元。同族内部也有七倍半价差,3.1-ASR 流式版本输入价 6 元、非流式 0.8 元。
第一个坑在取价脚本里。--model 传版本名返回的是族视图,items[0] 未必是问的那个:我把 cosyvoice-v3.5-flash 的 0.8 元当成了 v3-flash 的价,一路算到"便宜 5.15 倍"才回去核对,实际是 1 元/万字符,倍数改回 6.44。族名查不到,cosyvoice-v99-flash 这种不存在的名也一样回 not found。
计量层:同一份稿子跑两遍
bl speech synthesize --text-file text-zh.txt --model qwen-audio-3.1-tts-flash --voice longanhuan_v3.1 --format wav --out new.wav --output json
bl speech synthesize --text-file text-zh.txt --model cosyvoice-v3-flash --voice longanyang --format wav --out old.wav --output json
这一跑
模型侧记的用量
产物时长
3.1-TTS
输入 133 词元、输出 311 词元、characters 253
24.88 秒
cosyvoice-v3-flash
只有 characters 253
27.92 秒
两代模型的量纲在这一步就分家了:新的报词元,老的只报字符。产物都是 24 kHz 单声道 wav。
等待时间也分家,而且分得更狠:同一份稿子,3.1 那一单命令行 2.2 秒返回,cosyvoice-v3-flash 等了 17.0 秒,差 7.7 倍;识别侧同一段音频三代分别用 0.9、0.9、1.7 秒。等待时间和单价属于同一笔账:一万条短语音串行跑,两代之间光等就差约 41 小时。
字节反算不是洁癖:CLI 写出的 wav 头部帧数是失真值,wave 读出 44739.24 秒,真实 24.88 秒,两代产物失真值一模一样。反算的办法很直白:中文稿产物 1194284 字节,减 44 字节头,除以 24000×2。拿 44739.24 秒去乘按秒计费的单价,账单直接估出三个数量级的差。
--voice 必填,漏掉报 Missing required flag: --voice,而 bl speech synthesize --list-voices --model qwen-audio-3.1-tts-flash 回的是"这个模型没有内置音色列表"。音色只能回官方音色页查,3.1 的 ID 带 _v3.1 后缀,模型与音色不能混用。
253 这个数拆得开:稿子 133 字符,120 个汉字加 13 个标点,汉字按 2、标点按 1,120×2+13 正好 253。英文稿没有这层放大,240 字符记 240。
取数层:三个面静默返回空,只有审计日志给逐单
先交代一个前提:这一节的命令在
bl帮助里都标着[Console],要bl auth login --console走浏览器登录;合成和识别吃的是 API Key,两拨凭证不是一回事。
bl usage stats --model qwen-audio-3.1-tts-flash --days 1 --output json
bl usage stats --days 1 --type Audio --output json
bl monitor metrics --metric model_usage --model qwen-audio-3.1-tts-flash --days 1 --output json
bl monitor metrics --metric model_total_amount --days 1 --output json
两条 usage stats 返回空 items,两条 monitor metrics 返回空 series,都不报错,看着像"今天没用量"。账号级视图有数,但把当天几十次调用糊在一起,隔离不出语音这一单。差值法也不成立:--days 1 是滑动窗口,旧数据在自己掉出窗口,同期 input_tokens 从 470537 变到 443114,那段时间一次文本调用都没发。
bl log audit list --hours 1 --model qwen-audio-3.1-tts-flash --output json
bl usage free --model qwen-audio-3.1-tts-flash --output json
逐单 usage 原文只有审计日志给,request_id、时间、用量齐。bl usage free 返回已用 1346 词元,四次合成的 total_tokens 相加 444+444+229+229 正好对上。多出来那笔是脚本崩在计费调用之后:辅助脚本一个拼写错误,调用已经发出去了,修好重跑等于同一份稿子合成两遍,不退钱,审计日志里也不显示成两次,只能被额度差值供出来。
额度面也只认完整模型名:bl usage free 传族名返回 total=0,换成版本名才有 1,000,000、剩余 998654、到期 2026-12-21。族名给的是一个看着合法的零,不核就当成"这个模型没额度"。
唯一可用的这条路,帮助文本还跟自己对不上:bl log audit list --help 只列了 [--hours <n>],同页 --start-time 却写着"overrides --days",真传 --days 得到 Unknown flag "--days"。以报错为准:照帮助文本拼命令会稳定失败。
展示层:折回同一个分母
同一份 133 字稿(253 计费字符 → 24.88 秒音频)
这一单
元/万字符
元/分钟音频
qwen-audio-3.1-tts-flash
0.0039315 元
0.1554
0.0095
cosyvoice-v3-flash
0.0253 元
1.0000
0.0610
识别侧同一段音频喂三代:3.1-ASR 这一单 0.0004996 元,qwen3-asr-flash 0.00528 元、fun-asr 0.00506 元,与前者分别差 10.57 倍和 10.13 倍;折到每分钟,3.1 是 0.0012 元,另两代都是 0.0132 元。词元不能当分母:同一段音频 3.1 记 368 个输入词元(14.72/秒),qwen3-asr-flash 记 622 个(25.92/秒),密度差 1.76 倍;单价看计费文档;--context(最长 400 字)在 help 里,效果本文没验。
成本结构里 94.93% 落在输出侧:输入 133 词元按 1.5 元/百万计不到一分钱,输出 311 词元按 12 元/百万计,是输入侧的 18.7 倍。文案从 133 字压到 100 字账单几乎不动,音频时长砍掉三分之一账单才跟着砍三分之一。
识别侧三单的原始字段是三套结构:3.1-ASR 记 duration 25 秒加输入 368、输出 76 词元,qwen3-asr-flash 记 seconds 24 与 audio_tokens 622,fun-asr 只有 duration 23、一格里没有词元。取整、静音、字段名三处全不一致,逐单原文留档比折算结果更有用。
转写质量的两个旁证都不在价格面上:3.1 与 qwen3-asr-flash 都把稿里的"词元"听成"词源",原文入档没纠错。--vocabulary 在 fun-asr 上真生效了,帮助文本却写着"仅在 Qwen-Audio-3.0-ASR-Flash 模型上生效":同一份音频不加词表出来是"我上周在磐岳科技参加了班西论坛,主讲人讲的是磐岳芯片!",加 --vocabulary '{"蟠越":5,"鳻溪":5}' 之后是"我上周在蟠越科技参加了班西论坛,主讲人讲的是蟠越芯片。""蟠越"两处全修对、句末标点也跟着回正,"鳻溪"两次都错成"班西",权重给到 5 没救回来。文档划的适用范围要自己跑一次再排除,词表也不是越高越保险。
沉淀给 Agent 的规则
取价:
bl model list --model <版本名>返回族视图,必须按items[].model精确匹配再取价;估中文合成预算按"字符数×2"起算;计费调用发出后脚本崩了不会退款,先过语法检查再进计费链路,每跑一次用bl log audit list对一次逐单 usage。
取数与核算:帮助文本与报错冲突时以报错为准;产物时长按字节反算,不读 wav 头部帧数;两行价格单位不同,先换算再比较。
重试这一项可以放心交给自动化:同稿同音色跑两次 3.1,两个 wav 的 MD5 都是 7a8e577b9515ca954f4d18afd1841439,逐字节相同。--seed(0-65535)在参数表里挂着,但对这个模型不是复现前提。代价是重试仍然计费,省钱的开关在时长与分段。
额度按官方规则核:3.1 合成与识别各有 1,000,000 词元、2026-12-21 到期,paraformer-v2 是 36000 秒、到期显示 2099-01-01,cosyvoice 用版本名查额度返回空,规则见免费额度说明(每模型独立、90 天、仅北京地域、过期不补发、用尽不自动切换);这批全部落在额度内,实付 0 元,额度用尽后按目录价,别把传言里的永久有效写进预算表。
横比之前先做四步:目录扫单位、同素材跑两代、审计日志取逐单 usage、返回秒数一并记进表。单位不同的两行价格,比出来的结论先丢掉。