骁龙X2 Elite平台AI实战(2): 部署离线会议纪要助手
本博客分两个部分,完整记录在骁龙X2 Elite Windows ARM64笔记本上搭建离线会议纪要助手的所有步骤。
第一部分:whisper.cpp环境搭建与会议录音转写实战
第二部分:利用本地大模型(Ollama + Qwen2.5:7b)做摘要整理与待办生成
前言
这次要在骁龙X2 Elite Windows 11笔记本上,做一套离线会议纪要助手:把会议录音稳定转成中文文本,但转写完成并不等于工作完成,因此我们再部署一套“会议文本 → 摘要/待办/纪要”整理链路。
这套路线不走云转写,不走在线接口,也不做那种“先试试看哪种方案更适合你”的写法。原因很简单:
- 会议内容经常带项目名、客户名、计划节点,不能随便上云;
- 本地转写一旦跑顺,后面接摘要、待办提取、日报整理都很顺;
- X2-Elite这类设备本身就适合做轻量本地AI办公场景。
第一部分:whisper.cpp环境搭建与转写实战
这部分只做两件事:
- 在X2 Elite上把whisper.cpp编译跑起来;
- 用一段真实的中文会议音频,转出可直接整理的文本稿。
一 环境说明
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 就够用。
安装时把下面几个组件勾上:
- C++生成工具;
- MSVC v143 编译工具集;
- Windows 11 SDK;
- 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
这一步的作用很明确:生成构建系统文件。
如果这一步报错,十有八九是下面两类问题:
- CMake 没装好;
- 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
这一步不要省。
很多原始录音文件码率乱、采样率乱、声道也不统一,直接扔给转写程序,结果就是:
- 转写速度不稳定;
- 某些音频会直接报错;
- 时间戳和断句表现变差。
所以我固定先做一次音频标准化。
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分钟,内容包含:
- 版本发布时间;
- 测试缺陷回归安排;
- 客户现场支持时间;
- 两个英文缩写项目名;
- 三个跨部门待办项。
这类音频比纯普通话朗读难一点,更接近真实办公现场。
8.2 转写结果示例
下面是我实际拿到的文本片段,做了少量脱敏:
本周先把一号产线的异常误报问题关掉,周三之前测试组给回归结果。
客户上海现场那边已经确认,下周二上午做联调。
算法模型还是沿用四月版本,不再切回旧参数。
陈工负责整理部署包,王工负责板端日志补采。
这个结果已经足够进入下一步整理了。
我自己的判断标准不是“一个字都不能错”,而是:
- 人能顺着读下去;
- 任务、责任人、时间点能提出来;
- 关键项目名别识别跑偏。
达到这三个条件,这套方案就能用。
到这里,第一阶段目标已经达成了:
- X2 Elite 本地离线转写环境已经跑通;
- whisper.cpp 已经能稳定输出会议文本;
- txt 和 srt 两类结果都能拿到;
- 后续做纪要、待办、日报整理已经有了输入底稿。
第二部分:本地大模型摘要整理与待办生成
前半部分打通了在骁龙X2 Elite上,用whisper.cpp把会议录音稳定转成了txt和srt。但真实办公里,转写完成并不等于工作完成。
大多数人真正需要的不是一整段原始文本,而是下面这些结果:
- 这场会到底讲了什么;
- 有哪些明确结论;
- 有哪些待办项;
- 每个待办是谁负责;
- 有没有时间节点和风险点;
- 最后能不能直接生成一份能发群、能归档的Markdown纪要。
所以这部分接着做:
在X2-Elite本地部署一套“会议文本 → 摘要/待办/纪要”整理链路。
一. 整体架构
会议纪要整理最耗时间的,不是打字,而是这三件事:
- 从长文本里抽主线;
- 从口语表达里提炼出行动项;
- 把零散内容整理成一个固定格式文档。
我们给出的方案非常直接:
- 输入:meeting_output.txt
- 中间层:Python脚本做清洗和Prompt拼接
- 模型层:本地Ollama + qwen2.5:7b
- 输出:摘要、决策项、风险点、待办清单、Markdown纪要
先把这一阶段的整体结构摆出来,后面的代码和流程都按这张图展开。

