☰
基于腾讯云AI语音识别的会议纪要自动转写与后处理实战
2026/10/20 9:52:06 网站建设 项目流程

1. 会议纪要为什么要靠“识别”而不是“记录”

刚接触会议场景语音处理的时候,我也犯过不少团队都犯的错:觉得买支好录音笔、把会议全程录下来,散会后再让实习生1.5倍速听一遍整理纪要,就能解决问题。事实是,一个两小时的周会,录音大概有200到300分钟的有效语音,听写加校对至少耗掉普通人一个下午。如果会议涉及多位发言人、中英文混讲、技术术语密集,整理出来的纪要基本要靠脑补,回查录音又找不到对应时间点,这套流程几乎等于没有积累。

真正解决这个问题的思路,不是让人去“听”完录音,而是让语音识别先把音频变成带时间戳的文本,再由人去校对和提炼。会议纪要的完整链路应该拆成三层:第一层是音频结构化,也就是把声波变成文字,并附带每个句子的起始时间、结束时间、说话人标识;第二层是内容结构化,把流水账文本切分成议题段落、提取待办事项、关键决策;第三层才是人的价值,由会议主持者做最终判断和润色。市面上很多“一键生成会议纪要”的需求,其实真正刚需的只有第一层——准确率够高的转写文本,后续的摘要、待办提取只是锦上添花。

这也是我这次搭“会议小帮手”的切入点。整个项目不追求把AI变成参会人,而是让它做一个全天候不缺席的“速记员”:它不判断谁说得对,只负责把谁在什么时候说了什么,尽量完整、带上下文地还原出来。基于腾讯云AI语音识别来搭建,理由也直接——它原生支持录音文件识别、实时语音识别、一句话识别三种能力,还有热词表、说话人分离、智能断句这些对会议场景特别实用的辅助功能,省去我很多从零训练模型的功夫。

适合跟着这篇文章一起实操的读者,我建议分两类。一类是团队里负责赋能或内部工具开发的工程师,你可能正被“人工整理会议纪要”这件事反复消耗;另一类是产品经理或项目经理,想把会议音频变成可检索的资产,但不希望依赖某个封闭的付费软件。我会把从选型、调通API到做文本后处理、优化准确率的过程完整讲一遍,包括那些踩过坑之后才看明白的参数细节。

先说清楚一个边界:腾讯云AI语音识别不会替你做会议总结和待办抽取,至少我这次没有依赖它做这件事。它的核心输出是“文本+时间戳+说话人标签”。我的做法是把它输出的结构化转写稿,再接一层基于规则的文本后处理,把“谁能帮我开个门”和“谁能帮我开个门禁权限”这种口语与书面语差异处理好,再落到模板里生成可读的纪要。下面所有内容都围绕这个思路展开。

2. 接入前的关键选择:实时识别还是录音文件识别

腾讯云AI语音识别相关产品里,和会议场景最相关的是录音文件识别极速版和实时语音识别。很多人第一步就纠结:会议都开完了,我当然用录音文件识别,为什么还要关心实时识别?这个判断其实不精确,关键在于你要的是“回看速记”还是“现场字幕”。

如果团队开的是线上会议,语音流是可以直接接入的。这时候用实时语音识别,WebSocket推流,结果按句返回,操作员的屏幕上能实时看到发言内容,同时也在后台落盘。好处是会后不需要再等整段音频转写,会议结束十分钟内纪要初稿就能出来。坏处是接入复杂度高一点,要自己处理音频帧的切割、断句重连、结果合并,还要管理WebSocket连接状态。如果只是想把历史录音转成文本,用录音文件识别极速版就够了——提交一个音频URL,服务端异步转写,回调或者轮询拿结果,代码量小很多。

我这次采用的是两者结合:线上会议时开实时识别生成现场速记,同时把原始音频保存下来,会后用录音文件识别极速版再跑一遍,用后者的高质量结果覆盖前者的实时结果。为什么要跑两遍?因为实时识别的延迟优先,断句和标点质量通常不如离线版本。实时识别漏掉的口语修正、重复词,离线版会处理得更干净。多一次转写大概多花一点服务费用,但对一份要给管理层看的会议纪要来说,准确率优先是值得的。

