☰
腾讯云语音识别API实战:打造会议实时转写与纪要生成小帮手
2026/10/20 13:06:25 网站建设 项目流程

1. 项目整体设计与思路拆解

1.1 会议场景的痛点与破局点

先说一个很多人都遇到的场景:开会时,既要听发言人讲内容,又要手敲会议纪要,经常是记了上一句就漏掉下一句。尤其碰上语速快的同事,或者是连着开三个小时的头脑风暴会,散会之后翻笔记,发现记下的内容七零八落,关键结论和待办事项甚至要靠回忆才能拼凑出来。

这正是我做这个“会议小帮手”的初衷:利用腾讯云 AI 语音识别能力,把开会过程中的语音实时转成文字,会后自动生成一份相对完整的会议记录。项目麻雀虽小,五脏俱全,核心解决三件事——实时转写、关键词提醒、会后纪要整理。整个项目基于云厂商的成熟API做二次开发,不需要自己训练语音模型,也不需要昂贵的GPU服务器,一条普通的公网服务器就能跑起来。

这个项目适合谁?三类人:第一类是经常被会议纪要折磨的运营、产品、项目经理;第二类是刚接触语音识别API接入、想练手一个完整项目的开发者;第三类是公司内部想低成本搭建会议辅助工具的技术负责人。语言层面我以 Python 为主,因为云厂商的Python SDK最成熟,示例代码也最多,方便快速验证。

1.2 为什么选择腾讯云语音识别而非其他方案

我们在做技术选型的时候,其实有两条路:自建开源语音识别模型(比如用whisper本地部署)和调用云厂商API。我分别说一下我实测下来的感受。

自建Whisper模型这条路,我并不是没有尝试过。当时在一台带独立显卡的机器上跑base模型,中文识别效果也还行,但问题出在工程化上:

  • 自建服务需要自己处理并发请求、模型热加载、音频格式归一化、长时间运行的稳定性问题;
  • 模型更新迭代要自己跟进,中文场景的领域词汇(比如产品名、专业术语)需要额外做微调或者提示词工程;
  • 如果公司内部有多人同时使用,硬件成本和运维成本会直线上升。

对比下来,云厂商的语音识别API在中文场景下有着明显的综合优势。腾讯云的语音识别服务有几个点特别打动我。首先是实时率低,一句话识别和实时语音识别接口在正常网络环境下延迟基本在几百毫秒以内,现场会议跟记基本无感。其次是领域词汇和热词定制,这是会议场景的刚需,后文我会专门展开讲。最后一点是价格模型清晰,有免费额度的按量计费方式,对于个人项目和中小企业来说启动成本很低,试错成本几乎可以忽略不计。

当然,我也不是说云API完全没有缺点。它是联网服务,对网络稳定性有要求,内网环境或者离线机房场景就不适用。另外,上传音频到云端,数据隐私和合规是绕不开的考量,敏感会议内容需要脱敏或者内部评估后才能用。这些都是选型时需要提前想清楚的。

2. 核心能力拆解与参数选型

2.1 三大核心接口:一句话识别、实时语音识别、录音文件识别

一个完整的会议小帮手,至少要用到腾讯云语音识别服务的三个接口,我把它们的分工和应用场景整理成一个表格,方便你对照选择:

接口名称延迟特征适合场景会议应用示例
一句话识别极低延迟,毫秒级返回短音频,60秒以内,一句话或几句会前语音控制,快速录入议题
实时语音识别流式返回,边说边出字长时段的实时语音流会议过程中实时转写,投屏展示
录音文件识别异步处理,分钟级返回录制好的完整音频文件会议结束后全量转写,生成纪要

考虑到会议场景的特殊性,我建议你的小帮手同时支持“实时模式”和“后处理模式”两种形态。实时模式用实时语音识别接口,边开会边出字幕,参与者可以随时回顾前面说了什么;后处理模式则靠录音文件识别接口,把整个会议的录音丢给云端,异步转写好后,再在本地做文本后处理,生成结构化纪要。

不要小看这个“双模式”设计。我实际做过一次对比测试:纯实时识别,如果发言人带着口音或者背景嘈杂,文字会有少量错漏,这时候后处理模式一次性转写的效果往往更稳定。而纯录音文件识别,则无法在会议现场做到关键词提醒和实时投屏。两者配合,才是一个完整的闭环方案。

2.2 热词定制:让AI听懂你的行业黑话

