会议录音又测了两周,本地转写已经够用了
上一篇文章发出去之后收到不少反馈,有人提了 whisper.cpp 的本地转写方案,有人分享了硬件混音器的思路。我花了两周把这些新方案全部测了一遍,写个更新版。
whisper.cpp,本地转写真的能用了
之前做会议纪要,转写这一步都是调 API 的,Whisper API 或者 Deepgram。成本不高,但延迟这个问题挺致命的。三小时的会议,录完要上传、等转写、再拿结果,整个流程十分钟起步。换成本地模型就没这个事,录完几秒钟结果就出来了。
whisper.cpp 是 OpenAI Whisper 模型的 C++ 移植,支持 Apple Silicon 的 GPU 加速。我在 M2 Max 上跑 large-v3 模型,一小时的音频大概 3-4 分钟转完,准确度跟 API 版基本持平。
但它有个关键的局限,就是不分说话人,也就是没有 diarization。Whisper 本身只管把话转成文字,谁说的它不知道,你得额外再跑一个 diarization 模型,让它去分谁是谁。目前最好的开源方案是 pyannote-audio,跟 whisper.cpp 搭配的话,胶水代码要自己写。
我实测下来的流程大概是这样的:录音 → whisper.cpp 转写 → pyannote 做说话人分离 → LLM 生成纪要。全程本地,零网络依赖,录音结束后 5 分钟以内出结果。这个效果已经够用了。
虚拟声卡这边也有新进展
BlackHole 的开发者最近更新了 2ch 和 16ch 两个模式。16ch 版可以把系统音频和多个麦克风同时录到不同的音轨上——如果你需要每个说话人各自独立的音轨,这是目前唯一的免费方案。
把混在一起的会议声音拆成独立音轨,说话人身份就免费拿到,不用再靠算法去猜谁在说话。
还有个叫 Sunshine 的东西(一个 GameStream 的替代品),最近也在 macOS 上实现了系统音频捕获。实现方式有点黑,是靠装一个虚拟音频设备扩展进去的。它本来就不是为会议录音设计的,但实测效果还不错。
物理混音器,最笨的办法最稳定
测软件方案的时候,我顺便试了个物理混音器的思路:给开会那台 Mac 的耳机孔插一根 AUX 线,另一头接到录音的手机上。听起来是最笨的办法,但实测下来它是所有方案里最稳定的。
好处是它不需要任何软件权限,也不依赖操作系统版本,苹果的音频安全策略随便怎么改,这根线都照用。缺点也有,AUX 走的是模拟信号,会有底噪,而且你得多准备一台录音的手机。
还有一个点,硬件录音把隐私这个问题顺手也解决了。线插着就是在录,拔了就是没录,用户自己看得见。软件的隐私声明说到底还是要用户去信那段文字,物理的线不存在这个问题,状态就摆在那里。
现在的推荐方案
轻量用户:QuickRecorder + ScreenCaptureKit。零配置,系统音频直接录。
技术用户:whisper.cpp + pyannote + BlackHole 16ch。完全本地化,带说话人分离,多音轨。
对隐私极度敏感的:硬件混音器 + AUX 录音。物理隔离,没有软件权限的问题。
我自己现在的日常方案是 QuickRecorder + whisper.cpp 本地转写 + claude 生成纪要。会议结束五分钟以内,手上就能有一份带说话人标注的结构化纪要。反正对我来说,这个体验已经很接近理想状态了。