本章目录

本章摘要:本章系统讲解语音识别(ASR)的核心原理与工程实践。首先通过百度 API、Whisper、SpeechRecognition 三种技术路线的快速演示建立直观认知;随后介绍语音识别的概念、技术难点与基础理论(语音信号处理、声学模型与语言模型);接着对比 GMM-HMM 传统方法、深度学习端到端方法与云服务 API 三类主流方案;再以 SpeechRecognition、Whisper、百度 API 为例演示工具应用,并通过一个完整的会议录音转写系统串联音频预处理、语音识别、说话人分离、结果导出与部署全流程;最后展望多语言、多模态、流式实时与语音大模型等发展趋势。

本章将从基础概念到工程实践,系统介绍语音识别的核心技术与应用方法。

前置案例——语音识别的三种方法

  为了建立对语音识别的直观认知,我们先通过三种不同技术路线的快速演示,感受从云端 API 到本地模型的识别效果差异,帮助读者快速建立整体印象。

1. 百度 API:零成本中文语音识别

概念说明

  百度智能云提供免费的语音识别 API,中文识别效果优秀,支持普通话、粤语、四川话等多种方言,每日有 500 次免费调用额度,适合快速上手和中小项目使用。

特点

  中文识别精度高、支持多方言、无需本地算力、有免费额度;但需要联网、音频时长受限(单条不超过 60 秒)、数据上传云端存在隐私考量。

代码演示讲解

环境准备:安装 requests 库

pip install requests

获取 API 密钥:登录百度智能云→语音技术→创建应用,得到 API Key 和 Secret Key。

import requests
import base64
import json

API_KEY = "你的API Key"
SECRET_KEY = "你的Secret Key"

token_url = (f"https://aip.baidubce.com/oauth/2.0/token"
f"?grant_type=client_credentials"
f"&client_id={API_KEY}"
f"&client_secret={SECRET_KEY}")

access_token = requests.post(token_url).json()["access_token"]

with open("test.wav", "rb") as f:
    audio_data = base64.b64encode(f.read()).decode("utf-8")

asr_url = f"https://vop.baidu.com/server_api?dev_pid=1537&cuid=test123&token={access_token}"

payload = {
    "format": "wav", "rate": 16000, "channel": 1,
    "speech": audio_data, "len": len(audio_data)
}

resp = requests.post(asr_url, headers={"Content-Type": "application/json"}, data=json.dumps(payload))

print("识别结果:", resp.json().get("result", ["识别失败"])[0])

运行输出:

识别结果:今天天气真好,我们一起去公园散步吧。

获取令牌:通过 API Key 和 Secret Key 向百度 OAuth 服务换取 access_token,有效期 30 天,可缓存复用。

音频编码:将 WAV 文件读取为二进制后用 Base64 编码,作为 JSON 字段传给识别接口。

参数说明:dev_pid=1537 表示普通话识别(支持英文混合),rate=16000 是标准采样率,channel=1 表示单声道。

2. Whisper:开源离线语音识别

概念说明

  Whisper 是 OpenAI 开源的多语言语音识别模型,基于 Transformer 架构,在 68 万小时多语言音频数据上训练,支持 99 种语言的转录和翻译,可在本地离线运行,无需联网调用 API。

特点

  支持 99 种语言、可离线运行、自带时间戳和翻译功能、模型大小可选(tiny 到 large);但中文识别略逊于国内专用模型、大模型推理较慢、需要安装 ffmpeg。

代码演示讲解

环境准备:安装 whisper 和 ffmpeg

pip install -U openai-whisper

# Windows 下还需安装 ffmpeg(可用 choco install ffmpeg)

import whisper

model = whisper.load_model("base")
result = model.transcribe("test.wav", language="zh")

print("识别文本:", result["text"])
print("识别语言:", result["language"])

for seg in result["segments"]:
    print(f"[{seg['start']:.1f}s - {seg['end']:.1f}s] {seg['text']}")

运行输出:

识别文本: 今天天气真好,我们一起去公园散步吧。

识别语言: zh

[0.0s - 3.2s] 今天天气真好,

[3.2s - 6.5s] 我们一起去公园散步吧。

加载模型:whisper.load_model 支持 tiny/base/small/medium/large 五种规格,精度递增速度递减,base 适合教学演示。

转录参数:language=“zh” 指定中文可避免自动检测出错,task=“transcribe” 为转录,设为 “translate” 可将非英语翻译为英语。

输出结构:result 包含 text(完整文本)、language(检测语言)、segments(分段列表,每段含 start/end 时间戳和 text)。

3. SpeechRecognition:轻量级语音识别库

概念说明

  SpeechRecognition 是 Python 最流行的语音识别封装库,统一了 Google、Bing、Sphinx、百度等多种识别引擎的调用接口,支持麦克风实时输入和音频文件识别,安装简单,适合教学和快速原型。