这张图里最关键的点有两个:
- 上一篇产出的 meeting.txt 是这一篇的唯一核心输入;
- 大模型不是直接裸调,而是经过一层固定格式的 Prompt 封装。
这样做的目的很明确:
让输出结构稳定,减少“这次能用、下次跑偏”的情况。
二. 为什么我这里选本地大模型而不是在线接口
这块我不展开讲一堆概念,直接说结论。
2.1 会议内容敏感
很多会议里会包含:
客户名称;合同节点;版本发布时间;缺陷优先级;项目风险;内部人员安排。
这些东西上传到云端接口,本身就有额外风险。如果你的场景是公司内部使用,本地方案明显更合理。
2.2 输出格式需要可控
在线接口经常有一个问题:同一个Prompt,今天输出一个格式,明天可能就换了个写法。
而会议纪要这类东西,最怕格式不稳定。因为只要格式飘,后面发群、归档、日报汇总都会变麻烦。
这里我们选本地模型 + 固定 Prompt,就是为了把格式尽量锁住。
2.3 X2-Elite 本身适合做轻量办公侧 AI
这一点其实是整个系列的核心出发点。我不是为了“证明能跑模型”才写这个系列,而是为了验证:
会议纪要整理,就是一个非常典型、也非常实用的切入点。
三. 本地模型环境准备
3.1 安装 Ollama
直接用 Ollama 做本地模型运行入口,原因很简单:
- 接口简单;
- 部署动作少;
- 本地 REST API 容易接 Python;
- 后续换模型也方便。
安装完成之后,先验证服务是否正常:
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 输出结构必须先约束
你如果只说“请帮我总结这段会议内容”,模型往往会写成自然语言段落。这类结果看着顺,但不适合直接落地。
我要的是固定结构输出,至少要有:
- 会议主题;
- 摘要;
- 决策项;
- 风险点;
- 待办项;
- Markdown格式。
所以Prompt必须显式约束。
五. 先看摘要与待办的执行流程
这一段先看图,再看代码,会更清楚。
这张图对应的是我实际采用的处理链路:
- 读取 meeting_output.txt;
- 做基础文本清洗;
- 拼接固定 Prompt;
- 调用本地 Ollama API;
- 输出 meeting_summary.md;
- 人工快速复核后直接发群或归档。
六. Python脚本设计思路
6.1 输入和输出固定
建议不要把脚本写成特别花的形式,直接固定输入输出即可:
输入:meeting_output.txt
输出:meeting_summary.md
这样做的好处是最稳定。
因为这类工具最后是给自己或者团队每天反复用的,不是做成命令行玩具。
6.2 使用的 Prompt 目标
这套 Prompt 的目标很明确,不是让模型“自由发挥”,而是让它“按格式交作业”。
- 会议主题;
- 三到五条摘要;
- 决策项;
- 风险点;
- 待办清单(负责人/截止时间/内容);
- 用 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到3分钟快速扫一遍;
- 重点修正人名、时间、产品代号;
- 再发群或归档。
因为会议纪要不是普通文本,它会直接影响执行。所以最后这一层人工确认,我认为必须保留。
十. 我对这套链路的实际判断
如果只从“模型能力展示”角度看,这个方案没有什么炫技成分。但如果从“每天能不能真用”这个角度看,它很有价值。
我对这条链路的评价是:
- 足够轻
不依赖云接口;不依赖复杂服务;脚本结构简单;输入输出固定。
- 足够稳
转写和整理分成两个阶段;中间有txt作为可追溯产物;Prompt结构固定;输出格式固定。
- 足够实用
适合项目周会;适合问题复盘会;适合客户沟通会;适合跨部门同步会。
十一. 常见问题处理
11.1 编译时报找不到编译器
这种问题基本不是whisper.cpp本身的问题,直接检查两件事:
- Visual Studio Build Tools有没有装;
- 装的时候 C++ 工具链有没有勾上。
这两个没配好,后面你反复重试也没用。
11.2 模型路径写错
这是最常见的问题之一。
命令能执行,但会提示模型加载失败。
直接检查:
- 文件名是不是 ggml-large-v3-turbo.bin;
- 路径里有没有手误;
- 命令行里如果有空格,路径有没有正确包起来。
11.3 音频识别结果很乱
先不要急着换模型,先看音频本身。
我固定按这个顺序排查:
- 原始录音是不是太吵;
- 有没有多人同时说话;
- 音频有没有先转成16kHz单声道;
- 有没有把语言参数固定成zh。
大部分问题都出在前处理,不出在模型。
11.4 输出里夹杂英文乱码或者专有名词不准
会议里只要有产品代号、英文缩写、人名,模型就可能有一点偏差。这个很正常。
我的处理办法很直接:先拿转写结果做底稿,再做一轮人工快速复核。
人工复核不需要从头听一遍音频,只需要重点看:
- 人名;
- 产品名;
- 时间节点;
- 数字;
- 缩写词。
这样工作量很低,但结果会稳很多。
总结
本项目在骁龙X2 Elite(Windows 11 ARM64)笔记本上,成功搭建了一套完全离线、可直接投入办公使用的会议纪要自动化闭环系统。全文分为两大阶段,核心逻辑是“先转写,后整理”。这套链路完全抛弃云端依赖,具有足够轻(脚本简单)、足够稳(阶段分离、格式固定)、足够实用(直接适配周会、复盘会、客户沟通会)的特点。至此,X2 Elite从“能跑模型”进阶为“能承担完整办公场景”的生产力工具,产出的Markdown纪要可直接复制到企业微信、飞书或邮件中发送归档。
更多推荐


所有评论(0)