买转写 API 之前,先用 5 段真实音频算清「自托管还是付费」这道题
转写模型现在多到选不过来:Nemotron 3.5 Transcribe 开源了、Deepgram 在做全家桶、whisper 家族还在更新。大多数人的选法是「看榜 + 拍脑袋」,然后要么为不用的精度多付钱,要么在自托管上白烧一个周末。
这件事 20 分钟可以算清楚,前提是你手里有一把真实的尺子。
第一步:攒 5 段「你的」音频(5 分钟)
不要用评测集,用你真实会处理的素材:一段带产品名的客户电话、一段有口音的访谈、一段嘈杂的会议室录音、一段安静的单人独白、一段双语混杂的片段。每段 1 到 3 分钟就够。
转写选型的第一原则:别人的榜单测的是别人的音频。你的素材里那些人名、术语、口音,榜上一分都不占。
第二步:跑对比脚本(10 分钟)
同一个样本集,分别喂给你在考虑的两三个方案(API 一个、本地一个),量词错率(WER)。用 jiwer 做归一化对比:
pip install jiwer faster-whisper openai
import jiwer
from faster_whisper import WhisperModel
from openai import OpenAI
# 样本集:每段音频配一份人工校对的标准答案
samples = [
("audio/interview_01.mp3", "ref/interview_01.txt"),
("audio/call_noisy.mp3", "ref/call_noisy.txt"),
# ... 共 5 段
]
transformation = jiwer.Compose([
jiwer.ToLowerCase(),
jiwer.RemovePunctuation(),
jiwer.RemoveMultipleSpaces(),
jiwer.Strip(),
])
def wer(ref: str, hyp: str) -> float:
return jiwer.wer(ref, hyp,
truth_transform=transformation,
hypothesis_transform=transformation)
# 方案 A:本地(faster-whisper 示例)
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
# 方案 B:API(以 OpenAI 兼容接口为例,换成实际厂商)
api = OpenAI(base_url="https://api.deepinfra.com/v1/openai",
api_key="你的 key")
for audio, ref_path in samples:
ref = open(ref_path, encoding="utf-8").read()
segs, _ = model.transcribe(audio)
hyp_local = " ".join(s.text for s in segs)
hyp_api = api.audio.transcriptions.create(
model="nvidia/nemotron-3.5-transcribe",
file=open(audio, "rb")).text
print(f"{audio}: 本地 WER={wer(ref, hyp_local):.1%} "
f"API WER={wer(ref, hyp_api):.1%}")
三个必须做的归一化:转小写、去标点、合并空格——不做的话数字全是水分。中文场景把 jiwer 换成按字计算(或用 CER),思路一样。
第三步:把两张账放进同一张表(3 分钟)
记 4 个数,每个方案一行:
| 数 | 怎么来 |
|---|---|
| WER | 第二步的输出,5 段取平均 |
| 单价 | API 用官方页每秒/每分钟价;本地用「显存占用 × 卡时价格」折算 |
| 月音频时长 | 数你上个月真实处理了多少小时,别估 |
| 吞吐 | 本地方案转 1 小时音频要几分钟实际等待 |
月成本就是 单价 × 月时长。本地方案别忘了加上你折腾环境的时薪——时薪 200 的人花 6 小时装环境,摊下来比 API 贵得多。
第四步:按阈值决定(2 分钟)
- 月音频 20 小时以下:直接 API。0.12 美元一小时的价位,一年也花不到 30 美元,省下的时间远值这个数。
- 月音频 50 小时以上,或音频涉及客户隐私:值得自托管。硬件摊销 + 电费通常低于 API,而且音频不出本机是卖点,可以写进你的服务条款。
- 两者之间:先 API 起步,把每月成本记进账;连续两个月超过 50 小时再迁本地,迁的时候样本集和脚本都是现成的。
还有一个容易被忽略的混合打法:初筛用便宜方案,WER 超阈值的段落再精转。粗转一遍,脚本标出置信度低的片段,只对这些片段调贵的服务——成本常能砍一半以上。
五条验收标准
- 样本集里至少 1 段嘈杂、1 段带专有名词,全部有人工校对的答案文本。
- 每个方案都有归一化后的 WER 数字,不是「听着还行」。
- 两个方案的月成本有算式:单价 × 实际月时长,写得出数字。
- 决策落在 3 个阈值之一,并且记录了决策日期——半年后音频量变了可以复查。
- 换方案时拿同一样本集回归测试,WER 不劣化超过 1 个百分点才算切换成功。
坑
- jiwer 不归一化,WER 全是假数。 大小写、标点、全半角数字会让同一份转写差出 10 个百分点。
- 实时流和录音是两个物种。 Nemotron 3.5 Transcribe 只支持录音;要做直播字幕,看的是流式延迟指标,别拿这套流程决策。
- API 的计价单位要核对。 有的按秒、有的按分钟、有的按 token,0.000033 美元/秒和 2 美元/小时看起来差不多,实际差 5 倍——换算成同一单位再比。
- 标准答案本身也有错。 人工校对的参考文本建议两个人各校一遍,尤其专有名词。
- 本地 GPU 会被占满。 转写跑批时同一张卡上的其他服务会卡,自托管要算上错峰或加卡的钱。