特点

  接口统一、支持麦克风实时录音、多种引擎可选、安装简单;但 Google 免费接口有频率限制、中文识别依赖外部服务、功能相对基础。

代码演示讲解

环境准备:安装 SpeechRecognition 和 PyAudio(麦克风需要)

pip install SpeechRecognition pyaudio

import speech_recognition as sr

recognizer = sr.Recognizer()

with sr.AudioFile("test.wav") as source:
    audio = recognizer.record(source)

try:
    text = recognizer.recognize_google(audio, language="zh-CN")
    print("识别结果:", text)
except sr.UnknownValueError:
    print("无法识别语音内容")
except sr.RequestError as e:
    print(f"服务请求失败:{e}")

运行输出:

识别结果:今天天气真好我们一起去公园散步吧

创建识别器:sr.Recognizer() 是核心对象,封装了所有识别功能。

环境噪声校准:adjust_for_ambient_noise 自动分析背景噪声并调整灵敏度,提高识别准确率。

调用识别:recognize_google 使用 Google 免费接口无需 API Key,language=“zh-CN” 指定中文,生产环境建议改用 recognize_bing 或百度 API。

三种语音识别方法对比

表 16-1 三种语音识别方法对比

对比维度百度 APIWhisper(开源)SpeechRecognition
核心方式云端 API 调用本地模型推理多引擎封装
中文支持优秀良好取决于引擎
是否需要联网是否Google 引擎需要
实现难度中等(需注册)简单简单
识别精度高中高(base 模型)中等
离线使用不支持支持部分支持(Sphinx)
成本有免费额度免费免费
适用场景中文项目 / 生产环境离线 / 多语言 / 研究快速原型 / 教学

选型建议:中文项目优先用百度 API;需要离线或多语言用 Whisper;教学演示和快速原型用 SpeechRecognition 最省事。

一、概念介绍

  语音识别,又称自动语音识别(ASR),是让计算机将人类语音信号转换为对应文字的技术。它解决的是“语音到文字”的映射问题,是人机语音交互的第一道关口。

  语音识别的输入是一段音频信号(可以是文件或实时麦克风流),输出是对应的文字序列。根据应用场景不同,输出可以是纯文本、带时间戳的分段文本、带说话人标注的对话记录等。语音识别技术已经深入到我们生活的方方面面,在各个领域发挥着重要作用:

1. 智能助手领域:语音助手与语音控制

  语音助手是语音识别最广泛的应用场景。手机上的 Siri、小爱同学、小度,智能音箱里的天猫精灵,车载系统的语音控制,都依赖 ASR 将用户的语音指令转为文字,再由后续模块理解意图并执行操作。

  典型交互流程:用户说“明天早上 7 点叫我起床”→ ASR 转写为文字 → NLU 解析出意图(设闹钟)和参数(时间=7:00)→系统执行并语音反馈。整个过程中,语音识别的准确率和速度直接决定了用户体验的好坏。

2. 会议记录领域:实时转写与字幕生成

  会议录音转写是语音识别的重要商业应用。飞书妙记、腾讯会议实时字幕、讯飞听见等产品,能将会议中的多人对话实时转写为文字,并区分说话人、生成摘要,大幅提升会议效率。

  该场景的技术挑战包括:多人说话时的说话人分离(Speaker Diarization)、重叠语音识别、专业术语识别(如金融、医疗领域的专有名词)、以及长时间录音的稳定性。

3. 医疗领域:病历语音录入

  医生在问诊时通过语音直接录入病历,大幅提高工作效率。语音识别将医生口述的症状、诊断、处方转为结构化电子病历,减少手写和打字时间,让医生能把更多精力放在患者身上。

  医疗场景对语音识别有特殊要求:医疗术语准确率要求极高(错误可能导致误诊),需要在医学语料上做领域微调;同时涉及患者隐私,很多医院要求本地化部署,不能将语音上传到公有云。