会议记录最怕的不是听不懂普通话,而是听不懂行业黑话。我举个例子,如果你们团队经常讨论一个叫“XX模块”的组件的对接方案,语音识别大概率会把它转成“叉叉模块”。同样,产品代号、英文缩写、人名,都是常规语音识别的重灾区。

腾讯云的语音识别服务提供了热词定制功能,本质上是在解码阶段对指定词汇的识别结果进行加权偏置,让模型更倾向于输出你预设的词条。这个功能非常实用,我建议你第一时间用起来。

使用方式也很简单,在腾讯云语音识别控制台的“热词管理”里,创建一个热词表,把常见的产品名、缩写、人名都录进去,然后绑定到你的应用上。实际操作里有几个细节要注意:

  • 热词单条长度有限制,太长的短语建议拆成短词组合;
  • 热词表有数量上限,不要贪多,只加真正高频出现的词;
  • 热词对拼音相似词汇有概率性影响,设置过多反而可能干扰常规识别。

我在一次模拟项目评审会中,提前录入了几个项目代号和英文缩写,最终转写准确率在关键术语上提升了非常明显。这个功能对会议场景来说,属于“无脑上、立刻见效”的优化项。

2.3 说话人分离与标点预测:从“转文字”到“转好文字”

光有逐字稿还不够,一份看得下去的会议纪要,至少要能区分谁在说话,并且带上正确的标点。腾讯云的录音文件识别接口在异步识别模式下,支持说话人分离和标点预测两个高级参数,我实测下来效果很不错。

说话人分离的原理,是通过声学特征分析,把音频流按说话人聚成不同的声道。默认支持分离2个说话人,最高可以配置到10个。对于大部分内部会议场景,建议配置成2~3个就够了,因为说话人越多,分离准确率会有一定程度的下降,而且后续在文本中做角色标注也更困难——你很难靠声音区分出到底谁是谁,只能按“说话人1”“说话人2”来标记。

标点预测则是个很容易被忽略的细节。原始识别结果如果没有标点,就是一坨连在一起的文字,阅读体验非常差。开启标点预测后,识别结果会带上基本的逗号、句号、问号,后处理做段落切分就轻松多了。

我给你的建议是:实时识别模式别开太多后处理,因为流式转写讲究的是低延迟,标点预测和说话人分离会增加处理耗时;而异步的录音文件识别,则可以把能开的参数都打开,一次性生成高质量文本。

3. 实操过程与核心环节实现

3.1 开发环境准备与Python SDK依赖

这一节我带你从头到尾把环境跑通。我用的是Python 3.8+ 环境,操作系统是Linux服务器(CentOS 7),全程没有用到桌面环境,纯命令行操作。

首先,安装腾讯云语音识别的Python SDK:

pip install tencentcloud-sdk-python pip install tencentcloud-sdk-python-asr # 语音识别专用包

如果你的网络环境安装速度慢,可以换用国内镜像源:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tencentcloud-sdk-python pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tencentcloud-sdk-python-asr

然后,还需要准备一些音频处理相关的工具库。因为会议录音的原始格式可能五花八门,手机上录的是m4a,电脑软件录的是wav,还有会议系统导出的mp3,而语音识别接口对音频格式和采样率是有明确要求的。腾讯云的录音文件识别支持wav、mp3、m4a等主流格式,但要求是单声道、采样率不低于16kHz,这一点非常关键,建议在预处理环节就直接统一规格。

pip install pydub

pydub库负责音频格式的读取和转换,它底层依赖ffmpeg,装好之后别忘了在系统里安装ffmpeg:

yum install -y ffmpeg

依赖装好之后,你需要一个腾讯云的账号,然后在控制台开通语音识别服务,拿到三个关键凭证:SecretId、SecretKey 和 AppId。这三样东西相当于你调用API的身份证,一定不要硬编码在代码里然后提交到公开仓库。我习惯把它们写到环境变量或者本地配置文件中,代码里用环境变量读取。

3.2 实时语音识别模块:把会议现场变成字幕

实时语音识别是整个会议小帮手的门面。先创建一个独立的Python文件real_time_asr.py,核心逻辑如下:

