跳到主要内容
ASR 自动语音识别技术与 Whisper 模型详解 | 极客日志
Python AI 算法
ASR 自动语音识别技术与 Whisper 模型详解 介绍 ASR 技术架构,包括音频预处理、特征提取(MFCC、梅尔频谱)、解码方式(CTC、Attention、Transformer)及后处理。重点解析 OpenAI Whisper 模型的多任务与多语言特性,对比 openai-whisper、faster-whisper、whisperX 等工具包的返回结构差异与适用场景,并提供 Python 代码示例辅助理解。
编程诗人 发布于 2026/4/6 更新于 2026/9/4 59 浏览ASR 与 Whisper 模型
ASR 是自动语音识别技术,现代端到端的主流 ASR 架构为:
音频 → [预处理 → 神经网络编码 → 解码] → 文本
信号处理 → 深度学习
Whisper 是由 OpenAI 于 2022 年发布的开源语音识别模型。它是一个基于 Transformer 架构的端到端模型,具有以下核心特点:多任务模型、多语言支持、多种格式、强鲁棒性和无需微调开箱即用。
一、ASR
音频输入与预处理一般通过 ffmpeg 与 VAD 配合完成。
1. 特征提取与编码
现在的 ASR 通常使用声学特征直接输入神经网络。
常见的声学特征有以下四种,但是现在一般直接使用神经网络自动学习特征,例如 Conformer 编码器就是神经网络组成的。
MFCC(梅尔频率倒谱系数):13-40 维
梅尔频谱(Mel-Spectrogram):80-128 维
滤波器组(Filter Bank):40-80 维
原始波形(Raw Waveform):端到端模型直接使用
Conformer 编码器:输入 (T, 80) # T 个时间帧,每帧 80 维梅尔特征
Conformer 编码器结构:
子采样卷积层:(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= ,
hop_length= ,
fmin= , fmax=
)
log_mel_spec = np.log(np.clip(mel_spec, a_min= ))
log_mel_spec.T
400
160
0
8000
1e-10
return
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
2. 解码 类型 CTC (连接时序分类) RNN-T (循环神经网络转换器) Attention-based Seq2Seq Transformer-based 特点 每个时间步独立预测 结合 RNN 和 CTC 编码器 - 解码器 + 注意力 纯注意力机制 优点 训练简单、推理快 流式友好,考虑上下文 效果好、适合长语音 并行计算、效果最好 缺点 假设输出独立,不考虑上下文 训练复杂,推理慢 非流式,需要看到完整语音 需要大量数据、计算资源多
def decode (self, encoder_output ):
logits = self .output_layer(encoder_output)
return best_sequence
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 ]
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 ]
3. 后处理和格式化输出
好的后处理可以让 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() 函数的时候会返回不同的结构内容。
1. 官方实现——openai-whisper / whisper.cpp 的返回结构 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
}
2. 推理优化——faster-whisper 的返回结构 faster-whisper 中使用 transcribe() 函数一般返回两个对象:生成器和信息对象。
segments, info = model.transcribe("audio.mp3" )
print (info.__dict__)
for segment in segments:
print (segment.__dict__)
3. 功能增强——whisperX 的返回结构 result = {
"segments" : [
{
"start" : 0.0 ,
"end" : 4.0 ,
"text" : "你好," ,
"words" : [
{ "word" : "你" , "start" : 0.0 , "end" : 0.2 , "score" : 0.95 , "speaker" : None }
]
}
],
"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, chunksGPU 利用率高 HF 格式 whisperX dict segments, word_segments词级对齐,说话人分离 同官方
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online