开会最怕的其实不是议题太长,是网突然断了。录音传不上去,后台转写直接卡住,同传字幕也跟着停摆。更头疼的是——敏感内容往第三方服务一丢,服务器在国外,合规部门第一个跳出来不答应。跟网络和云服务商斗智斗勇太折腾,不如把整套转写能力直接搬到桌面上,离线搞定。

本地跑语音转文字,三年前还是折腾的代名词。得装 Python、配 CUDA、搞虚拟环境,whisper 的依赖能让你怀疑人生。2025 年不一样了。Ollama 把模型拉取、版本管理、推理接口全封装好,终端敲一行命令就完事。数据不出内网,不交按分钟计的转写费,风扇转起来都比云服务靠谱。咱们聊聊怎么搭这套东西。

先聊个真问题:录音传不上后台怎么办

在线转写确实爽。按下录音键,文字一行一行往外蹦,科技感拉满。可一旦会议室 Wi‑Fi 抖一下,或者路由器过热重启——转写卡住,重试,再卡住。半小时的讨论拖成一小时。我有次拿手机热点救急,结果月底一看话费账单,多了两百多块的流量费。更闹心的是隐私条款。你永远不知道那段音频会在云上存多久,会不会被拿去训练模型。去年公司内部审计把“未经批准使用外部 API”列为高风险,项目直接停摆两周。

费用也在暗处涨。按分钟计费看着不起眼——一分钟一毛多。真到月底,赶上季度复盘密集期,一周三四个会,每次三四十分钟,一年下来几百上千分钟很轻松。本地方案呢?一次部署,计算全在本机,不联网,不超量,不看任何人的脸色。隐私、合规、稳定性、可控成本——四条线一拉,本地部署就成了没得选的刚需。

Ollama 让这件事变得像喝水一样简单。它把模型拉取、量化、GPU 适配打包成一条命令。装好之后 ,再 ,一个 HTTP API 就在本地 11434 端口上等着了。我在自己那台 ThinkPad T14p 上跑通了短会纪要流程,风扇转得比云服务器还诚实。工具顺手之后,你再也不想回到“上传—等待—下载”的老路。

online speech to text privacy risk

Ollama 是什么?一个让你不用配环境的底座

你可能问:为什么不直接装 Python 跑 Whisper?我试过。先配 CUDA——版本要对,驱动要更新,torch 和 CUDA 的版本还得匹配。然后 pip install openai-whisper,等它把依赖下载完。接下来跑一遍测试,报错说缺少 ffmpeg。装好 ffmpeg 再跑,又报显存不足。最后总算能跑了,换模型——从 tiny 换到 medium——得手动改参数、清缓存,还得调采样率。折腾一圈下来,感觉自己在搞考古。

Ollama 把这一切压缩成两条命令。终端敲 ,它会自动把模型下载到 ~/.ollama/models 下,同时完成量化、版本管理和 GPU 适配。再敲 ,服务就在本地跑起来了。跨平台做得挺好:Windows 靠 WSL2,macOS 有原生 pkg,Linux 一条 shell 命令。M 芯片的 Mac 可以直接走 Metal 加速,不用手动装任何东西。

它的模型库不光有 Llama、DeepSeek 这类大语言模型,还整合了 Whisper 系列——tiny、base、small、medium、large-v3 一应俱全。社区也有不少人把语音转文字的流程封装好,拉下来就是一套完整的推理服务。你用 curl 或者 Python 的 requests 就能往里面扔音频,拿回识别文本。

Ollama 自带一个 Modelfile 配置机制,允许你自定义推理参数。比如想让 Whisper 用更低的采样率来跑更长的会议录音,可以写个 Modelfile 指定 ,然后用 构建自己的定制模型。这种灵活度,不比云上动辄改配置等部署香?

# Modelfile 示例
FROM whisper:large-v3
PARAMETER temperature 0.0
PARAMETER max_tokens 2048

装好后你甚至不需要图形界面。服务端在后台跑,任何语言的 HTTP 客户端都能调——Python 的 requests、Node 的 axios、甚至 shell 脚本里的 curl。这给后面集成到会议纪要流水线留足了空间。一台笔记本,一条命令,一个接口。离线语音转文字的底座就这么搭起来了。

Ollama terminal command running Whisper model

手把手部署 Whisper:从命令到跑通第一批录音

Ollama 装好只是热身。真正让电脑“听懂”人话,得靠 Whisper 模型。别担心,全程两条命令,不用碰任何环境变量。

先装本体。打开浏览器进 ollama.com,点 Download——macOS 直接下 pkg 双击一路下一步;Windows 依赖 WSL2,记得先在“启用或关闭 Windows 功能”里把 Linux 子系统勾上。装完终端跑 ,看到类似 “0.1.9” 的数字就说明活了。

