买转写 API 之前,先用 5 段真实音频算清「自托管还是付费」这道题

2026-10-30 Skills语音成本决策

转写模型现在多到选不过来: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 段嘈杂、1 段带专有名词,全部有人工校对的答案文本。
  2. 每个方案都有归一化后的 WER 数字,不是「听着还行」。
  3. 两个方案的月成本有算式:单价 × 实际月时长,写得出数字。
  4. 决策落在 3 个阈值之一,并且记录了决策日期——半年后音频量变了可以复查。
  5. 换方案时拿同一样本集回归测试,WER 不劣化超过 1 个百分点才算切换成功。

坑

  • jiwer 不归一化,WER 全是假数。 大小写、标点、全半角数字会让同一份转写差出 10 个百分点。
  • 实时流和录音是两个物种。 Nemotron 3.5 Transcribe 只支持录音;要做直播字幕,看的是流式延迟指标,别拿这套流程决策。
  • API 的计价单位要核对。 有的按秒、有的按分钟、有的按 token,0.000033 美元/秒和 2 美元/小时看起来差不多,实际差 5 倍——换算成同一单位再比。
  • 标准答案本身也有错。 人工校对的参考文本建议两个人各校一遍,尤其专有名词。
  • 本地 GPU 会被占满。 转写跑批时同一张卡上的其他服务会卡,自托管要算上错峰或加卡的钱。