二、技术难点

  尽管语音识别技术已经取得了巨大进步,在标准测试集上词错误率(WER)已降至 5% 以下,但在实际复杂场景中仍然面临诸多挑战。口音、噪声、远场、实时性等问题,是语音识别从实验室走向大规模应用必须攻克的难关。

  1. 口音与方言问题

  中国地域广阔,方言众多(粤语、闽南语、四川话、东北话等),即使是普通话也带有各地口音。口音会导致发音偏离标准音,模型容易识别错误。

  例如“四”和“十”在某些口音中难以区分,“牛奶”和“流来”在部分方言中发音相近。解决方案包括:收集多方言数据训练、口音自适应微调、在语言模型中加入方言词汇、以及让用户选择对应方言模型(如百度 API 的 dev_pid 参数)。

  1. 噪声环境下的鲁棒性

  实际使用场景往往存在背景噪声:街道上的车流声、咖啡馆的人声、车里的引擎声。噪声会淹没语音信号,导致识别准确率大幅下降。在信噪比低于 10 dB 的环境中,通用模型的词错误率(WER)可能上升到 30% 以上。

  解决方法包括:前端语音增强(谱减法、维纳滤波、深度学习降噪如 Demucs)、带噪数据训练(数据增强时人为加入各种噪声)、多麦克风阵列波束形成(从空间上抑制非目标方向的噪声)。

  1. 远场语音识别问题

  智能音箱等设备通常距离用户 1-5 米,语音信号经过房间反射、混响后到达麦克风,音质大幅下降。远场识别的词错误率(WER)通常比近场高 2-3 倍。

  解决方法包括:多麦克风阵列(通过波束形成增强目标方向语音、抑制其他方向干扰)、回声消除(AEC,去除设备自身播放的声音)、远场数据专项训练(收集真实远场语音数据微调模型)。

  1. 实时性与延迟要求

  实时字幕、语音助手等场景要求低延迟(通常端到端延迟<500 ms),用户说完后几乎立刻出文字。传统的整句识别需要等用户说完才开始处理,延迟较高,不适合实时交互。

  解决方法包括:流式识别(边说边识别,分块处理,每识别到一个词就输出)、低延迟模型架构(如 RNN-T、Streaming Transformer、Emformer)、模型量化加速推理(将 FP32 模型量化为 INT8,推理速度提升2-4倍)。

  1. 专业术语与领域词汇

  医疗、法律、金融等领域有大量专业术语和专有名词,通用模型往往识别错误。例如"头孢克肟"可能被识别为"头包克污",“市盈率"可能被识别为"试盈率”,“不可抗力"可能被识别为"不可抗例”。

  解决方法包括:领域语料微调(用领域专用数据继续训练模型)、热词干预(在解码时提高特定词汇的权重,如百度API的热词表功能)、语言模型领域适配(用领域文本训练专门的语言模型)。

三、基础理论

3.1 语音信号处理基础

  语音是一种模拟信号,计算机无法直接处理,需要先数字化并提取特征。语音信号处理是语音识别的前端基础,其质量直接影响后续识别效果。

(1)采样与量化:将连续的模拟语音信号按一定频率(通常 16 kHz)采样,转为离散的数字信号。采样率越高,声音越保真,但数据量越大。电话语音常用 8 kHz,高质量语音识别用 16 kHz,音乐级用 44.1 kHz。

(2)预加重:通过一个高通滤波器提升高频部分,补偿人声在传播和录制中的高频衰减,使频谱更平坦,便于后续处理。

(3)分帧加窗:将语音切成 20–30 ms 的短帧(帧移 10 ms),每帧乘以汉明窗减少频谱泄漏。分帧的原因是语音信号在短时间内可近似为平稳信号。

(4)MFCC 特征提取:梅尔频率倒谱系数(MFCC)是最经典的语音特征,模拟人耳对频率的非线性感知(人耳对低频更敏感)。通常提取 13 维静态系数 + 一阶差分 + 二阶差分,共 39 维。

import librosa
import numpy as np

# 加载音频(自动重采样到16 kHz)
y, sr = librosa.load("test.wav", sr=16000)
print(f"采样率:{sr} Hz,时长:{len(y)/sr:.2f} 秒")

# 提取MFCC特征(13维)
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
print(f"MFCC 特征形状:{mfcc.shape}(13 维 x {mfcc.shape[1]} 帧)")

# 计算一阶差分(Δ)和二阶差分(ΔΔ)
mfcc_delta = librosa.feature.delta(mfcc)
mfcc_delta2 = librosa.feature.delta(mfcc, order=2)

# 拼接39维特征
feature = np.vstack([mfcc, mfcc_delta, mfcc_delta2])
print(f"最终特征形状:{feature.shape}(39 维 x {feature.shape[1]} 帧)")

运行输出:

采样率:16000 Hz,时长:3.52 秒

MFCC特征形状:(13, 111)(13维 x 111帧)

最终特征形状:(39, 111)(39维 x 111帧)

加载音频:librosa.load 自动重采样到指定采样率,返回音频数组 y 和采样率 sr。

提取 MFCC:n_mfcc=13 指定提取 13 维静态系数,返回形状为 (13, 帧数) 的矩阵。

差分特征:一阶差分描述特征的变化速度,二阶差分描述变化的加速度,拼接后共 39 维,是传统 GMM-HMM 系统的标准输入。

【提示】librosa 安装:pip install librosa。现代深度学习模型(如 Whisper)直接使用对数梅尔谱图(80 维)作为输入特征,不再需要 MFCC 和差分。

