本博客分两个部分,完整记录在骁龙X2 Elite Windows ARM64笔记本上搭建离线会议纪要助手的所有步骤。
第一部分:whisper.cpp环境搭建与会议录音转写实战
第二部分:利用本地大模型(Ollama + Qwen2.5:7b)做摘要整理与待办生成

前言

这次要在骁龙X2 Elite Windows 11笔记本上,做一套离线会议纪要助手:把会议录音稳定转成中文文本,但转写完成并不等于工作完成,因此我们再部署一套“会议文本 → 摘要/待办/纪要”整理链路。

这套路线不走云转写,不走在线接口,也不做那种“先试试看哪种方案更适合你”的写法。原因很简单:

  1. 会议内容经常带项目名、客户名、计划节点,不能随便上云;
  2. 本地转写一旦跑顺,后面接摘要、待办提取、日报整理都很顺;
  3. X2-Elite这类设备本身就适合做轻量本地AI办公场景。

第一部分:whisper.cpp环境搭建与转写实战

这部分只做两件事:

  1. 在X2 Elite上把whisper.cpp编译跑起来;
  2. 用一段真实的中文会议音频,转出可直接整理的文本稿。

一 环境说明

1.1 硬件环境

我这次使用的环境是固定的,全文都按这套来,不做岔路说明。

  • 设备:骁龙X2 Elite开发笔记本
  • 系统:Windows 11
  • CPU架构:ARM64
  • 内存:32GB
  • Git:Windows版本
  • CMake:3.29+
  • Visual Studio Build Tools:2022
  • FFmpeg:Windows可执行版本
  • 转写引擎:whisper.cpp
  • 模型:gml-large-v3-turbo.bin

在这里插入图片描述

1.2 整体安装路线

先把整个安装路线摆出来,后面所有步骤都按这个顺序来。
在这里插入图片描述

二. 为什么这次我直接选 whisper.cpp

很多人一上来会问,为什么不用 Python 版 Whisper,或者别的语音 SDK。

这里我直接给结论:在 X2 Elite 这类 Windows ARM64 设备上,先用 whisper.cpp 最稳。

原因有三个:

  • 编译链路直接

whisper.cpp 本身就是 C/C++ 实现,依赖不重。
只要本机的 CMake 和编译工具链正常,基本就能直接拉源码、直接编译、直接跑。

  • 适合本地离线处理

会议录音这种东西,通常时长长、内容杂、隐私还敏感。本地离线转写比在线接口更省心,尤其是内部项目会、客户沟通会、故障复盘会。

  • 后续接自动整理很顺

第一步把 txt 和 srt 打出来,下一步接大模型做摘要、待办、风险项提取,链路非常清晰。这个系列就是按这条路往下写的。

三. 环境安装

3.1 安装 Git

先装 Git for Windows,安装完后打开终端验证:

git --version

只要能正常输出版本号,这一步就算过。

3.2 安装 CMake

去官网装 CMake,装完后执行:

cmake --version

能输出版本号就没问题。

这里我强调一下,不要跳过 CMake。

后面 whisper.cpp 编译直接要用,不装这一步,后面肯定卡住。

3.3 安装 Visual Studio Build Tools 2022

这里不需要装完整 Visual Studio,直接装 Build Tools 就够用。

安装时把下面几个组件勾上:

  1. C++生成工具;
  2. MSVC v143 编译工具集;
  3. Windows 11 SDK;
  4. CMake tools for Windows。

装完以后,重新开一个终端,不要沿用老终端窗口。

3.4 安装 FFmpeg

会议音频来源很杂,有些是 mp3,有些是 m4a,还有些是手机直接录的 aac。所以我这里固定装 FFmpeg,先把音频统一预处理。

安装完成后执行:

ffmpeg -version

看到版本号就可以继续。

四. 拉取 whisper.cpp 并编译

4.1 拉源码

先建一个工作目录,比如:

mkdir E:\workspace\Blog\X2Elite_20260615\workspace

然后进入这个目录,执行:

git clone https://github.com/ggml-org/whisper.cpp.git

拉完之后进入源码目录:

cd E:\workspace\Blog\X2Elite_20260615\workspace\whisper.cpp

4.2 创建构建目录

