跳到主要内容ASR 自动语音识别原理与 Whisper 模型解析 | 极客日志PythonAI算法
ASR 自动语音识别原理与 Whisper 模型解析
介绍 ASR 自动语音识别技术架构,涵盖音频预处理、特征提取(如 MFCC、梅尔频谱)、神经网络编码及解码方式(CTC、RNN-T、Transformer)。重点解析 OpenAI 开源模型 Whisper 的核心特点、生态系统及不同工具包(openai-whisper、faster-whisper、whisperX)的返回结构差异与应用场景,并提供代码示例说明后处理与格式化流程。
板砖工程师0 浏览 ASR 是自动语音识别技术,现代端到端的主流 ASR 架构为:音频 → [预处理 → 神经网络编码 → 解码] → 文本。
Whisper 是由 OpenAI 于 2022 年发布的开源语音识别模型。它是一个基于 Transformer 架构的端到端模型,具有以下核心特点:多任务模型、多语言支持、多种格式、强鲁棒性和无需微调开箱即用。
ASR 技术概述
音频输入与预处理一般通过 ffmpeg 与 VAD 配合完成。
特征提取与编码
现在的 ASR 通常使用声学特征直接输入神经网络。
常见的声学特征有以下四种,但是现在一般直接使用神经网络自动学习特征,例如 Conformer 编码器就是神经网络组成的。
- MFCC(梅尔频率倒谱系数):13-40 维
- 梅尔频谱(Mel-Spectrogram):80-128 维
- 滤波器组(Filter Bank):40-80 维
- 原始波形(Raw Waveform):端到端模型直接使用
- Conformer 编码器:输入 (T, 80) # T 个时间帧,每帧 80 维梅尔特征
- 子采样卷积层:(T, 80) → (T/4, 512)
- 位置编码:加入时序信息
- N 个 Conformer Block:
- 前馈网络(Feed Forward)
- 多头自注意力(Multi-Head Self-Attention)
- 卷积模块(捕捉局部特征)
- 残差连接 + 层归一化
输出:(T/4, 512) # 高层声学表示
def mel_filter_bank(magnitude_spectrum, sr=16000, n_mels=80):
mel_filters = librosa.filters.mel(sr=sr, n_fft=512, n_mels=n_mels)
mel_spectrum = np.dot(magnitude_spectrum, mel_filters.T)
log_mel_spectrum = np.log(mel_spectrum + 1e-10)
return log_mel_spectrum
def extract_mel_spectrogram(audio, sr=16000):
mel_spec = librosa.feature.melspectrogram(
y=audio, sr=sr, n_mels=80,
n_fft=400,
hop_length=160,
fmin=0, fmax=8000
)
log_mel_spec = np.log(np.clip(mel_spec, a_min=1e-10))
return log_mel_spec.T
def compute_mfcc(log_mel_spectrum, n_mfcc=13):
mfcc = dct(log_mel_spectrum, type=2, axis=1, norm='ortho')
mfcc = mfcc[:, :n_mfcc]
return mfcc
解码
| 类型 | CTC | RNN-T | Attention-based Seq2Seq | Transformer-based |
|---|
| 特点 | 每个时间步独立预测 | 结合 RNN 和 CTC | 编码器 - 解码器 + 注意力 | 纯注意力机制 |
| 优点 | 训练简单、推理快 | 流式友好,考虑上下文 | 效果好、适合长语音 | 并行计算、效果最好 |
| 缺点 | 假设输出独立,不考虑上下文 | 训练复杂,推理慢 | 非流式,需要看到完整语音 | 需要大量数据、计算资源多 |
class CTC_Decoder:
def decode(self, encoder_output):
logits = self.output_layer(encoder_output)
return best_sequence
class AttentionDecoder:
def decode(self, encoder_output):
hidden = init_hidden()
output = ["<sos>"]
for step in range(max_length):
embed = self.embedding(output[-1])
attn_weights = softmax(
self.attention(query=hidden, key=encoder_output)
)
context = sum(attn_weights[i] * encoder_output[i] for i in range(T))
hidden = self.decoder_rnn(embed, hidden, context)
next_word_probs = softmax(
self.output_projection(hidden)
)
next_word = argmax(next_word_probs)
output.append(next_word)
if next_word == "<eos>":
break
return output[1:-1]
Transformer 解码器(如 Whisper):
class TransformerDecoder:
def decode(self, encoder_output):
tokens = [self.sos_token]
for i in range(max_length):
token_embeds = self.embedding(tokens)
dec_output = self.decoder_blocks(token_embeds, encoder_output)
logits = self.output_layer(dec_output[:, -1, :])
next_token = argmax(logits)
tokens.append(next_token)
if next_token == self.eos_token:
break
return tokens[1:-1]
后处理和格式化输出
好的后处理可以让 ASR 系统的实用价值提升 30-50%,是工业级 ASR 系统中不可或缺的一环。
后处理包括的操作类型有:标点恢复、数字标准化、实体标准化、语法修正、领域适配、流畅性改进等等。
def postprocess_asr_text(raw_text):
text = add_punctuation(raw_text)
text = restore_capitalization(text)
text = normalize_numbers(text)
text = normalize_spoken_text(text)
text = correct_proper_nouns(text)
text = re.sub(r'\s+', ' ', text).strip()
return text
def format_asr_output(text, segments, timestamps):
output = {
'text': text,
'segments': [
{
'id': i,
'start': seg['start'],
'end': seg['end'],
'text': seg['text'],
'confidence': seg['confidence']
} for i, seg in enumerate(segments)
],
'language': detected_language,
'duration_ms': total_duration,
'word_timestamps': [
{'word': word, 'start': start_ms, 'end': end_ms}
for word, start_ms, end_ms in timestamps
]
}
return output
Whisper 模型详解
Whisper 虽然开箱即用,但是首次使用的时候需要下载模型。下载的时候可以选择不同大小的模型 tiny、base、small、medium、large,他们的准确率与模型的大小成正比(越大准确率越高),速度与模型大小成反比(越大速度越慢)。
Whisper 生态系统以 OpenAI 的 Whisper 模型为核心,由社区驱动的工具、框架、应用和服务组成。主要工具对比如下:
| 生态工具 | 场景 | 理由 |
|---|
openai/whisper | 研究和实验 | 功能完整,调试方便 |
faster-whisper | 生产环境部署 | 平衡性能与功能 |
whisper.cpp 或 faster-whisper | 实时转写/直播 | 延迟低,资源占用少 |
whisperX | 需要说话人分离 | 集成 diarization |
whisper-jax 或 faster-whisper | 云端大批量处理 | 吞吐量高 |
whisper.cpp | 移动端/嵌入式 | 内存小,无 GPU 依赖 |
whisperX | 需要词级时间戳 | 词对齐准确 |
针对 Whisper 衍生出的工具包在调用 transcribe() 函数的时候会返回不同的结构内容。
官方实现——openai-whisper 的返回结构
openai-whisper 包返回的是以下格式:其中 text 是所有的文本,segments 表示每一段的信息(包括文本、开始/结束时间、偏移量),words 表示每个词/字的信息。
{
"text": "完整文本,所有分段合并",
"segments": [
{
"id": 0,
"seek": 0,
"start": 0.0,
"end": 4.0,
"text": "你好,",
"avg_logprob": -0.2,
"no_speech_prob": 0.02,
"compression_ratio": 1.2,
"temperature": 0.0,
"tokens": [50364, 1234, ...],
"words": [
{"word": "你", "start": 0.0, "end": 0.2, "probability": 0.95}
]
}
],
"language": "zh"
}
whisper.cpp 返回 json 格式,以下是返回示例:transcription 表示转录文本。
{
"transcription": [
{
"timestamps": {"from": "00:00:00,000", "to": "00:00:04,000"},
"offsets": {"from": 0, "to": 3},
"text": "你好,",
"tokens": [50364, 1234, ...]
}
],
"text": "完整文本",
"language": "zh",
"response_time": 2.3
}
推理优化——faster-whisper 的返回结构
faster-whisper 中使用 transcribe() 函数一般返回两个对象:生成器和信息对象。
segments, info = model.transcribe("audio.mp3")
print(info.__dict__)
for segment in segments:
print(segment.__dict__)
功能增强——whisperX 的返回结构
{
"segments": [
{
"start": 0.0,
"end": 4.0,
"text": "你好,",
"words": [
{"word": "你", "start": 0.0, "end": 0.2, "score": 0.95, "speaker": null}
]
}
],
"word_segments": [
{"word": "你", "start": 0.0, "end": 0.2, "score": 0.95}
],
"speaker_segments": [
{"start": 0.0, "end": 10.0, "speaker": "SPEAKER_00", "text": "第一段话..."}
],
"language": "zh"
}
| 工具包 | 返回类型 | 主要字段 | 额外特性 | 语言检测 |
|---|
| openai-whisper | dict | text, segments, language | 官方实现,功能完整 | 返回语言代码 |
| faster-whisper | tuple + Generator | (segments_generator, info) | 速度快,内存小 | 包含概率值 |
| whisper.cpp | JSON/文本 | 各种自定义格式 | 可嵌入式部署 | 需要参数指定 |
| whisper-jax | dict | text, chunks | GPU 利用率高 | HF 格式 |
| whisperX | dict | segments, word_segments | 词级对齐,说话人分离 | 同官方 |
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online