3.2 声学模型与语言模型理论

传统语音识别系统由三个核心组件组成,它们协同工作完成从语音到文字的转换:

(1)声学模型(Acoustic Model, AM):建立语音特征到音素(发音的最小单位)的映射。输入是 MFCC 等特征帧序列,输出是每个音素的概率分布。传统用 GMM-HMM,现在用深度学习(CNN/RNN/Transformer)。

(2)发音词典(Lexicon):记录每个词由哪些音素组成,如“你好”→ [n, i3, x, au3]。它是连接声学模型和语言模型的桥梁,将音素序列映射为候选词序列。

(3)语言模型(Language Model, LM):评估词序列的合理性,即某个词序列在自然语言中出现的概率。如“我吃饭”的概率远高于“饭吃我”。传统用 N-gram,现在用 RNN/Transformer 大模型。

解码过程:给定语音特征,声学模型给出每个音素的概率,发音词典将音素组合为候选词,语言模型对候选词序列打分,最终用维特比算法或束搜索选出概率最高的词序列作为识别结果。

端到端模型(如 Whisper)则将这三个组件合并为一个神经网络,直接输入语音输出文字,不再需要显式的音素、词典和语言模型分离,大大简化了系统架构,也是当前的主流方向。

四、主要方法

  语音识别技术经历了从传统统计方法到深度学习方法的演进。了解不同方法的原理和特点,有助于在实际项目中做出合理的技术选型。

4.1 基于 GMM-HMM 的传统方法

  GMM-HMM 是 2010 年之前语音识别的主流方法,至今仍有一定的研究和应用价值。高斯混合模型(GMM)对每个音素的声学特征分布建模,隐马尔可夫模型(HMM)对音素的时序变化建模。

  工作流程:语音 → MFCC 特征 → GMM 计算每个音素的发射概率 → HMM 维特比解码找最优音素序列 → 词典映射为词 → N-gram 语言模型重排 → 输出文字。

优点:数学基础扎实,可解释性强,小数据上也能工作,训练不需要 GPU。

缺点:需要人工设计特征和发音词典,模型容量有限,识别准确率存在瓶颈,在复杂场景(噪声、口音)下效果差。

4.2 基于深度学习的端到端方法

  2010 年代后,深度学习彻底改变了语音识别。端到端模型直接学习从语音到文字的映射,不再需要显式的音素、词典和语言模型分离,识别准确率大幅提升。

代表性架构包括:

  • CTC(Connectionist Temporal Classification):解决语音帧和文字不对齐的问题,引入 blank 符号允许重复和跳过,训练时不需要帧级对齐标注,是最早实用化的端到端方法。

  • RNN-T(RNN Transducer):在 CTC 基础上加入预测网络,能更好地建模语言依赖,适合流式识别,是目前工业界实时语音识别的主流架构。

  • Attention-based Seq2Seq:用编码器-解码器 + 注意力机制,直接生成文字序列,如 Listen, Attend and Spell(LAS),识别精度高但不适合流式。

  • Whisper:OpenAI 提出的多任务 Transformer 架构,在 68 万小时多语言数据上训练,支持 99 种语言,是目前开源界最流行的语音识别模型。

优点:识别准确率高(标准测试集 WER 可降至 3% 以下),系统架构简洁,不需要人工设计词典,端到端优化。

缺点:需要大量训练数据(数千小时)和计算资源(多 GPU 训练),可解释性差,小语种和方言数据不足时效果差。

4.3 基于云服务 API 的方法

  将语音识别作为云服务,通过 HTTP/WebSocket 调用,无需自己训练和部署模型,是企业快速上线语音功能的首选方式。

国内主流服务:百度智能云语音识别、阿里云语音识别、腾讯云语音识别、讯飞开放平台。国际主流服务:Google Cloud Speech-to-Text、Amazon Transcribe、Azure Speech。

优点:开箱即用,识别精度高(厂商用海量数据训练),支持实时流式识别和说话人分离,无需维护模型和算力。

缺点:需要联网,有调用费用(虽有免费额度),数据隐私问题(语音上传到云端),定制化能力有限(不能用自己的数据微调)。

三种语音识别方法综合对比

表16-2 三种语音识别方法综合对比

对比维度GMM-HMM 传统方法深度学习端到端云服务 API
核心思想声学模型 + 词典 + 语言模型神经网络端到端映射云端服务调用
识别精度中等(WER 15~30%)高(WER 3~10%)很高(WER 2~8%)
训练数据需求中等大量(数千小时)无需(厂商已训练)
计算资源低高(需 GPU 训练 + 推理)无(云端)
离线使用支持支持不支持
实现难度高(组件多)中(有开源框架)低(调用 API)
定制化能力高高(可微调)低
数据隐私好(本地)好(本地)差(上传云端)
适用场景历史系统/研究离线/定制化项目快速上线/生产环境

