你用的录音笔还在开会后生成一个3小时的MP3,等着你下班路上慢慢听——听完前十分钟就睡着了,最后连决议都记岔了。
用一个本地模型,一边开会一边实时出转写、带时间戳、带说话人标签。会议结束,全文纪要已躺平。不用联网,不用花钱,用的是你手头那台普通笔记本。
这条路以前是怎么走的?
传统操作:
开会时录音,散会后把音频拖进讯飞听见、腾讯云或者某个付费ASR平台,等几分钟转写完成,然后对着纯文本大海捞针式找重点。
痛点明摆着:
– 延迟巨大——从录完到看到文本,10分钟起步
– 隐私裸奔——所有语音都上传到云端
– 无法实时干预——开完会才发现关键部分录音模糊,已经晚了
– 说话人标注靠猜——即使云端厂商提供说话人分离,也是一次性、不可调整的
如果用 Zoom 或飞书自带的实时字幕,又绑定特定平台,而且中文混合英文术语的识别经常翻车。
有没有一条路:在本地、实时、还带说话人区分?
有。
Mega-ASR + 说话人分离,给开会装一个“本地大脑”
今年 Hugging Face 上出现了一个名为 Mega-ASR 的语音识别模型——专门为高精度实时转写优化。配合 pyannote/speaker-diarization-3.1 做说话人分离,可以串出一条完整的实时会议记录流水线。
原理用一句话就能讲明白:
麦克风音轨流式送入 Mega-ASR,每识别出一个片段,就交给说话人分离模型判断“这句话是谁说的”,最后拼成一个带时间戳和标签的记录文本。
你可以理解为:音频像毛衣毛线一样被两个机器同时拉扯——一个在逐字拆解成文字,另一个在给每段话贴上“张三说”“李四说”的标签。
跑起来要几步?
如果只是想试一下,不需要写前端,直接用 Python 脚本 + 终端显示就能体验实时转写。以下是最小可用的链路。
第一步:安装依赖
用 pip 拉取所需库。pyannote 的说话人分离需要预训练的模型,通过 Hugging Face 令牌下载。
pip install mega-asr pyannote.audio sounddevice
# pyannote 还需要 torch、torchaudio,如果环境没装的话会自动带上
第二步:编写实时转写脚本
以下脚本会实时录音,每识别一段文本,立即调用说话人分离进行动态标定,然后在终端打印结果。
import sounddevice as sd
from mega_asr import MegaASR
from pyannote.audio import Pipeline
import numpy as np
# 1. 加载模型
asr = MegaASR.from_pretrained("zhifeixie/Mega-ASR") # 语音识别
diarization = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token="你的HF_TOKEN"
)
# 2. 录音参数
SAMPLE_RATE = 16000
CHUNK_DURATION = 2.0 # 每2秒处理一次
buffer = np.array([], dtype=np.float32)
def audio_callback(indata, frames, time, status):
global buffer
buffer = np.concatenate((buffer, indata.flatten()))
if len(buffer) >= SAMPLE_RATE * CHUNK_DURATION:
chunk = buffer[:int(SAMPLE_RATE * CHUNK_DURATION)]
buffer = buffer[int(SAMPLE_RATE * CHUNK_DURATION):]
# 3. 语音识别
text = asr.transcribe(chunk, sampling_rate=SAMPLE_RATE)
if text.strip():
# 4. 说话人分离(需要将音频保存临时文件,或传入波形,pyannote 接受音频文件路径)
import tempfile, soundfile as sf
with tempfile.NamedTemporaryFile(suffix=".wav", delete=True) as f:
sf.write(f.name, chunk, SAMPLE_RATE)
diarization_result = diarization(f.name)
speaker = "Unknown"
for turn, _, spk in diarization_result.itertracks(yield_label=True):
if turn.start <= CHUNK_DURATION / 2 <= turn.end:
speaker = spk
break
print(f"[{speaker}] {text}")
# 5. 启动录音流
stream = sd.InputStream(
samplerate=SAMPLE_RATE,
channels=1,
callback=audio_callback,
dtype='float32'
)
stream.start()
input("实时转写中... 按回车停止\n")
stream.stop()
注意:这里为了简单,在每次 2 秒的片段上直接做说话人分离,实际效果可能会因为片段太短而不够稳定。更严谨的做法是缓存更长的上下文,但先跑通这个链路已经能达到实时带标签的输出了。
相比云端方案,这个本地搭的“草台班子”好在哪里?
用一个简单的表格就能看明白:
| 维度 | 本地 Mega-ASR + pyannote | 云端 ASR 服务 |
|---|---|---|
| 延迟 | 实时(<2秒) | 录音完成后 5–15 分钟 |
| 隐私 | 音频不出本机 | 完全上传到第三方 |
| 成本 | 一次硬件投入,免费 | 按小时或按字符收费 |
| 中文混合英文术语 | 较好(Mega-ASR 对切换敏感度低) | 取决于厂商,经常掉词 |
| 说话人分离 | 可实时调参,可回放修正 | 一次性结果,无法调整 |
| 离线可用性 | 无网也能跑 | 断网即瘫痪 |
真实场景里,一个 2 小时的会议,本地方案几乎零额外成本;若用量大,云端一年的费用可能足够买一台不错的工作站。
但诚实地说:本地方案 不是没有坑。
Mega-ASR 对长语音的上下文连续性比不过微调的 Whisper-large-v3,特别是一个词说完停顿 3 秒再接上,容易丢掉后半句。说话人分离也是弱项:pyannote 在安静会议室表现尚可,一旦有背景键盘声、多人打断,总会出现张冠李戴。
因此它的适用边界很清晰:
5 人以内的内部讨论、远程视频会议、个人语音日记——效果接近可用。
大型演讲、嘈杂圆桌、法庭记录——现阶段仍需云端专有模型兜底。
这不只是个“转写工具”
很多人把语音识别看作“听写”,但一旦加上实时和说话人标签,性质就变了:
你可以在开会时直接搜索某个关键词,一秒钟定位到 30 分钟前谁提过它,然后当场追问。你不需要再做笔记,只需要在实时文本旁做批注。会后自动生成时间轴,回放时点哪停哪。
更激进一点:假如你把这个转写结果实时喂给一个本地大模型(比如 Ollama 拉取的 7B 模型),它就能在会议结束时为你生成一份带有“会前承诺→讨论过程→最终决议”结构的摘要。这是一条 没有延迟、数据不离电脑的管道。
几十年前,速记员是高管开会标配;现在,一段代码就能替掉这个角色,而且从不出错、不问涨薪。
而你要做的,可能只是把上面那段 Python 脚本跑起来,给它插一只麦克风。