然后拉模型。终端敲 。第一次会下载约 700MB 的模型文件,家里带宽慢就挂代理。进度条走完,终端提示 “Success”。这时敲 ,会自动进入交互模式,对着麦克风说句“你好世界”,回车就能看到转写的汉字。

会议录音总不能一句一句念吧?直接甩文件:。几秒钟后,整段文字就吐回来了。如果报错 “CUDA out of memory”,说明显存不够——换成 tiny 或 base 版本;M 芯片的 Mac 自动走 Metal 加速,无需额外设置。

几个容易踩的坑:模型下载龟速的话,改 hosts 或给 ollama 服务端挂代理都能救。WSL2 找不到 GPU,记得确认 Windows 驱动已更新,并在 .wslconfig 里开启 “gpuSupport”。输出全是英文时,把音频采样率切成 16kHz 再喂给模型,识别准确率能明显回升。

至此,一台离线机器已经具备“听见即文字”的能力。接下来就可以把它串进自动化脚本,生成会议纪要了。

从录音到文字:归一化、转写、批量处理

模型跑起来了,终端里敲两句 demo 没问题。但真拿会议录音去转,你很快会发现事情没那么简单。我第一个扔进去的是个 40 分钟的部门周会录音,WAV 格式,采样率 48kHz,双声道。Ollama 吭哧了三分多钟,吐回来的文本里“这个功能下周上线”被识别成了“这几个功能下周二选”。差了一个字,意思全歪。

问题出在音频格式上。会议录音来源五花八门:手机录音笔出来的 m4a、腾讯会议导出的 mp3、老式录音机转的数字文件。Whisper 训练时用的标准输入是 16kHz 单声道 16-bit PCM。你扔一个 44.1kHz 的立体声进去,模型内部会做重采样和混音,但这个过程不可控,丢信息是常态。我习惯用 ffmpeg 一把梭——跨平台、命令行、脚本友好。下面这条命令把任意格式的录音转成 Whisper 最爱的样子:

-ac 1 强制单声道,-ar 16000 设采样率到 16kHz,-sample_fmt s16 保证位深是 16 位。跑完看一眼文件大小:一个小时的会议录音,大概 110MB 左右。如果原始文件是 m4a 或 ogg,ffmpeg 照样吃,不用改参数。但有个坑:iPhone 录的 m4a 其实是 AAC 编码,ffmpeg 转码时会报 “Invalid AAC bitstream” 警告,不影响输出,但强迫症如我会加 -bsf:a aac_adtstoasc 把它压住。

音频准备好之后,调 Ollama API。服务跑起来后监听在 ,API 路径是 /api/generate。POST 一个 JSON 过去,模型名填 ,把音频文件的 base64 编码塞进 data 字段。下面这个脚本是我现在流水线里用的版本:

import requests, json, base64

def transcribe(audio_path, model="whisper:small"):
    with open(audio_path, "rb") as f:
        audio_b64 = base64.b64encode(f.read()).decode("utf-8")

    payload = {
        "model": model,
        "data": audio_b64,
        "options": {
            "language": "zh",
            "temperature": 0.0
        }
    }
    resp = requests.post("http://localhost:11434/api/generate", json=payload, stream=True)
    result = ""
    for line in resp.iter_lines():
        if line:
            chunk = json.loads(line)
            if chunk.get("done"):
                break
            result += chunk.get("response", "")
    return result

stream=True 是因为 Ollama 默认流式返回 token,逐行读取拼起来就行。如果嫌麻烦,也可以把 stream 设成 false,等全部结果一次性返回——但大文件下内存占用会暴涨,不推荐。

语言参数 "language": "zh" 是关键。不加这个,Whisper 会先做语言检测,遇到中英混杂的会议录音容易翻车——英文单词被当成拼音转成中文的情况我见过好几次。“OKR”硬生生变成了“欧开尔”。指定语言后,模型跳过检测阶段,准确率能提一截。

单文件搞定后,就是循环。我习惯按日期组织目录: 下面全是 .wav。脚本扫一遍,逐个扔给 Ollama,结果存成同名的 .txt.srt——后者带时间戳,方便后期剪音频时定位。

import os, glob

input_dir = "recordings/2026-03"
for wav_path in glob.glob(os.path.join(input_dir, "*.wav")):
    base = os.path.splitext(wav_path)[0]
    text = transcribe(wav_path)
    with open(base + ".txt", "w", encoding="utf-8") as f:
        f.write(text)
    print(f"done: {os.path.basename(wav_path)}")

这段代码不加并发,老老实实一个一个来。Ollama 默认只跑一个模型实例,并发请求会排队,写多线程没意义。如果你显存够大(比如 24GB 以上),可以同时跑两个 whisper 实例,但收益边际递减,反而容易 OOM。第一次跑完整个三月的 12 段录音,看到 03-15.txt 在目录里出现时,我松了口气。录音从一头进去,文字从另一头出来,中间不需要人盯着。

但转写只是第一步。文字有了,还得从里面提炼出“谁说了什么、结论是什么、待办给谁”。

