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 fPOSTasr.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/, dataparams) # return resp.json()[Response][Data][TaskId]几个关键参数我得展开说说因为这些直接决定转写质量。EngineModelType是引擎模型。我一开始用了默认的通用模型结果录音里出现大量“嗯”“啊”被识别成奇怪汉字的情况。后来换成16k_zh_video这类视频/会议场景模型情况明显改善。这个参数没有绝对最优需要拿自己团队的真实录音跑几轮看效果。ChannelNum是声道数。很多人在这里踩坑开会用的是全向麦克风录出来的是单声道结果代码里写死了双声道导致识别结果后半段全是乱码。建议先用音频工具看一眼实际声道数或者用ffprobe确认ffprobe -show_streams meeting.wav | grep channelsResTextFormat设为2返回结果会带标点、词级时间戳和句子级时间戳。SpeakerNumber是预估的说话人数不要设太大否则说话人分离会强行切出很多无效角色也不要设为1那样就完全丧失了“谁说了什么”这个信息。任务提交成功后服务端会返回一个TaskId。接下来就是等结果。推荐两种方式结果回调CallbackUrl和主动轮询DescribeTaskStatus。如果会议音频在内部系统处理不方便暴露回调地址轮询也完全够用。轮询的间隔建议控制在3到5秒不要每秒疯狂请求会给服务端造成无谓压力。轮询接口拿到的结果是一个大的JSON结构里面有句子列表。每个句子大概长这样{ Text: 我们需要在下周三之前完成这个接口联调, StartTime: 15230, EndTime: 16200, SpeakerId: 1 }拿到这个JSON第一步不是急着处理文本而是确认三件事句子数量是否合理、时间戳是否单调递增、说话人ID是否分布均匀。如果全部句子只有一两个ID说明说话人分离没生效如果时间戳有大量重叠可能是声道设置不对。这些都是在真实业务里容易忽略的“脏数据检查”宁可多写几行校验逻辑也好过把垃圾数据送去下游。4. 把转写稿变成“会议纪要”的文本后处理流程原始转写稿直接扔给参会人看一定会被骂。因为语音识别忠实还原了口语一句话里有两三个“那个”“就是”几个人同时说话时文字交叠技术名词偶尔错字。所以会议小帮手的核心工作量有一半其实在文本后处理。我设计了四个处理步骤按照依赖顺序依次执行归一化、断句重排、术语修正、信息抽取。归一化处理的是数字、日期、货币这类格式。会议里经常有“成本控制在三万五以内”“下周三之前上线”识别结果可能是“三万五”也可能是“35000”需要统一成可读的格式。腾讯云语音识别的ConvertNumMode参数可以辅助阿拉伯数字转汉字或保留原样但下游规则归一再兜底一遍更稳妥。断句重排要解决的是长句切碎问题。语音识别按静音间隔断句所以会出现“我觉得这个问题 / 其实可以换个角度 / 比如从用户视角出发”这种碎片化句子。我的做法是把同一说话人连续输出的短句按标点符号和语义完整性合并成完整段落。这里不建议用太复杂的模型一个带规则的状态机就够用当前句以谓词或连词结尾时拼接到下一句。术语修正这块最有效的不是改代码而是配置热词表。腾讯云AI语音识别支持热词表可以把团队常用的产品名、人名、专有名词批量上传。实测下来热词表对专用名词的字错率改善非常明显。比如“联调”“灰度发布”“调用链”“数据血缘”这些词不加热词表时可能被识别成莫名其妙的同音词加了之后基本一劳永逸。需要注意热词表多音字或者重名时要慎重避免强行替换带来新的错误。信息抽取是把会议中的有效决策和待办抽出来。我没有用大模型做这件事而是做了基于句子结构的规则提取凡是包含“我们”“需要”“决定”“确认”“下周三”这类词的句子打上标签放进“待办池”包含“同意”“通过”“没问题”的句子打上标签放进“决策池”。这种方案的好处是零成本、可解释不会出现大模型抽取出幻觉结论的情况。缺点是需要维护规则词表对开放式讨论的场合覆盖不全。如果你有条件用大模型做这一步建议只用它做候选摘要最后由人确认不要直接生成整份纪要。我整理了一份后处理流水线上常见问题的对照表方便排查问题现象可能原因处理方式数字变中文日期识别错误未设置或误设ConvertNumMode统一改为阿拉伯数字输出后处理再转需要格式句子极短且碎片化音频静音段太多断句阈值敏感设置合并窗口低于字数阈值且非句尾的句子拼上一句专有名词反复错热词表未配置或未生效检查热词表权重重建任务单人会议被切成多个说话人回声、远场拾音导致声纹不稳定降级为SpeakerNumber1牺牲分离保准确率时间戳与音频对不上音频做了变速或剪辑识别文件和原音不同步以原始录音识别不要对喂给识别的音频做任何预处理这套后处理逻辑跑通之后会议小帮手才算真正从“语音转写工具”变成了“会议纪要半成品生产线”。输出的每一条待办都带上了发言人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语音识别在这里承担的是整个链路的地基真正让工具“好用”的还是你对会议场景的理解以及后续那套文本规则是否贴近自己团队的说话习惯。
阅读完成 · 觉得有帮助?