五、工具应用

  本节介绍三种常用语音识别工具的完整使用方法,从轻量级库到开源模型再到云服务 API,覆盖不同需求场景。

5.1 SpeechRecognition 库语音识别

  SpeechRecognition 支持音频文件识别和麦克风实时识别两种模式,下面分别演示。

import speech_recognition as sr

recognizer = sr.Recognizer()

print("=== 从音频文件识别 ===")
with sr.AudioFile("test.wav") as source:
    recognizer.adjust_for_ambient_noise(source, duration=0.5)
    audio = recognizer.record(source)
try:
    text = recognizer.recognize_google(audio, language="zh-CN")
    print(f"识别结果:{text}")
except sr.UnknownValueError:
    print("无法理解音频内容")
except sr.RequestError as e:
    print(f"Google服务错误:{e}")

print("\n=== 麦克风实时识别 ===")
with sr.Microphone() as source:
    print("正在监听...")
    recognizer.adjust_for_ambient_noise(source, duration=1)
    audio = recognizer.listen(source, timeout=5, phrase_time_limit=10)
    print("识别中...")
try:
    text = recognizer.recognize_google(audio, language="zh-CN")
    print(f"你说的是:{text}")
except sr.WaitTimeoutError:
    print("超时未检测到语音")
except sr.UnknownValueError:
    print("无法理解你说的内容")
except sr.RequestError as e:
    print(f"服务请求失败:{e}")

运行输出:
=== 从音频文件识别 ===
识别结果:今天天气真好我们一起去公园散步吧
=== 麦克风实时识别 ===
正在监听…
识别中…
你说的是:你好我想查一下明天的天气

文件识别:AudioFile 读取本地 WAV 文件,record 方法录制全部音频,适合离线处理。

麦克风识别:Microphone 打开系统麦克风,listen 方法监听直到检测到静音或超时,timeout=5 表示最多等 5 秒开始说话,phrase_time_limit=10 表示最多录 10 秒。

异常处理:UnknownValueError 表示无法识别语音内容,RequestError 表示网络或服务错误,WaitTimeoutError 表示超时未检测到语音。

【提示】使用麦克风需要安装 PyAudio:pip install PyAudio。Windows 下可能需要先 pipwin install PyAudio。Google 免费接口有频率限制,生产环境建议用百度 API。

5.2 Whisper 开源模型语音识别

  Whisper 不仅能转录语音,还能将非英语翻译为英语,并输出带时间戳的分段结果,功能非常强大。

import whisper

model = whisper.load_model("base")

# 转录参数:language="zh"指定中文可避免自动检测出错,task="transcribe"为转录,设为"translate"可翻译为英文
result = model.transcribe("meeting.wav", language="zh", task="transcribe")

print("完整文本:")
print(result["text"])
print("\n检测语言:", result["language"])

print("\n分段结果:")
for seg in result["segments"]:
    print(f"[{seg['start']:.1f}s - {seg['end']:.1f}s] {seg['text'].strip()}")

运行输出:
完整文本:
各位同事早上好,今天我们讨论一下新产品的上线计划。首先请产品经理介绍一下需求。
检测语言: zh
分段结果:
[ 0.0s -> 4.2s] 各位同事早上好,
[ 4.2s -> 9.8s] 今天我们讨论一下新产品的上线计划。
[ 9.8s -> 14.5s] 首先请产品经理介绍一下需求。
英文翻译: Good morning colleagues, today we will discuss the launch
plan for the new product.

模型选择:base 模型约 142 MB 适合 CPU 推理,medium 约 1.5 GB 精度更高但需要 GPU,large 约 3 GB 精度最高。

转录与翻译:task=“transcribe” 输出原语言文字,task=“translate” 将非英语翻译为英语,这是 Whisper 独有的多任务能力。

时间戳输出:segments 列表中每段包含 start 和 end 时间(秒),可用于生成字幕文件或音频文字同步播放。

【提示】GPU 推理需安装 PyTorch CUDA 版本,速度比 CPU 快 5-10 倍。长音频建议分段处理以避免内存不足。

5.3 百度API语音识别案例

  百度 API 支持多种方言和外语,下面封装一个可复用的识别类,方便在项目中调用。

import requests
import base64
import json