直接执行:

cmake -B build

这一步的作用很明确:生成构建系统文件。

如果这一步报错,十有八九是下面两类问题:

  1. CMake 没装好;
  2. Build Tools 组件没装全。

4.3 开始编译

继续执行:

cmake --build build --config Release

正常编译完成之后,在 build\bin\Release\ 下面会看到可执行文件。我这边主要用的是:

whisper-cli.exe

只要它出来了,说明第一阶段已经通了。

4.4 验证可执行文件

执行:

E:\workspace\Blog\X2Elite_20260615\workspace\whisper.cpp\build\bin\Release\whisper-cli.exe -h

只要命令行能打印帮助信息,就说明程序本体没问题。

五. 下载模型文件

5.1 下载large-v3-turbo模型

我这篇直接固定用large-v3-turbo,原因很简单:

中文会议音频里的人名、缩略词、英文项目名会比较多,小模型经常漏字。

在whisper.cpp根目录下执行模型下载脚本:

bash ./models/download-ggml-model.sh large-v3-turbo

如果你是在Windows环境里没有bash,也可以直接去Hugging Face或项目模型目录下载ggml-large-v3-turbo.bin,然后手动放到:

E:\workspace\Blog\X2Elite_20260615\workspace\whisper.cpp\models\

最终目录里要能看到:

ggml-large-v3-turbo.bin

5.2 模型文件检查

执行前先确认模型文件路径是对的。我这里统一按下面这个完整路径来:

E:\workspace\Blog\X2Elite_20260615\workspace\whisper.cpp\models\ggml-large-v3-turbo.bin

路径不对,后面命令一定跑不起来。

六. 会议音频预处理

6.1 为什么要先转成 16kHz 单声道 WAV

这一步不要省。

很多原始录音文件码率乱、采样率乱、声道也不统一,直接扔给转写程序,结果就是:

  1. 转写速度不稳定;
  2. 某些音频会直接报错;
  3. 时间戳和断句表现变差。

所以我固定先做一次音频标准化。

6.2 音频转换命令

假设你原始会议录音文件叫:

meeting_raw.m4a

执行下面这条命令:

ffmpeg -i meeting_raw.m4a -ar 16000 -ac 1 -c:a pcm_s16le meeting_16k.wav

参数含义很直接:

  • -ar 16000:采样率固定成16kHz;
  • -ac 1:转成单声道;
  • -c:a pcm_s16le:输出为16位PCM WAV。

转换完之后,得到:

meeting_16k.wav

七. 开始做离线转写

7.1 先看执行流程

整个离线转写链路如下:

在这里插入图片描述

7.2 最小可用转写命令

执行下面这条命令:

E:\workspace\Blog\X2Elite_20260615\workspace\whisper.cpp\build\bin\Release\whisper-cli.exe ^
-m E:\workspace\Blog\X2Elite_20260615\workspace\whisper.cpp\models\ggml-large-v3-turbo.bin ^
-f E:\workspace\Blog\X2Elite_20260615\workspace\meeting_16k.wav ^
-l zh ^
-otxt ^
-osrt ^
-of meeting_output

这条命令执行完之后,会输出下面这些文件:

meeting_output.txt
meeting_output.srt

我这里重点看txt,因为后面摘要整理直接拿它做输入。

7.3 参数解释

这一段很关键,别直接抄完就算。

  • -m:模型文件路径;
  • -f:输入音频路径;
  • -l zh:明确告诉程序这是中文;
  • -otxt:输出文本稿;
  • -osrt:输出字幕时间轴;
  • -of:输出文件名前缀。

这里我建议文本和字幕一起出。

原因很简单,txt适合做纪要整理,srt适合回头定位某一段发言。

八. 实际转写效果说明

8.1 测试音频场景

我这边拿的是一段典型项目周会音频,长度大约18分钟,内容包含:

  1. 版本发布时间;
  2. 测试缺陷回归安排;
  3. 客户现场支持时间;
  4. 两个英文缩写项目名;
  5. 三个跨部门待办项。

这类音频比纯普通话朗读难一点,更接近真实办公现场。

8.2 转写结果示例

下面是我实际拿到的文本片段,做了少量脱敏:

本周先把一号产线的异常误报问题关掉,周三之前测试组给回归结果。
客户上海现场那边已经确认,下周二上午做联调。
算法模型还是沿用四月版本,不再切回旧参数。
陈工负责整理部署包,王工负责板端日志补采。

这个结果已经足够进入下一步整理了。

我自己的判断标准不是“一个字都不能错”,而是:

  1. 人能顺着读下去;
  2. 任务、责任人、时间点能提出来;
  3. 关键项目名别识别跑偏。

达到这三个条件,这套方案就能用。

到这里,第一阶段目标已经达成了:

  1. X2 Elite 本地离线转写环境已经跑通;
  2. whisper.cpp 已经能稳定输出会议文本;
  3. txt 和 srt 两类结果都能拿到;
  4. 后续做纪要、待办、日报整理已经有了输入底稿。

第二部分:本地大模型摘要整理与待办生成

前半部分打通了在骁龙X2 Elite上,用whisper.cpp把会议录音稳定转成了txt和srt。但真实办公里,转写完成并不等于工作完成。
大多数人真正需要的不是一整段原始文本,而是下面这些结果:

  1. 这场会到底讲了什么;
  2. 有哪些明确结论;
  3. 有哪些待办项;
  4. 每个待办是谁负责;
  5. 有没有时间节点和风险点;
  6. 最后能不能直接生成一份能发群、能归档的Markdown纪要。

所以这部分接着做:

在X2-Elite本地部署一套“会议文本 → 摘要/待办/纪要”整理链路。

一. 整体架构

会议纪要整理最耗时间的,不是打字,而是这三件事:

  1. 从长文本里抽主线;
  2. 从口语表达里提炼出行动项;
  3. 把零散内容整理成一个固定格式文档。

我们给出的方案非常直接:

  • 输入:meeting_output.txt
  • 中间层:Python脚本做清洗和Prompt拼接
  • 模型层:本地Ollama + qwen2.5:7b
  • 输出:摘要、决策项、风险点、待办清单、Markdown纪要

先把这一阶段的整体结构摆出来,后面的代码和流程都按这张图展开。

在这里插入图片描述

这张图里最关键的点有两个:

  1. 上一篇产出的 meeting.txt 是这一篇的唯一核心输入;
  2. 大模型不是直接裸调,而是经过一层固定格式的 Prompt 封装。

这样做的目的很明确:

让输出结构稳定,减少“这次能用、下次跑偏”的情况。

二. 为什么我这里选本地大模型而不是在线接口

这块我不展开讲一堆概念,直接说结论。

2.1 会议内容敏感

很多会议里会包含:

客户名称;合同节点;版本发布时间;缺陷优先级;项目风险;内部人员安排。

这些东西上传到云端接口,本身就有额外风险。如果你的场景是公司内部使用,本地方案明显更合理。

2.2 输出格式需要可控

在线接口经常有一个问题:同一个Prompt,今天输出一个格式,明天可能就换了个写法。

而会议纪要这类东西,最怕格式不稳定。因为只要格式飘,后面发群、归档、日报汇总都会变麻烦。

这里我们选本地模型 + 固定 Prompt,就是为了把格式尽量锁住。

2.3 X2-Elite 本身适合做轻量办公侧 AI

这一点其实是整个系列的核心出发点。我不是为了“证明能跑模型”才写这个系列,而是为了验证:

会议纪要整理,就是一个非常典型、也非常实用的切入点。

三. 本地模型环境准备

3.1 安装 Ollama

直接用 Ollama 做本地模型运行入口,原因很简单:

  1. 接口简单;
  2. 部署动作少;
  3. 本地 REST API 容易接 Python;
  4. 后续换模型也方便。

安装完成之后,先验证服务是否正常:

ollama --version

然后拉取模型:

ollama pull qwen2.5:7b

如果模型已经拉过,这一步会直接复用本地缓存。

3.2 启动 Ollama 服务

正常情况下,Ollama 安装后会自动提供本地服务。你可以先执行:

ollama list

只要能看到 qwen2.5:7b,说明模型已经就绪。

再执行一个最小测试:

ollama run qwen2.5:7b "请用一句话总结:今天项目周会重点是交付节奏和缺陷回归。"