选择录音文件识别极速版时,有个很多人忽视的参数是引擎类型(EngSerViceType),不同取值对应不同的场景优化。会议场景建议直接用电话/会议/口语专用引擎,而不是通用引擎。通用引擎对朗读式、书面化的音频效果好,一遇到多人对话、抢话、语气词密集的情况,字错率会明显上升。我用一个模拟项目X做过对比:同样一段30分钟的产品评审会录音,通用引擎的句错误率大约高出口语引擎接近一倍,这个差距在最终纪要里是非常致命的。

提交方式上,腾讯云AI语音识别支持两种音频来源:一种是公网可访问的URL,服务端自己去拉取;另一种是直接上传音频数据。很多内部业务系统不方便把音频文件放到公网对象存储上,我会建议直接用POST上传二进制数据的方式,避免“URL拉取权限不足”这类问题。不过上传方式有请求体大小限制,长时间会议音频建议先分段,比如按单个发言段落切,或者按每30分钟一段切,便于并行转写和失败重跑。

3. 核心链路搭建:从音频文件到带时间戳的转写稿

搞清楚了选型,接下来是动手实现。这条链路的输入是会议录音文件,输出是JSON结构的转写结果,中间涉及两个主要步骤:调用录音文件识别接口提交任务,然后轮询或等待回调拿到结果。

先看提交任务这一步。用Python举例,调用腾讯云语音识别的录音文件识别极速版接口,核心参数大概是这样:

import json import time import hashlib import hmac from datetime import datetime from urllib.parse import quote import requests SECRET_ID = "你的密钥ID" SECRET_KEY = "你的密钥Key" def sign_request(params, timestamp): # 腾讯云API的签名逻辑,实际项目中建议直接用官方SDK # 这里为了讲清楚流程,保留核心概念 sorted_params = "&".join( f"{quote(k, safe='')}={quote(str(params[k]), safe='')}" for k in sorted(params) ) sign_str = f"POSTasr.tencentcloudapi.com/?{sorted_params}" digest = hmac.new( SECRET_KEY.encode(), sign_str.encode(), hashlib.sha1 ).digest() return digest.hex() def submit_task(audio_url): params = { "Action": "CreateRecTask", "Version": "2019-06-14", "Timestamp": int(time.time()), "Nonce": 12345, "Region": "ap-guangzhou", "EngineModelType": "16k_zh_video", "ChannelNum": 1, "ResTextFormat": 2, "SourceType": 0, "Url": audio_url, "ConvertNumMode": 1, "SpeakerNumber": 2 } # 这里省略完整签名过程,实际用SDK会更省心 # resp = requests.post("https://asr.tencentcloudapi.com/", data=params) # return resp.json()["Response"]["Data"]["TaskId"]

几个关键参数我得展开说说,因为这些直接决定转写质量。

EngineModelType是引擎模型。我一开始用了默认的通用模型,结果录音里出现大量“嗯”“啊”被识别成奇怪汉字的情况。后来换成16k_zh_video这类视频/会议场景模型,情况明显改善。这个参数没有绝对最优,需要拿自己团队的真实录音跑几轮看效果。

ChannelNum是声道数。很多人在这里踩坑,开会用的是全向麦克风,录出来的是单声道,结果代码里写死了双声道,导致识别结果后半段全是乱码。建议先用音频工具看一眼实际声道数,或者用ffprobe确认:

ffprobe -show_streams meeting.wav | grep channels

ResTextFormat设为2,返回结果会带标点、词级时间戳和句子级时间戳。SpeakerNumber是预估的说话人数,不要设太大,否则说话人分离会强行切出很多无效角色;也不要设为1,那样就完全丧失了“谁说了什么”这个信息。

任务提交成功后,服务端会返回一个TaskId。接下来就是等结果。推荐两种方式:结果回调(CallbackUrl)和主动轮询(DescribeTaskStatus)。如果会议音频在内部系统处理,不方便暴露回调地址,轮询也完全够用。轮询的间隔建议控制在3到5秒,不要每秒疯狂请求,会给服务端造成无谓压力。