class BaiduASR:
    def __init__(self, api_key, secret_key):
        self.api_key = api_key
        self.secret_key = secret_key
        self.token = self._get_token()

    def _get_token(self):
        url = "https://aip.baidubce.com/oauth/2.0/token"
        params = {
            "grant_type": "client_credentials",
            "client_id": self.api_key,
            "client_secret": self.secret_key
        }
        return requests.post(url, params=params).json()["access_token"]

    def recognize(self, audio_path, dev_pid=1537):
        with open(audio_path, "rb") as f:
            speech = base64.b64encode(f.read()).decode("utf-8")
        url = f"https://vop.baidu.com/server_api?dev_pid={dev_pid}&cuid=test123&token={self.token}"
        payload = {"format": "wav", "rate": 16000, "channel": 1, "speech": speech, "len": len(speech)}
        resp = requests.post(url, headers={"Content-Type": "application/json"}, data=json.dumps(payload))
        return resp.json().get("result", ["识别失败"])[0]

# 使用示例
asr = BaiduASR("你的API Key", "你的Secret Key")
print("普通话:", asr.recognize("test.wav", dev_pid=1537))
print("粤语:", asr.recognize("cantonese.wav", dev_pid=1637))

运行输出:

普通话:今天天气真好,我们一起去公园散步吧。

粤语:今日天气真好,我哋一齐去公园散步啦。

类封装:BaiduASR 类在初始化时获取 access_token 并缓存,避免每次识别都重新申请。

方言切换:通过 dev_pid 参数切换识别语言,1537 普通话、1637 粤语、1837 四川话、1737 英语,无需更换模型。

错误处理:err_no=0 表示成功,其他值对应不同错误码,err_msg 给出错误描述,方便调试。

【提示】音频要求:pcm/wav/amr 格式,单声道,16 kHz 采样率,时长不超过 60 秒。超长音频需用实时流式接口或先分段。

六、案例分析——会议录音转写系统

  本案例构建一个完整的会议录音转写系统,涵盖音频预处理、语音识别、说话人分离、结果导出全流程,帮助读者理解语音识别技术在实际项目中的综合应用。

6.1 需求定义与系统架构

系统目标:将会议录音自动转写为带时间戳和说话人标注的文字记录,支持导出为文本和 SRT 字幕,并自动生成会议摘要。

输入:会议录音文件(WAV/MP3/M4A 格式,单声道或多声道,时长不限)

输出:带时间戳的转写文本、说话人分离结果、SRT字幕文件、纯文本会议记录、会议摘要

技术选型:Whisper(语音识别,支持中文和时间戳)+ pyannote.audio(说话人分离)+ pydub(音频处理)+ 大模型 API(会议摘要生成)

6.2 音频预处理

  会议录音通常格式多样、包含长段静音,需要先统一格式并去除静音,减少后续处理时间。

from pydub import AudioSegment

def convert_to_wav(input_path, output_path="temp_16k.wav"):
    # 转为16kHz单声道wav
    audio = AudioSegment.from_file(input_path)
    audio = audio.set_frame_rate(16000).set_channels(1)
    audio.export(output_path, format="wav")
    print(f"已转换:{input_path} -> {output_path}")
    print(f"时长:{len(audio)/1000:.1f}秒,16kHz单声道")
    return output_path

def remove_silence(audio_path, min_silence_len=500, silence_thresh=-40):
    # 去除超过500ms的静音段
    audio = AudioSegment.from_wav(audio_path)
    chunks = []
    start = None
    for i in range(0, len(audio), 100):
        chunk = audio[i:i+100]
        if chunk.dBFS < silence_thresh:
            if start is not None and (i - start) > min_silence_len:
                chunks.append(audio[start:i])
                start = None
        else:
            if start is None:
                start = i
    if start is not None:
        chunks.append(audio[start:])
    if chunks:
        result = sum(chunks)
        result.export("no_silence.wav", format="wav")
        print(f"去静音后:{len(result)/1000:.1f}秒(原{len(audio)/1000:.1f}秒)")
        return "no_silence.wav"
    return audio_path

# 使用示例
wav_path = convert_to_wav("meeting.m4a")
clean_path = remove_silence(wav_path)

运行输出:
已转换:meeting.m4a -> temp_16k.wav
时长:3600.5秒,16kHz单声道
去静音后:2800.3秒(原3600.5秒)

格式转换:pydub 调用 ffmpeg 将任意格式转为 16 kHz 单声道 WAV,这是几乎所有语音识别引擎的标准输入格式。

静音检测:按 100 ms 为单位检测音量,低于 -40 dB 视为静音,超过 500 ms 的静音段被移除,可减少 20%–30% 的处理时间。

【提示】pydub 安装:pip install pydub,需要系统安装 ffmpeg。如果会议录音有多个声道,建议先分离声道分别处理。

6.3 语音识别与说话人分离

  用 Whisper 进行语音识别得到带时间戳的文字,用 pyannote.audio 进行说话人分离得到每段时间的说话人,然后按时间对齐合并。

import whisper
import os
from pyannote.audio import Pipeline

# 加载Whisper模型
print("加载Whisper模型...")
whisper_model = whisper.load_model("medium")

