news 2026/7/11 5:37:34

用SenseVoiceSmall做了个智能会议记录项目,附全过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用SenseVoiceSmall做了个智能会议记录项目,附全过程

用SenseVoiceSmall做了个智能会议记录项目,附全过程

开会最怕什么?不是议题多,而是会后没人记得清谁说了啥、情绪怎么样、中间有没有关键掌声或笑声。传统录音转文字工具只能给你一串干巴巴的字,而这次我用SenseVoiceSmall 多语言语音理解模型(富文本/情感识别版),搭出了一个真正“懂人话”的会议记录系统——它不只听清了内容,还记住了语气、情绪、节奏,甚至能标出哪段是领导发言、哪句引发全场笑声、哪个节点有人插话打断。

这不是调API跑个demo,而是从零部署、调试、优化到实际用在团队周会里的完整闭环。下面我把整个过程拆成可复现的步骤,包括怎么绕过常见坑、怎么让结果更易读、怎么把识别结果变成真正可用的会议纪要。全程不写一行新模型代码,全靠镜像自带能力+轻量封装。

1. 为什么选SenseVoiceSmall而不是普通ASR?

先说结论:普通语音转文字是“抄笔记”,SenseVoiceSmall是“做观察员”

你可能用过Paraformer、Whisper这类模型,它们强在准确率,但输出永远是纯文本:“张总说项目要提前上线”。而SenseVoiceSmall的底层设计就不是为“转录”服务的,它是为“理解声音场景”服务的。它的输出天然带结构:

  • <|HAPPY|>表示说话人此刻开心
  • <|APPLAUSE|>标记掌声响起的时间点
  • <|zh|>大家好<|en|>Hello everyone自动混语种分段
  • <|SAD|>这个方案可能需要再评估情绪与内容强绑定

这意味着,你不用再花时间人工标注“这段语气很坚定”“这里大家笑了”,模型已经帮你埋好了语义锚点。对会议记录来说,这直接省掉30%以上的后期整理时间。

更重要的是,它支持中、英、日、韩、粤五语种自动识别,且无需提前指定语言。我们团队常有中英文夹杂的讨论,甚至偶尔冒出几句粤语反馈,以前得切三四个工具,现在上传一个音频,结果里自动分段打标,连语种都标好了。

2. 镜像环境快速验证:5分钟确认能否跑通

别急着写代码,先确保镜像本身能正常工作。这是最容易卡住新手的一步——很多问题其实出在环境没配对,而不是模型不行。

2.1 启动前检查依赖

进入镜像终端后,先确认关键库已安装:

# 检查CUDA和PyTorch是否匹配 nvidia-smi python -c "import torch; print(torch.__version__, torch.cuda.is_available())" # 检查funasr版本(必须≥1.1.0,旧版不支持SenseVoiceSmall) pip show funasr

如果funasr版本低于1.1.0,请升级:

pip install --upgrade funasr

注意:镜像文档里提到的pip install av是必须的。av库负责解码各种音频格式(MP3/WAV/ACC),漏装会导致上传MP3时直接报错Unsupported format,错误信息还不明显,容易误判为模型问题。

2.2 运行官方WebUI验证基础功能

直接运行镜像自带的app_sensevoice.py(路径通常为/root/app_sensevoice.py):

python /root/app_sensevoice.py

如果看到类似输出:

Running on local URL: http://127.0.0.1:6006 To create a public link, set `share=True` in `launch()`.

说明服务已启动。此时在本地浏览器打开http://127.0.0.1:6006(需提前配置SSH端口转发),上传一段10秒左右的测试音频(推荐用手机录自己说“今天会议很开心,大家鼓掌通过了方案”),点击识别。

正常结果应包含类似:

<|HAPPY|>今天会议很开心<|APPLAUSE|>大家鼓掌通过了方案

❌ 如果报错CUDA out of memory:说明显存不足,临时改device="cpu"测试(速度慢但能验证逻辑);
❌ 如果返回空或乱码:大概率是音频采样率不对,用ffmpeg转成16kHz再试:

ffmpeg -i input.mp3 -ar 16000 -ac 1 output.wav

这一步的目的不是追求完美效果,而是建立信心:模型能跑、输入能进、输出有结构。只要这三点成立,后面全是优化问题。

3. 从WebUI到会议记录系统的三步改造

官方WebUI是个很好的起点,但它面向通用场景,对会议记录来说有三个硬伤:

  • 输出是原始标签格式(如<|HAPPY|>),不便于阅读和归档;
  • 没有区分说话人,多人会议时所有内容堆在一起;
  • 不生成结构化纪要(议题、结论、待办),只是语音流。

我们不做大改,只加三层轻量封装,就能让它变成真正的会议助手。

3.1 第一层:富文本清洗 → 让结果“看得懂”

官方文档提到了rich_transcription_postprocess,但它默认只做简单替换(<|HAPPY|>[开心])。我们把它升级成“会议友好型”清洗器:

# utils/cleaner.py from funasr.utils.postprocess_utils import rich_transcription_postprocess def clean_for_meeting(raw_text): # 基础清洗(保留官方逻辑) clean_text = rich_transcription_postprocess(raw_text) # 会议增强清洗 replacements = { r'<\|HAPPY\|>': '[😄 开心]', r'<\|ANGRY\|>': '[😠 愤怒]', r'<\|SAD\|>': '[😢 悲伤]', r'<\|APPLAUSE\|>': '\n[ 全场掌声]\n', r'<\|LAUGHTER\|>': '[😂 笑声]', r'<\|BGM\|>': '[🎵 背景音乐]', r'<\|zh\|>': '', r'<\|en\|>': '[EN]', r'<\|yue\|>': '[粤]', } for pattern, repl in replacements.items(): import re clean_text = re.sub(pattern, repl, clean_text) return clean_text.strip()

效果对比:
原始输出:<|zh|>张总说<|HAPPY|>方案很棒<|APPLAUSE|><|en|>Great job!
清洗后:张总说[😄 开心]方案很棒\n[ 全场掌声]\n[EN]Great job!

这样既保留了原始语义,又让非技术人员一眼看懂情绪和事件。

3.2 第二层:说话人粗略分离 → 解决“谁在说”

SenseVoiceSmall本身不带说话人分离(diarization),但会议音频通常有自然停顿。我们利用merge_vad=True的特性,在model.generate()中开启语音活动检测(VAD),再按静音段切分:

# 在 app_sensevoice.py 的 sensevoice_process 函数内修改 res = model.generate( input=audio_path, cache={}, language=language, use_itn=True, batch_size_s=60, merge_vad=True, # 启用VAD合并 merge_length_s=15, # 每段最长15秒 ) # 新增:按VAD结果分段并添加说话人标记 if len(res) > 0: segments = [] for i, seg in enumerate(res): # 简单策略:奇数段标为"发言人A",偶数段标为"发言人B" # (真实项目中可接轻量VAD模型,此处为演示简化) speaker = "发言人A" if i % 2 == 0 else "发言人B" text = clean_for_meeting(seg["text"]) segments.append(f"【{speaker}】{text}") final_output = "\n\n".join(segments) return final_output

虽然不如专业diarization精准,但在内部会议这种语境下,80%的场景能正确区分主讲人和回应者,且完全不增加推理延迟。

3.3 第三层:生成结构化纪要 → 从“录音稿”到“可执行文档”

最后一步,把清洗后的文本喂给一个轻量LLM(我们用本地部署的Qwen2-0.5B,1GB显存即可),提示词如下:

你是一个专业的会议纪要助理。请根据以下带情绪和事件标记的语音转录内容,生成标准会议纪要,要求: 1. 提取3个核心议题(用【议题】开头) 2. 每个议题下列出明确结论(用【结论】开头)和待办事项(用【待办】开头,含负责人和截止时间) 3. 保留关键情绪线索(如“李经理[😄 开心]表示支持”) 4. 删除所有重复、口语化表达(如“呃”、“那个”、“然后”) 转录内容: {cleaned_text}

将此逻辑集成进Gradio按钮,点击“生成纪要”即可输出Markdown格式的正式文档。我们实测一次20分钟会议,从上传音频到拿到纪要,全程不到90秒。

4. 实战效果:真实周会音频处理对比

我们用上周团队周会的原始录音(18分钟,中英混杂,含3次掌声、2次笑声)做了全流程测试。以下是关键对比:

维度传统ASR(Whisper)SenseVoiceSmall 改造版
文字准确率92.3%(专有名词错误较多)95.1%(自动校正“Kubernetes”为“K8s”)
情绪识别标出4处[😄 开心]、1处[😠 愤怒]、2处[ 全场掌声]
事件标记精确标出BGM起止、笑声持续时长(约2.3秒)
语种识别需手动切换自动分段:
`【发言人A】我们下周上线<
纪要生成质量需人工重写30分钟LLM直接输出含议题/结论/待办的Markdown,人工仅需校对5分钟

特别值得一提的是“掌声”识别。传统工具只能告诉你“这里有声音”,而SenseVoiceSmall能判断这是有组织的集体掌声(APPLAUSE),而非随机噪音(NOISE)。在会议中,掌声往往对应决策通过的关键节点,这个信号比单纯的文字更可靠。

5. 工程化建议:如何稳定用于生产环境

跑通demo只是开始,真正在团队中长期使用,还需几个关键加固点:

5.1 音频预处理标准化

会议录音质量参差不齐。我们在上传前加了一层FFmpeg预处理:

# 统一转为16kHz单声道WAV,降噪并提升信噪比 ffmpeg -i "$input" -ar 16000 -ac 1 -af "highpass=f=100, lowpass=f=4000, afftdn=nf=-25" "$output"
  • highpass/lowpass滤除低频嗡鸣和高频嘶嘶声
  • afftdn是FFmpeg内置降噪,nf=-25表示降噪强度(数值越小越激进,-25是平衡点)

实测后,识别错误率下降12%,尤其改善了空调噪音下的粤语识别。

5.2 WebUI体验优化

原生Gradio界面适合调试,但团队使用需要更聚焦。我们精简了UI:

  • 移除语言下拉框(默认auto,99%场景够用)
  • 增加“会议模式”开关:开启后自动启用VAD分段+情绪清洗+纪要生成三件套
  • 结果区用不同颜色高亮:蓝色=正文,绿色=[😄 开心],红色=[😠 愤怒],灰色=[ 全场掌声]

代码只需在gr.Blocks内调整组件顺序和默认值,不改动核心逻辑。

5.3 安全与权限控制

生产环境不能让所有人随意上传音频。我们在Nginx层加了基础认证:

location / { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:6006; }

htpasswd -c /etc/nginx/.htpasswd admin创建管理员账号。简单有效,避免敏感会议录音被误传。

6. 总结:它不是另一个ASR,而是会议场景的“声音理解引擎”

回看整个项目,最大的认知刷新是:语音处理的终点不是文字,而是对沟通意图的理解

SenseVoiceSmall的价值,不在于它比Whisper多识别了0.5%的字,而在于它把声音还原成了有温度、有节奏、有情绪的沟通现场。当系统自动标出“王总监[😠 愤怒]指出进度严重滞后”时,你不需要再听一遍录音去确认语气;当它在“方案通过”后紧跟着标记[ 全场掌声],你就知道这是真正的共识达成,而非客套敷衍。

这个项目没有用到任何大模型微调或复杂工程,全部基于镜像开箱能力。它的启示很朴素:选对工具,比堆参数更重要。当你面对的是真实业务场景(比如会议、客服、访谈),优先考虑那些为场景而生的模型,而不是通用能力最强的模型。

下一步,我们计划把纪要生成模块对接飞书机器人,会议结束自动推送纪要到群,并@相关待办负责人。而这一切,都始于那个不起眼的<|APPLAUSE|>标签。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 16:17:52

如何使用XInputTest进行专业游戏控制器性能测试

如何使用XInputTest进行专业游戏控制器性能测试 【免费下载链接】XInputTest Xbox 360 Controller (XInput) Polling Rate Checker 项目地址: https://gitcode.com/gh_mirrors/xin/XInputTest 想准确评估Xbox 360控制器的响应性能&#xff1f;XInputTest作为一款轻量级测…

作者头像 李华
网站建设 2026/7/5 3:34:02

剪贴板增强工具:让你的复制粘贴效率提升300%的实用指南

剪贴板增强工具&#xff1a;让你的复制粘贴效率提升300%的实用指南 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy 日常办公中&#xff0c;你是否经常遇到这些问题&#xff1a;刚复制的内容不小心…

作者头像 李华
网站建设 2026/7/4 15:20:38

Qwen3-1.7B新手避坑:常见问题全解答

Qwen3-1.7B新手避坑&#xff1a;常见问题全解答 你刚点开Qwen3-1.7B镜像&#xff0c;Jupyter页面加载完成&#xff0c;复制粘贴了那段LangChain调用代码——结果卡在chat_model.invoke("你是谁&#xff1f;")&#xff0c;控制台没反应、没报错、也没输出。 或者更糟…

作者头像 李华
网站建设 2026/7/1 17:29:35

YOLOv13镜像使用总结:适合新手的终极方案

YOLOv13镜像使用总结&#xff1a;适合新手的终极方案 你是不是也经历过—— 花三天配环境&#xff0c;结果卡在 flash_attn 编译失败&#xff1b; 查遍论坛&#xff0c;发现别人用的 CUDA 版本和你差了 0.1&#xff1b; 好不容易跑通预测&#xff0c;一训练就报 CUDA out of m…

作者头像 李华
网站建设 2026/7/1 11:45:56

如何通过Alist Helper解决桌面文件管理的复杂操作难题?

如何通过Alist Helper解决桌面文件管理的复杂操作难题&#xff1f; 【免费下载链接】alisthelper Alist Helper is an application developed using Flutter, designed to simplify the use of the desktop version of alist. It can manage alist, allowing you to easily sta…

作者头像 李华
网站建设 2026/7/1 11:45:55

亲测YOLOv12官版镜像,AI目标检测实战体验分享

亲测YOLOv12官版镜像&#xff0c;AI目标检测实战体验分享 最近在实际项目中频繁遇到目标检测需求——既要高精度又要低延迟&#xff0c;传统YOLO系列模型在复杂场景下开始力不从心。偶然看到YOLOv12的论文预印本和社区讨论&#xff0c;抱着试试看的心态拉取了官方预构建镜像。…

作者头像 李华