轮询接口拿到的结果是一个大的JSON结构,里面有句子列表。每个句子大概长这样:

{ "Text": "我们需要在下周三之前完成这个接口联调", "StartTime": 15230, "EndTime": 16200, "SpeakerId": 1 }

拿到这个JSON,第一步不是急着处理文本,而是确认三件事:句子数量是否合理、时间戳是否单调递增、说话人ID是否分布均匀。如果全部句子只有一两个ID,说明说话人分离没生效;如果时间戳有大量重叠,可能是声道设置不对。这些都是在真实业务里容易忽略的“脏数据检查”,宁可多写几行校验逻辑,也好过把垃圾数据送去下游。

4. 把转写稿变成“会议纪要”的文本后处理流程

原始转写稿直接扔给参会人看,一定会被骂。因为语音识别忠实还原了口语:一句话里有两三个“那个”“就是”,几个人同时说话时文字交叠,技术名词偶尔错字。所以会议小帮手的核心工作量,有一半其实在文本后处理。

我设计了四个处理步骤,按照依赖顺序依次执行:归一化、断句重排、术语修正、信息抽取。

归一化处理的是数字、日期、货币这类格式。会议里经常有“成本控制在三万五以内”“下周三之前上线”,识别结果可能是“三万五”也可能是“35000”,需要统一成可读的格式。腾讯云语音识别的ConvertNumMode参数可以辅助阿拉伯数字转汉字或保留原样,但下游规则归一再兜底一遍更稳妥。

断句重排要解决的是长句切碎问题。语音识别按静音间隔断句,所以会出现“我觉得这个问题 / 其实可以换个角度 / 比如从用户视角出发”这种碎片化句子。我的做法是把同一说话人连续输出的短句,按标点符号和语义完整性合并成完整段落。这里不建议用太复杂的模型,一个带规则的状态机就够用:当前句以谓词或连词结尾时,拼接到下一句。

术语修正这块,最有效的不是改代码,而是配置热词表。腾讯云AI语音识别支持热词表,可以把团队常用的产品名、人名、专有名词批量上传。实测下来,热词表对专用名词的字错率改善非常明显。比如“联调”“灰度发布”“调用链”“数据血缘”这些词,不加热词表时可能被识别成莫名其妙的同音词,加了之后基本一劳永逸。需要注意,热词表多音字或者重名时要慎重,避免强行替换带来新的错误。

信息抽取是把会议中的有效决策和待办抽出来。我没有用大模型做这件事,而是做了基于句子结构的规则提取:凡是包含“我们”“需要”“决定”“确认”“下周三”这类词的句子,打上标签放进“待办池”;包含“同意”“通过”“没问题”的句子,打上标签放进“决策池”。这种方案的好处是零成本、可解释,不会出现大模型抽取出幻觉结论的情况。缺点是需要维护规则词表,对开放式讨论的场合覆盖不全。如果你有条件用大模型做这一步,建议只用它做候选摘要,最后由人确认,不要直接生成整份纪要。

我整理了一份后处理流水线上常见问题的对照表,方便排查:

问题现象可能原因处理方式
数字变中文,日期识别错误未设置或误设ConvertNumMode统一改为阿拉伯数字输出,后处理再转需要格式
句子极短且碎片化音频静音段太多,断句阈值敏感设置合并窗口,低于字数阈值且非句尾的句子拼上一句
专有名词反复错热词表未配置或未生效检查热词表权重,重建任务
单人会议被切成多个说话人回声、远场拾音导致声纹不稳定降级为SpeakerNumber=1,牺牲分离保准确率
时间戳与音频对不上音频做了变速或剪辑,识别文件和原音不同步以原始录音识别,不要对喂给识别的音频做任何预处理

这套后处理逻辑跑通之后,会议小帮手才算真正从“语音转写工具”变成了“会议纪要半成品生产线”。输出的每一条待办都带上了发言人ID和时间戳,主持人只需要核对一遍措辞和优先级,就能直接发出去。

5. 上线前必须搞定的成本和安全性问题

会议转写工具上线,容易忽略两件事:成本预估和音频数据安全。很多项目在技术验证阶段跑得欢,一到正式环境被账单和数据合规卡住,回头改架构成本翻倍。