import os import json import time from tencentcloud.asr.v20190614 import asr_client, models from tencentcloud.common.credential import Credential from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile # 从环境变量读取密钥,避免硬编码 cred = Credential( os.environ.get("TENCENT_SECRET_ID"), os.environ.get("TENCENT_SECRET_KEY") ) http_profile = HttpProfile() http_profile.endpoint = "asr.tencentcloudapi.com" client_profile = ClientProfile() client_profile.httpProfile = http_profile client = asr_client.AsrClient(cred, "", client_profile) def create_real_time_task(): req = models.CreateRecTaskRequest() params = { "EngineModelType": "16k_zh", # 16kHz 中文普通话模型 "ChannelNum": 1, # 单声道 "ResTextFormat": 0, # 0: 词级别结果,1: 句级别结果 "SourceType": 1, # 1: 本地文件上传 "Data": "", # 音频数据(Base64编码) "VoiceId": str(int(time.time())), # 这次任务的唯一标识,建议用时间戳 } req.from_json_string(json.dumps(params)) resp = client.CreateRecTask(req) return resp.TaskId if __name__ == "__main__": print(create_real_time_task())

这段代码只是建任务,真正的实时识别需要用到WebSocket协议。SDK里提供了AsrWebSocketClient,这会复杂一些。为了让你能快速跑起来,我们换个方案:从麦克风采集音频流,实时推给录音文件识别接口,等识别完成后再用轮询拿结果。

这里有个更简洁的思路:会议场景下,如果使用腾讯云的“实时语音识别”WebSocket接口,端到端的实时率可以做到非常低。但完整贴出WebSocket和音频流采集代码会非常长,占据篇幅。我在这篇里分享一个简化、可靠且足够实用的方案,也就是“分片段短音频识别”:

把会议过程切分成每60秒一个片段,每个片段用一句话识别接口去转写,然后本地拼接。

from tencentcloud.asr.v20190614 import models def recognize_chunk(audio_data_b64): req = models.SentenceRecognitionRequest() params = { "ProjectId": 0, "SubServiceType": 2, "EngSerViceType": "16k_zh", "SourceType": 1, "VoiceFormat": "wav", "UsrAudioKey": str(int(time.time())), "Data": audio_data_b64, "DataLen": len(audio_data_b64), } req.from_json_string(json.dumps(params)) resp = client.SentenceRecognition(req) return resp.Result

这段代码实测可用,处理一条60秒的WAV音频,识别速度非常快。它的优点是逻辑简单、不会断流、错误处理容易做;缺点是会议长的话调用次数多,好在一句话识别接口单价很低,整体成本可以接受。

3.3 录音文件识别模块:会后生成高质量纪要

会议结束后,把完整的录音文件丢给录音文件识别接口,异步等结果。完整流程分三步:创建任务、轮询任务、解析结果。

