用本地语音识别搭建会议实时转写面板

你用的录音笔还在开会后生成一个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 脚本跑起来,给它插一只麦克风。


皖ICP备2025105865号-2|皖公网安备34010402704739号