AI meeting minutes generation from transcript

让 LLM 把毛坯文本精装成会议纪要

转写出来的长文本只是毛坯。下一步是让本地 LLM 把它变成能直接发到群里的纪要。我跑的是 Llama 3:8b 或 Qwen2.5:7b,显存 16GB 完全吃得消。

别让模型“自由发挥”,给它一张明确的任务单。我把这段提示存成

你是会议助理。只根据提供的转写文本,输出 Markdown 格式的纪要。
要求:
- 识别所有发言人,并统计每人发言占比
- 提取 3–5 个核心讨论主题,给出对应时间戳(mm:ss)
- 列出明确的结论/决议
- 生成待办事项,按人名归集,状态为「待跟进」
- 若信息缺失,在文末列 [需补充] 清单
不要复述细节,不要保留闲聊,全文控制在 400 字以内。

命令很简单:cat prompts/meeting_minutes.md + 转写文本 | ollama run llama3:8b。如果用 Python,可以直接调 ollama 的 API:

import ollama
resp = ollama.chat(
    model='llama3:8b',
    messages=[
        {'role': 'system', 'content': open('prompts/meeting_minutes.md').read()},
        {'role': 'user', 'content': open('recordings/2026-03/03-15.wav.txt').read()}
    ],
    options={'temperature': 0.3}
)
print(resp['message']['content'])

温度设到 0.3 左右,句子会更稳。遇到中英混杂的录音,我在系统提示里加了一句“保留英文术语原样,不翻译缩写”。实测能把“OKR”“PRD”这类词看住。偶尔会漏掉时间戳,我就写了个后处理脚本,拿正则把 (mm:ss) 找回来补上。

把转写和总结串起来并不复杂:先 whisper 出文本,再让 llama3 过一遍。全部写完回写到同目录的 .md。整个过程不需要联网,适合公司内网。唯一提醒一句:跑批量之前,先确认 Ollama 版本不低于 0.3.0,早期的 API 返回格式跟现在不一样,会出解析错。

隐私与成本双赢:这套方案的实际表现

转写和总结的流水线搭好之后,我反而花了几天犹豫——真要把公司那堆周会录音丢进去跑吗?担心什么?不是效果。Whisper small 在我那台 ThinkPad T14p(8GB 内存)上跑 30 分钟的录音,大概需要 5 分钟转完。准确率嘛,普通话能在 90% 以上,偶尔把“迭代”听成“带她”,但上下文一校正就回来了。Llama 3:8b 再压一遍,纪要生成不到 1 分钟。比我想的快。

真正让我下决心的,是隐私。之前用过某云的语音接口,录音传上去,第二天销售就打电话来问要不要升级套餐。你可以说是巧合,但那种感觉很不舒服。尤其会议室里聊的是下季度的裁员名单、未公开的融资条款——这些东西传到别人的服务器上,夜里是睡不着的。Ollama 的所有推理跑在本地。Whisper 模型也是从 Hugging Face 拉下来本地加载。网络断开照样跑。我甚至把 Ollama 绑到了 127.0.0.1:11434,防火墙封掉外访。数据从麦克风到 .md 文件,没出过这根网线。

钱这事真不用细算。一台二手16GB内存的小主机,2500块搞定,电费?基本忽略。Whisper、Ollama,连带模型全是开源的,一个钢镚都不花。反过来,云上语音转写按分钟收,一次周会30分钟,一年50周,轻轻松松干到上千块。你还别忘,那边LLM调一次就记一次token钱,攒起来比分期还疼。本地跑起来以后,每次调用成本直接归零——这账,你心里有数就行。

当然有翻车的时候。第一次跑 large 模型,直接 OOM,系统卡死。后来换成 才稳下来。8GB 内存的用户别碰 large,16GB 可以试试 medium。还有一次录音里有三个人同时说话,Whisper 输出成了混杂的字幕,Llama 总结时直接编造了一堆不存在的结论。后来我加了一条提示:“如果转写文本中有明显重叠语音或断句,请在纪要中标注‘该段对话存在干扰’。”解决了。

整套跑起来之后,最爽的反倒不是省那几个钱。开会时终于不用跟速记员似的疯狂敲字,也不用担心音频文件被传到什么莫名其妙的云上。就按一下录音,结束之后去倒杯水,回来桌面已经躺着一份干净的纪——这种感觉,比省了订阅费痛快得多。

参考与延伸阅读

  • Ollama 基本安装与模型管理 —— 博客园 —— 作者详细介绍了 Ollama 的跨平台安装步骤与常见模型拉取命令,适合新手入门时对照操作。
  • CFANZ 编程社区 —— 这篇从性能角度对比了不同硬件条件下 Ollama 的运行表现,对选型有帮助。
  • 脚本之家 —— 如果你对 Ollama 的模型标识符、标签系统和运行参数还不太熟悉,这篇把基础概念讲得很清楚。