成本方面,腾讯云AI语音识别的计费是按音频时长走的,时长越长费用越高。一个团队每天开两小时会,一个月按20个工作日算,就是40小时的转写量,月度开销需要提前算清楚。我踩过的一个坑:一开始把实时识别和录音文件识别各跑一遍,费用直接翻倍。后来优化成只跑一次录音文件识别极速版,实时识别只用于现场投屏展示,且关掉结果存储,成本立刻降了下来。

安全方面,会议音频属于内部数据,处理链路里至少要做到三件事:音频文件传输走HTTPS;识别结果落盘到私有化对象存储而不是公网桶;调用API的密钥用临时密钥,别把永久密钥写进代码里。还要留意服务端日志,避免打印完整音频URL和转写内容。某次联调时,我发现同事把带有签名的音频临时地址直接打到了日志里,这种地址一旦泄露,等于把内部会议的音频也泄露出去了。这种细节对会议纪要工具来说,比功能上线还重要。

再一个容易忽略的是音频预处理。不需要降噪、不需要增强,尽量给识别引擎喂“原汁原味”的录音。有人习惯在音频上做个音量归一化或压缩,结果破坏了波形特征,识别准确率反而下降。我自己的经验是:只要录音环境不是极端嘈杂,保持原始音频直接提交,效果最稳。只有当录音明显存在爆音或削波时,才需要做轻度限幅处理。

6. 实测中的准确率表现与调优记录

把整套链路接到一个模拟项目X的真实周会上跑了一个月,效果数据比想象中好,但过程确实曲折。先看一组我记录的实测数据:

测试场景字数句错误率专有名词错误率说话人分离准确率
产品评审会(两人对话)约8000字4.2%8.1%92%
技术方案讨论(多人)约12000字7.8%15.3%78%
周会例行同步(单人主讲)约5000字2.6%3.2%95%

技术方案讨论的多人场景句错误率偏高,主要是两个原因:抢话导致的重叠语音,以及大量代码命名、接口名被识别成普通汉字。抢话问题基本无解,除非给每个人分配独立麦克风;但代码名和接口名通过热词表可以大幅改善。

调优过程中最有价值的改动有两个。第一个是热词表权重调整。一开始把所有专有名词都塞进热词表,权重一样,结果普通词汇被误替换的概率也上升了。后来按词频和重要度区分了高中低三档权重:产品名和核心模块名用最高权,次要系统名用中权,人名用低权,误替换率明显下降。第二个是说话人数参数。设定为2时,三人会议常出现一个人被吃掉的情况;改成预估数加1之后,说话人分离更稳定,因为引擎有更宽松的角色建模空间。

还有一个经验是关于实时识别结果的合并。WebSocket返回的是增量结果,同一句话会先返回中间结果再返回最终结果。如果直接把中间结果写入纪要,会出现一堆“半句话”。我的做法是在前端维护一个句子缓冲区,只把Final标志为1的句子写入最终文本,中间结果只用于投屏预览。这条规则一定要在接入第一天就写好,不然后面处理实时数据流会非常麻烦。

7. 复盘:这套方案能复制到什么场景

会议小帮手完成之后,我又拿同一套架构试了另外两个场景:客户访谈录音整理和内部培训视频字幕生成,效果都很不错。客户访谈的场景比内部会议更注重准确率,因为访谈内容要归档甚至提交客户确认。把热词表换成客户公司名和行业术语后,准确率表现接近内部会议单人场次。培训视频的字幕生成更简单,因为音频是提前录好的高质量录音,几乎不需要说话人分离。

如果你也想搭一套类似的工具,我的建议是“先窄后宽”:先只覆盖固定会议室、固定麦克风、固定人数范围的场景,把这一条路径调到稳定,再逐步扩展。会议纪要这件事,准确率比覆盖率重要得多,一个稳定可靠的例会工具,远胜过一个什么人、什么场景都能识别但经常出错的全能工具。腾讯云AI语音识别在这里承担的是整个链路的地基,真正让工具“好用”的,还是你对会议场景的理解,以及后续那套文本规则是否贴近自己团队的说话习惯。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询