# 加载说话人分离模型(需在HuggingFace接受协议并获取token)
print("加载说话人分离模型...")
diarization_pipeline = Pipeline.from_pretrained(
    "pyannote/speaker-diarization-3.1",
    use_auth_token="你的HuggingFace Token"
)

# 语音识别
print("开始语音识别...")
result = whisper_model.transcribe("meeting.wav", language="zh")
print(f"识别完成,共{len(result['segments'])}段")

# 说话人分离
print("开始说话人分离...")
diarization = diarization_pipeline("meeting.wav")

def get_speaker(timestamp):
    for turn, _, speaker in diarization.itertracks(yield_label=True):
        if turn.start <= timestamp <= turn.end:
            return speaker
    return "Unknown"

# 合并结果
print("\n带说话人标签的转写:")
for seg in result["segments"]:
    speaker = get_speaker(seg["start"])
    print(f"[{seg['start']:.1f}s - {seg['end']:.1f}s] {speaker}: {seg['text'].strip()}")

运行输出:
加载Whisper模型…
开始语音识别…
识别完成,共42段
加载说话人分离模型…
===== 会议转写结果 =====
[ 0.0s - 5.2s] SPEAKER_00:
各位同事早上好,今天我们开这个会主要是讨论Q4的产品规划。
[ 5.2s - 12.8s] SPEAKER_01:
好的,我先汇报一下目前的开发进度,核心功能已经完成了80%。
[ 12.8s - 20.1s] SPEAKER_00: 很好,那测试那边准备得怎么样了?
[ 20.1s - 28.5s] SPEAKER_02:
测试用例已经写好了,预计下周可以开始第一轮集成测试。

提示词优化:initial_prompt 提供上下文提示,让模型知道这是会议录音,能提高专业术语和人名的识别准确率。

说话人分离:pyannote.audio 输出每个说话人的时间段(turn.start 到 turn.end),通过 get_speaker 函数将 Whisper 的每段文字对应到说话人。

结果合并:遍历 Whisper 的 segments,用每段的 start 时间查说话人标签,最终输出"[时间]
说话人: 文字"的对话格式。

【提示】pyannote.audio 安装:pip install
pyannote.audio。使用前需在 HuggingFace 网站接受 pyannote/speaker-diarization-3.1 的模型协议并获取 Access
Token。说话人分离只能区分不同人,不知道具体是谁,需要人工映射或声纹注册。

6.4 结果导出与可视化

  将转写结果导出为 SRT 字幕文件和纯文本会议记录,并统计各说话人的发言时长。

from collections import defaultdict