如果能正常返回结果,说明本地模型链路是通的。

四. 输入文本为什么不能直接丢给模型

这一步很多人会偷懒,直接把整段转写文本丢给模型,然后等输出。

不建议这么干,原因有三个。

4.1 原始转写文本口语味太重

原始会议转写通常会包含很多这种内容:

  • 嗯;
  • 然后;
  • 这个;
  • 我觉得;
  • 要不这样;
  • 前后重复一句话;
  • 一半句子没说完就被别人打断。

这种文本直接喂给模型,模型能做,但效果不稳。

4.2 专有名词容易被放大误差

转写阶段如果某个产品名、人名、项目缩写有一点偏差,模型在二次整理时可能会继续把这个错误扩散出去。

所以我这里不做“完全自动无人值守”,而是保留一层轻量人工复核入口。

4.3 输出结构必须先约束

你如果只说“请帮我总结这段会议内容”,模型往往会写成自然语言段落。这类结果看着顺,但不适合直接落地。

我要的是固定结构输出,至少要有:

  1. 会议主题;
  2. 摘要;
  3. 决策项;
  4. 风险点;
  5. 待办项;
  6. Markdown格式。

所以Prompt必须显式约束。

五. 先看摘要与待办的执行流程

这一段先看图,再看代码,会更清楚。
在这里插入图片描述

这张图对应的是我实际采用的处理链路:

  1. 读取 meeting_output.txt;
  2. 做基础文本清洗;
  3. 拼接固定 Prompt;
  4. 调用本地 Ollama API;
  5. 输出 meeting_summary.md;
  6. 人工快速复核后直接发群或归档。

六. Python脚本设计思路

6.1 输入和输出固定

建议不要把脚本写成特别花的形式,直接固定输入输出即可:

输入:meeting_output.txt
输出:meeting_summary.md

这样做的好处是最稳定。

因为这类工具最后是给自己或者团队每天反复用的,不是做成命令行玩具。

6.2 使用的 Prompt 目标

这套 Prompt 的目标很明确,不是让模型“自由发挥”,而是让它“按格式交作业”。

  1. 会议主题;
  2. 三到五条摘要;
  3. 决策项;
  4. 风险点;
  5. 待办清单(负责人/截止时间/内容);
  6. 用 Markdown 输出。

七. 一个可直接使用的 Python 示例

下面这个脚本是建立的最小可用版本。结构很简单,但已经足够把这条链路跑通。

from pathlib import Path
import json
import requests

INPUT_PATH = Path("meeting_output.txt")
OUTPUT_PATH = Path("meeting_summary.md")

PROMPT_TEMPLATE = """
你现在是会议纪要整理助手。
请基于下面的会议转写文本,输出结构化 Markdown 结果,必须包含以下部分:

# 会议纪要
## 一、会议主题
## 二、核心摘要
## 三、决策项
## 四、风险与阻塞
## 五、待办清单

要求:
1. 不要编造未出现的信息;
2. 待办项尽量提取负责人、截止时间、事项;
3. 如果负责人或时间不明确, 明确标注"未明确";
4. 输出必须是 Markdown;
5. 语言简洁直接, 适合企业内部同步。

会议转写文本如下:
{content}
""".strip()

def clean_text(text: str) -> str:
    lines = [line.strip() for line in text.splitlines()]
    lines = [line for line in lines if line]
    return "\n".join(lines)

def call_ollama(prompt: str) -> str:
    payload = {
        "model": "qwen2.5:7b",
        "prompt": prompt,
        "stream": False
    }
    resp = requests.post("http://127.0.0.1:11434/api/generate", json=payload, timeout=600)
    resp.raise_for_status()
    data = resp.json()
    return data["response"]

def main():
    raw_text = INPUT_PATH.read_text(encoding="utf-8")
    cleaned = clean_text(raw_text)
    prompt = PROMPT_TEMPLATE.format(content=cleaned)

    result = call_ollama(prompt)
    OUTPUT_PATH.write_text(result, encoding="utf-8")
    print(f"已生成: {OUTPUT_PATH}")

if __name__ == "__main__":
    main()

这个脚本不复杂,但很适合第一版上线。

真正重要的不是语法本身,而是输入、Prompt、输出结构被锁住了。

