同一份稿子在两代模型上差 6.44 倍:语音模型价格对齐的工程拆法

文章来源声明: 原文作者:诚小纯; 来源站点:掘金; 原文链接:https://juejin.cn/post/7689029674380443694; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

把价格对齐拆成单位、计量、取数、展示四层,并沉淀成可复用的Agent规则,适合做语音模型选型与成本核算的工程同学照表操练,避免拿不同量纲的价格直接横比。

问题定义:三行价格没有公共分母 ---------------

目录价里同时挂着三种量纲:按万字符、按音频秒、按百万词元。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 <span>--capability</span> TTS <span>--page-size</span> <span>60</span> <span>--output</span> json
bl model list <span>--capability</span> ASR <span>--page-size</span> <span>60</span> <span>--output</span> json
bl model list <span>--model</span> cosyvoice-v3-flash <span>--output</span> 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 <span>--text-file</span> text-zh<span>.txt</span> <span>--model</span> qwen-<span>audio</span>-<span>3.1</span>-tts-flash <span>--voice</span> longanhuan_v3<span>.1</span> <span>--format</span> wav <span>--out</span> new<span>.wav</span> <span>--output</span> json
bl speech synthesize <span>--text-file</span> text-zh<span>.txt</span> <span>--model</span> cosyvoice-v3-flash <span>--voice</span> longanyang <span>--format</span> wav <span>--out</span> old<span>.wav</span> <span>--output</span> 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 <span>--model</span> qwen-<span>audio</span>-<span>3.1</span>-tts-flash <span>--days</span> <span>1</span> <span>--output</span> json
bl usage stats <span>--days</span> <span>1</span> <span>--type</span> <span>Audio</span> <span>--output</span> json
bl monitor metrics <span>--metric</span> model_usage <span>--model</span> qwen-<span>audio</span>-<span>3.1</span>-tts-flash <span>--days</span> <span>1</span> <span>--output</span> json
bl monitor metrics <span>--metric</span> model_total_amount <span>--days</span> <span>1</span> <span>--output</span> json

两条 usage stats 返回空 items,两条 monitor metrics 返回空 series,都不报错,看着像"今天没用量"。账号级视图有数,但把当天几十次调用糊在一起,隔离不出语音这一单。差值法也不成立:--days 1 是滑动窗口,旧数据在自己掉出窗口,同期 input_tokens 从 470537 变到 443114,那段时间一次文本调用都没发。

bl log audit list <span>--hours</span> <span>1</span> <span>--model</span> qwen-<span>audio</span>-<span>3.1</span>-tts-flash <span>--output</span> json
bl usage free <span>--model</span> qwen-<span>audio</span>-<span>3.1</span>-tts-flash <span>--output</span> 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、返回秒数一并记进表。单位不同的两行价格,比出来的结论先丢掉。