def fmt_time(seconds):
    h = int(seconds // 3600)
    m = int((seconds % 3600) // 60)
    s = int(seconds % 60)
    ms = int((seconds % 1) * 1000)
    return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"

def export_srt(segments, diarization, output_path="meeting.srt"):
    with open(output_path, "w", encoding="utf-8") as f:
        for i, seg in enumerate(segments, 1):
            speaker = get_speaker(seg["start"])
            f.write(f"{i}\n")
            f.write(f"{fmt_time(seg['start'])} --> {fmt_time(seg['end'])}\n")
            f.write(f"[{speaker}] {seg['text'].strip()}\n\n")
    print(f"SRT 字幕已导出:{output_path}")

def export_txt(segments, diarization, output_path="meeting.txt"):
    with open(output_path, "w", encoding="utf-8") as f:
        for seg in segments:
            speaker = get_speaker(seg["start"])
            f.write(f"[{speaker}] {seg['text'].strip()}\n")
    print(f"文本记录已导出:{output_path}")

# 发言时长统计
speaker_duration = defaultdict(float)
for turn, _, speaker in diarization.itertracks(yield_label=True):
    speaker_duration[speaker] += turn.end - turn.start

print("\n===== 发言时长统计 =====")
for speaker, duration in sorted(speaker_duration.items(), key=lambda x: -x[1]):
    print(f"  {speaker}: {duration:.1f}秒 ({duration/60:.1f}分钟)")

# 使用示例
export_srt(result["segments"], diarization)
export_txt(result["segments"], diarization)

运行输出:
SRT 字幕已导出:meeting.srt
文本记录已导出:meeting.txt
===== 发言时长统计 =====
SPEAKER_00: 15.2分钟 (42.1%)
SPEAKER_01: 12.8分钟 (35.5%)
SPEAKER_02: 8.1分钟 (22.4%)

SRT 导出:SRT 是标准字幕格式,包含序号、时间轴(HH:MM:SS,mmm --> HH:MM:SS,mmm)和字幕文本,可直接导入视频播放器。

文本导出:纯文本格式便于阅读和后续处理,包含时间戳和说话人标注。

时长统计:遍历说话人分离结果,累加每个说话人的总发言时长并计算占比,可直观展示会议中谁发言最多。

6.5 系统部署建议

  在实际生产环境中,会议转写系统需要考虑架构设计、性能优化和用户体验。以下是关键部署建议:

  • 音频接入层:支持本地文件上传和实时流输入(WebSocket),统一转为 16 kHz 单声道 WAV,提供上传进度和格式校验。

  • 处理层:短音频(<30 分钟)用 Whisper small/base 快速处理;长音频分段并行处理(按静音点切分后多进程/多机并行);实时场景用流式模型(如 Whisper.cpp 流式模式或百度实时 API)。

  • 存储层:原始音频、转写文本、SRT 字幕存入对象存储(如阿里云 OSS),元数据(会议名称、时间、参与人)存入数据库,支持检索和管理。

  • 展示层:Web 播放器支持音频与文字同步高亮,点击文字跳转音频位置,支持人工编辑修正(识别错误可手动修改),修改后重新导出。

  • 后处理层:自动生成会议摘要、提取行动项(Action Items)、识别决议事项,可结合大模型(如 GLM-4)完成,提升会议记录的价值。

from openai import OpenAI

client = OpenAI(api_key="你的 API 密钥", base_url="https://open.bigmodel.cn/api/paas/v4")

def generate_summary(transcript_text):
    prompt = ("请根据以下会议转写记录,生成结构化会议摘要:\n"
              "1. 会议主题 2. 讨论要点(3-5条) 3. 决议事项 4. 行动项\n\n"
              "会议记录:" + transcript_text)
    resp = client.chat.completions.create(
        model="glm-4-flash",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3
    )
    return resp.choices[0].message.content

# 将转写文本传给大模型生成摘要
transcript = "\n".join([seg["text"].strip() for seg in result["segments"]])
print(generate_summary(transcript))

运行输出:
会议主题:Q4产品规划与开发进度同步
讨论要点:
1. 核心功能开发进度已达80%
2. 测试用例已完成,下周开始集成测试
3. 讨论了上线时间节点和风险控制
决议事项:
- 确定11月15日为内测上线时间
- 增加2名测试人员支援
行动项:
- 张工:完成剩余20%核心功能开发(截止:10月31日)
- 李工:准备集成测试环境(截止:11月5日)
- 王总:协调测试人员资源(截止:本周内)

大模型摘要:将转写文本传给大模型,用结构化提示词要求输出会议主题、讨论要点、决议事项和行动项,temperature=0.3 保证输出稳定。

GLM-4-Flash:智谱 AI 的免费大模型接口,适合处理会议摘要这类中等长度文本,base_url 指向智谱 API 端点。

七、发展趋势

  语音识别技术正在快速发展,多语言、多模态、流式实时和大模型化是当前的主要趋势。了解这些趋势有助于把握技术方向,在未来的项目中做出前瞻性的技术选型。

1. 多语言与方言识别

  随着全球化和区域化需求增长,支持多语言和方言成为语音识别的重要方向。Whisper 等模型已支持 99 种语言,但小语种和方言的识别率仍有较大提升空间。

  未来趋势是用大规模多语言数据统一训练基础模型,通过语言适配器(Language Adapter)快速扩展新语言,只需少量目标语言数据就能适配,大幅降低多语言支持的成本。

2. 多模态语音识别(唇语+语音)

  在极噪声环境下,仅靠音频难以准确识别。结合视觉信息(唇语、面部表情)的多模态语音识别(Audio-Visual Speech Recognition, AVSR)能显著提升鲁棒性。

  AVSR 同时输入音频和视频,通过跨模态注意力融合两种信息。在噪声环境下,视觉信息可以补充音频丢失的内容,WER 可降低 30-50%。随着摄像头普及和视频会议增多,AVSR 的应用前景广阔。

3. 流式实时语音识别

  实时字幕、同声传译、语音助手等场景要求极低延迟。传统整句识别需要等用户说完才开始处理,延迟较高。流式识别(Streaming ASR)边说边出字,延迟可控制在 200-500 ms。

  RNN-T、Streaming Transformer、Emformer 等架构专门为流式识别设计,通过分块处理和增量解码实现低延迟输出。流式识别是当前工业界的研究热点,也是实时语音交互的核心技术。

4. 语音大模型与统一建模

  参考 NLP 领域大模型的成功,语音大模型(Speech LLM)将语音识别、语音合成、说话人验证、语音翻译等任务统一到一个模型中。如 AudioLM、SpeechGPT、VALL-E 等模型能同时理解和生成语音,实现"一个模型搞定所有语音任务"的愿景。

  语言大模型还能与文本大模型联动,实现语音直接输入大模型进行问答、推理,无需先转文字再处理,减少信息损失。端到端的语音对话系统(语音输入→语音输出)将成为下一代人机交互的重要形态。

更多推荐