八. 一份推荐的输出格式

我自己建议最终纪要固定长这样:

# 会议纪要

## 一、会议主题
Q3项目周会:交付节奏、缺陷回归与现场支持安排

## 二、核心摘要
- 本周重点是关闭一号产线误报问题,并在周三前完成回归。
- 客户上海现场下周二上午联调,需提前准备部署包。
- 算法版本继续沿用四月版本,不切回旧参数。

## 三、决策项
- 本次联调继续使用四月版模型参数。
- 部署包由陈工统一整理后再发现场。

## 四、风险与阻塞
- 如果测试组周三前无法给出回归结果,下周联调节奏会被影响。
- 现场日志采集不完整,可能影响问题定位。

## 五、待办清单
- [ ] 陈工:整理部署包,截止时间:周一晚
- [ ] 王工:补采板端日志,截止时间:周二上午
- [ ] 测试组:输出误报问题回归结果,截止时间:周三中午

你会发现,这个格式的重点不是“写得漂亮”,而是:

  1. 信息能快速扫到;
  2. 责任人和截止时间一眼可见;
  3. 可以直接复制进企业微信、飞书或邮件里。

九. 实际使用时我建议保留一层人工复核

切记,不要把会议纪要自动化理解成“完全不看直接发”。

更稳妥的做法是:

  1. 先让系统自动出一版;
  2. 人工用1到3分钟快速扫一遍;
  3. 重点修正人名、时间、产品代号;
  4. 再发群或归档。

因为会议纪要不是普通文本,它会直接影响执行。所以最后这一层人工确认,我认为必须保留。

十. 我对这套链路的实际判断

如果只从“模型能力展示”角度看,这个方案没有什么炫技成分。但如果从“每天能不能真用”这个角度看,它很有价值。

我对这条链路的评价是:

  • 足够轻

不依赖云接口;不依赖复杂服务;脚本结构简单;输入输出固定。

  • 足够稳

转写和整理分成两个阶段;中间有txt作为可追溯产物;Prompt结构固定;输出格式固定。

  • 足够实用

适合项目周会;适合问题复盘会;适合客户沟通会;适合跨部门同步会。

十一. 常见问题处理

11.1 编译时报找不到编译器

这种问题基本不是whisper.cpp本身的问题,直接检查两件事:

  1. Visual Studio Build Tools有没有装;
  2. 装的时候 C++ 工具链有没有勾上。

这两个没配好,后面你反复重试也没用。

11.2 模型路径写错

这是最常见的问题之一。

命令能执行,但会提示模型加载失败。

直接检查:

  1. 文件名是不是 ggml-large-v3-turbo.bin;
  2. 路径里有没有手误;
  3. 命令行里如果有空格,路径有没有正确包起来。

11.3 音频识别结果很乱

先不要急着换模型,先看音频本身。

我固定按这个顺序排查:

  1. 原始录音是不是太吵;
  2. 有没有多人同时说话;
  3. 音频有没有先转成16kHz单声道;
  4. 有没有把语言参数固定成zh。

大部分问题都出在前处理,不出在模型。

11.4 输出里夹杂英文乱码或者专有名词不准

会议里只要有产品代号、英文缩写、人名,模型就可能有一点偏差。这个很正常。

我的处理办法很直接:先拿转写结果做底稿,再做一轮人工快速复核。

人工复核不需要从头听一遍音频,只需要重点看:

  1. 人名;
  2. 产品名;
  3. 时间节点;
  4. 数字;
  5. 缩写词。

这样工作量很低,但结果会稳很多。

总结

本项目在骁龙X2 Elite(Windows 11 ARM64)笔记本上,成功搭建了一套完全离线、可直接投入办公使用的会议纪要自动化闭环系统。全文分为两大阶段,核心逻辑是“先转写,后整理”。这套链路完全抛弃云端依赖,具有足够轻(脚本简单)、足够稳(阶段分离、格式固定)、足够实用(直接适配周会、复盘会、客户沟通会)的特点。至此,X2 Elite从“能跑模型”进阶为“能承担完整办公场景”的生产力工具,产出的Markdown纪要可直接复制到企业微信、飞书或邮件中发送归档。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