def submit_audio_task(bucket_file_url): """ 提交录音文件识别任务 bucket_file_url: 腾讯云COS上的音频文件URL,或者公网可访问的文件URL """ req = models.CreateRecTaskRequest() params = { "EngineModelType": "16k_zh", "ChannelNum": 1, "ResTextFormat": 2, # 2: 带词时间戳的详细结果 "SourceType": 0, # 0: URL方式 "Url": bucket_file_url, "ConvertNumMode": 1, # 数字转换,阿拉伯数字转汉字 "FilterDirty": 1, # 过滤脏词 "FilterPunc": 0, # 保留标点 "FilterModal": 1, # 过滤语气词(嗯、啊、呃) "SpeakerNumber": 2, # 开启说话人分离,2人 } req.from_json_string(json.dumps(params)) resp = client.CreateRecTask(req) return resp.Data.TaskId

注意这里的SourceType和实时模式的差异。录音文件识别支持两种音频来源:一种是上传到腾讯云COS生成URL,另一种是公网HTTP访问的URL。我强烈建议用COS,毕竟内网、跨云访问公网URL在安全策略和访问速度上都会有额外的麻烦。

任务提交后,因为识别是异步的,需要用任务ID去轮询结果:

def poll_task_result(task_id, timeout=600): req = models.DescribeTaskStatusRequest() params = {"TaskId": task_id} req.from_json_string(json.dumps(params)) start = time.time() while time.time() - start < timeout: resp = client.DescribeTaskStatus(req) status = resp.Data.Status if status == 1: # 任务进行中 time.sleep(5) continue elif status == 2: # 任务成功 return json.loads(resp.Data.Result) else: raise Exception(f"任务失败, status = {status}") raise TimeoutError("录音识别任务超时")

轮询间隔建议至少设置5秒,如果请求太频繁,接口会返回限流错误。识别结果是一个JSON结构,核心字段是ResultText(完整文本)和SentenceList(按句切分的结果,包含每句话的起止时间和说话人标注)。

拿到这份JSON后,我们的会议小帮手就可以做后处理了。我在项目中实现了一个简化的文本后处理管线:

  • 用SentenceList里的说话人ID,给每句文本加上“发言者A”“发言者B”前缀;
  • 根据时间戳,把内容按15分钟为粒度切分成段落;
  • 用关键词表做匹配,找出每段里的(待办事项、决策结论、风险点)相关的句子,单独抽出来,凑成会议结论初稿。

这段逻辑我放在本地的post_process.py里,没有调用额外的大模型API,用纯规则就够用。如果你希望纪要更加智能化,后续完全可以接入大模型做摘要生成,但那是另一个话题了。

3.4 关键词提醒:你的会议“小雷达”

关键词提醒是会议小帮手里最受欢迎的功能,想象一下:参会者正讨论得热火朝天,突然有人提到“风险”“延期”这类词,你的小帮手立刻在群里弹一条提醒,让相关人员注意——前置预警效果非常好。

实现起来并不复杂。实时模式的文本是流式返回的,我们只需要维护一个关键词列表,对每次返回的增量文本做匹配即可。我用的是一个非常轻量级的AC自动机库ahocorasick:

import ahocorasick def build_keyword_matcher(keywords): A = ahocorasick.Automaton() for idx, kw in enumerate(keywords): A.add_word(kw, (idx, kw)) A.make_automaton() return A def check_keywords(matcher, text): hits = [] for _, (idx, kw) in matcher.iter(text): hits.append(kw) return list(set(hits)) # 去重

这个库处理几百个关键词的匹配是毫秒级的,完全满足实时性要求。关键词的来源可以是一个文本文件,每行一个词,方便你随时增删。我在项目里放了一个默认关键词表,包含“截止时间”“预算”“风险”“负责人”等常见会议核心词。

这里有一个我在实战中踩过的小坑:ahocorasick库在某些Python 3.10+版本上需要额外安装依赖,否则编译不通过。如果你的环境同样报错,可以直接用SDK自带的字符串匹配,或者退一步用正则表达式,因为关键词量少的时候,性能差异几乎无感。

3.5 整体流程串联:从录音到纪要的完整链路

写了这么多模块,最后说一下它们在项目里的串联方式。我的“会议小帮手”整体流程是:

  1. 会前准备:启动一个小脚本,初始化热词表、关键词表,确认麦克风或录音笔设备正常。
  2. 会中阶段:用实时识别模块接收现场音频流,每隔60秒切割一个识别片段,转写文本追加到本地实时记录文件;同时增量做关键词匹配,命中后触发提醒逻辑。
  3. 会后阶段:把完整录音文件提交给录音文件识别接口,异步轮询拿到全量转写结果,做说话人分离、段落切分、关键词抽取,最终生成一份带时间戳、带说话人、带会议结论的Markdown纪要。

整个流程,我把所有函数封装在一个入口脚本run.py中,通过简单的命令行参数切换“实时模式”和“纪要模式”。实测一次45分钟的常规项目例会,从录音到生成完整纪要,耗时约5分钟。

4. 常见问题与排查技巧实录

4.1 音频格式与上传失败的“隐形坑”

我在开发过程中,第一个遇到的坑就是音频格式。当时拿手机录了一段m4a格式的会议录音,兴冲冲提交到录音文件识别接口,结果直接返回参数错误。排查下来才发现,接口虽然是支持m4a的,但对编码细节有要求,有些手机录出来的AAC编码格式不在支持列表里。绕一圈的方式就是用ffmpeg先做一次统一转码:

ffmpeg -i meeting.m4a -ar 16000 -ac 1 -f wav meeting_16k.wav

这条命令把采样率强制设为16kHz、单声道,输出WAV格式。我在处理所有待识别音频时,都会先做这一步,能规避绝大部分格式纠纷。团长们在写代码时,也只要把这个转码调用前置在提交任务之前就行。

4.2 超长音频的分片策略与会话超时

有朋友问过我,录音文件识别支持多长的音频?按照官方文档,录音文件识别对单次文件的大小和时长是有限制的。但实际项目里,一个上午的评审会动辄两三小时,音频文件动不动就1GB以上,这种情况直接提交大概率会失败。

我的经验是,在本地先把长音频按话题切分成多个片段(比如每个片段20到30分钟),然后并行或者串行提交多个识别任务,最后再把结果按时间顺序拼接。切分点如果选得好(比如选在没人说话的间隙),对识别效果几乎没影响。但是注意,并行提交也不要超过接口的并发上限,否则反而会因为排队浪费更多时间。

另外,轮询超时的问题也值得留意。我曾经遇到一个90分钟的音频,轮询了8分钟都还在“进行中”,最后手动取消任务重跑的。后来我优化了策略:超过45分钟的音频,直接分段提交,几分钟就能拿到所有片段的结果,串行拼接也比挂一个大任务快得多。

4.3 热词不生效:排查思路分享

热词功能刚接入时,我发现某些词怎么设都不生效,识别结果还是错的。排查过程让我学到几个知识点:

  • 热词不能设置太长的短语,例如设置“需求评审会议纪要模板”,识别器很难精准命中那么长的连续序列,效果会变差;
  • 热词与引擎模型有关,如果你用的引擎是 “16k_zh” 或 “16k_zh_en”,支持的热词机制略有差异,需要对应配置;
  • 热词配置后不是立即热度拉满,存在一段短暂的生效时间,刚修改完立刻测试可能看不出变化。

后来我把长词拆成短词,再对关键缩写做了中英混排处理,效果立刻改善。总结六个字就是:短词、高频、量少。

4.4 常见问题速查表

现象可能原因解决方案
提交任务返回参数错误音频格式/采样率不符合要求用ffmpeg统一转码为16kHz单声道WAV
识别结果全是同音字缺少领域热词,或热词设置过长加短热词,拆短语
长篇音频识别超时人单文件过长超过接口限制分段切割、并行提交
轮询接口报“限流”轮询频率过高轮询间隔调到5到10秒
实时识别频繁掉线网络不稳或本地进程阻塞增加自动重连,对音频帧做好临时缓存
COS文件链接无法访问权限设置为私有用预签名URL或者临时公读权限

4.5 参数调优心得与成本控制

最后聊一下成本。做会议小帮手,最怕的是效果没调好,账单先爆了。我实测了多次调用,录音文件识别按时长计费,价格在可接受范围,但前提是不要频繁重复提交同一个音频做测试。

一条非常实用的省钱技巧:调试阶段不要每次都用几小时的长音频,用一段1到2分钟的录音反复测参数,确认效果OK了再上全量音频。另外,识别结果如果质量差,优先检查音频本身的噪声和麦克风位置,而不是盲目调整接口参数,因为接口参数翻来覆去就那些,Audio质量才是上限。

还有一个隐藏成本点是COS存储,音频文件放在COS里会持续产生存储费用。我的做法是:识别成功后,设置COSS生命周期规则,3天后自动清理临时音频文件,只保留转写结果。

5. 扩展思路:从会议小帮手到团队AI助理

5.1 接入多人实时会议场景

这个项目做出来之后,我不止一次被问到:能不能接进腾讯会议、钉钉会议里,实现多人实时字幕?答案是肯定的,但需要额外处理音频源的问题。当前项目默认采集的是本机麦克风音频,如果要做会议室级应用,最好是利用会议软件提供的API能力,直接拿到会议流的音频轨,再转给语音识别接口。这块开发量会大不少,但架构上是顺畅的,核心识别链路无需改动,只需要替换音频输入源。

5.2 和大模型LLM结合,自动生成摘要与待办

我在项目基础版本跑通后,又做了一个小实验:把录音识别的转写文本,塞给大模型做摘要生成。效果非常惊艳——原本用规则抽取的“会议结论初稿”,在LLM加持下,直接变成了带有分类和优先级标记的待办清单。这个大模型可以是云端API,也可以是你私有化部署的开源模型,取决于数据隐私要求。这一层的所有输入输出都是纯文本,与语音识别服务解耦,符合本项目一直坚持的“简单可扩展”原则。

5.3 后续可以玩的几个方向

  • 说话人声纹识别:在说话人分离基础上,做一个声纹库,直接认出谁是谁,而不是“说话人1”;
  • 自动翻译:会议转写文本再走一遍机器翻译API,实现中英双语会议纪要;
  • 会议知识库:把历史会议的转写文本向量化,支持语义搜索,例如“上次会议关于预算的结论是什么”;
  • 定时任务调度:让会议小帮手每天定时生成日报,自动推送到企业微信或飞书群。

我自己目前的版本只做到了前面提到的实时转写和会后纪要,但每一条扩展路径都不需要推翻现有代码,整体框架已经留好了接口。这恰恰是做一个“小帮手”而不是“一个定制脚本”的最大好处。如果你也在搭类似工具,建议从一开始就把识别、后处理、提醒、输出这四个环节解耦,后续的迭代会轻松非常多。

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

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

立即咨询