跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

ASR 自动语音识别技术与 Whisper 模型详解

综述由AI生成自动语音识别(ASR)的基本架构,包括特征提取、编码与解码流程。详细对比了 CTC、RNN-T 及 Transformer 等解码方式,并阐述了后处理的重要性。重点讲解了 OpenAI 发布的 Whisper 开源模型及其生态系统,分析了不同工具包(openai-whisper, faster-whisper, whisperX 等)的适用场景与返回数据结构差异,为实际部署提供参考。

ArchDesign发布于 2026/4/6更新于 2026/5/2124 浏览

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 编码器:
    1. 子采样卷积层:(T, 80) → (T/4, 512)
    2. 位置编码:加入时序信息
    3. N 个 Conformer Block:
      • 前馈网络(Feed Forward)
      • 多头自注意力(Multi-Head Self-Attention)
      • 卷积模块(捕捉局部特征)
      • 残差连接 + 层归一化 输出:(T/4, 512) # 高层声学表示
def mel_filter_bank(magnitude_spectrum, sr=16000, n_mels=80): 
    # 1. 创建梅尔尺度滤波器
    mel_filters = librosa.filters.mel(sr=sr, n_fft=512, n_mels=n_mels) 
    # 2. 应用滤波器组
    mel_spectrum = np.dot(magnitude_spectrum, mel_filters.T) 
    # 3. 取对数(人耳对声音强度的感知是对数的)
    log_mel_spectrum = np.log(mel_spectrum + 1e-10) 
    return log_mel_spectrum # shape: (帧数,80)
# 梅尔频率:模拟人耳听觉特性
# 低频分辨率高,高频分辨率低
# 现代 ASR(如 Whisper)直接使用梅尔频谱图
def extract_mel_spectrogram(audio, sr=16000):
    mel_spec = librosa.feature.melspectrogram(
        y=audio, sr=sr, n_mels=80, # Whisper 使用 80 维
        n_fft=400, # 400 个样本(25ms)
        hop_length=160, # 160 个样本(10ms)
        fmin=0, fmax=8000
    )
    log_mel_spec = np.log(np.clip(mel_spec, a_min=1e-10))
    return log_mel_spec.T # shape: (时间帧数,80)
def compute_mfcc(log_mel_spectrum, n_mfcc=13):
    # 离散余弦变换(DCT)
    mfcc = dct(log_mel_spectrum, type=2, axis=1, norm='ortho')
    mfcc = mfcc[:, :n_mfcc] # 取前 13 个系数
    return mfcc # shape: (帧数,13)
# MFCC 包含:
# 0 阶:能量
# 1-2 阶:谱斜率
# 3-13 阶:谱包络细节
2、解码

解码器类型比较

解码类型CTCRNN-TAttention-based Seq2SeqTransformer-based
全称连接时序分类循环神经网络转换器基于注意力的序列到序列基于 Transformer
特点每个时间步独立预测结合 RNN 和 CTC编码器 - 解码器 + 注意力纯注意力机制
优点训练简单、推理快流式友好,考虑上下文效果好、适合长语音并行计算、效果最好
缺点假设输出独立,不考虑上下文训练复杂,推理慢非流式,需要看到完整语音需要大量数据、计算资源多

CTC、解码过程详解

# CTC class CTC_Decoder:
def decode(self, encoder_output):
    # 1. 每个时间步独立预测
    # encoder_output shape: (T, 512)
    logits = self.output_layer(encoder_output) # (T, vocab_size)
    # 2. 得到每个时间步的字符概率
    # 例如:T=100 个时间步,每个步有 5000 个字符的概率
    # 3. 移除重复字符和空白符
    # 原始:- a a - - b b - c c → "a b c"
    # 空白符"-"表示静音或过渡
    # 4. 选择概率最高的序列
    return best_sequence

# Attention Seq2Seq class AttentionDecoder:
def decode(self, encoder_output):
    # 初始化
    hidden = init_hidden()
    output = ["<sos>"] # 开始标记
    # 自回归生成
    for step in range(max_length):
        # 1. 当前输出词转向量
        embed = self.embedding(output[-1])
        # 2. 注意力机制
        # 计算注意力权重:哪些音频帧对当前词最重要
        attn_weights = softmax(
            self.attention(query=hidden, key=encoder_output)
        )
        # 3. 上下文向量(加权和)
        context = sum(attn_weights[i] * encoder_output[i] for i in range(T))
        # 4. 解码器 RNN
        hidden = self.decoder_rnn(embed, hidden, context)
        # 5. 预测下一个词
        next_word_probs = softmax(
            self.output_projection(hidden)
        )
        # 6. 选择最可能的词
        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):
    # 1. 初始化:开始标记
    tokens = [self.sos_token]
    # 2. 自回归生成
    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):
    # 1. 标点恢复
    text = add_punctuation(raw_text) # "你好我是语音助手" → "你好,我是语音助手。"
    # 2. 大小写恢复
    text = restore_capitalization(text) # "i live in beijing" → "I live in Beijing"
    # 3. 数字标准化
    text = normalize_numbers(text) # "一二三" → "123"
    # "two hundred" → "200"
    # 4. 口语化处理
    text = normalize_spoken_text(text) # "gonna" → "going to"
    # "um", "ah" → 删除
    # 5. 专有名词校正
    text = correct_proper_nouns(text) # "open ai" → "OpenAI"
    # 6. 空格规范化
    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 表示每个词/字的信息。

result = { 
    "text": "完整文本,所有分段合并", # 最常用的结果 
    "segments": [ # 最重要的部分,包含详细分段信息 
        { 
            "id": 0, # 分段序号 
            "seek": 0, # 在音频中的搜索位置(秒) 
            "start": 0.0, # 开始时间(秒) 
            "end": 4.0, # 结束时间(秒) 
            "text": "你好,", # 该段落的文本 
            # 🔬 解码质量指标(判断准确性) 
            "avg_logprob": -0.2, # 平均对数概率:-1(差)~ 0(完美) 
            "no_speech_prob": 0.02, # 无语音概率:0(是语音)~1(不是语音) 
            "compression_ratio": 1.2, # 压缩比:>2.4 可能有问题 
            "temperature": 0.0, # 解码温度 
            # 🔢 技术细节 
            "tokens": [50364, 1234, ...], # 该段的 token 序列 
            # 🆕 large-v3 新增(需要 word_timestamps=True) 
            "words": [ # 词级时间戳 
                { 
                    "word": "你", # 单个词/字 
                    "start": 0.0, # 词开始时间 
                    "end": 0.2, # 词结束时间 
                    "probability": 0.95 # 词置信度 
                } 
            ] 
        } 
    ], 
    "language": "zh" # 检测到的语言(ISO 639-1 代码) 
}

whisper.cpp 返回 json 格式,以下是返回示例:transcription 表示转录文本

{
    "transcription": [
        { 
            "timestamps": { 
                "from": "00:00:00,000", # SRT 格式时间戳 
                "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") 
# 📊 info 对象(TranscriptionInfo)
print(info.__dict__) # {
#     'language': 'zh', # 检测语言
#     'language_probability': 0.98, # 语言检测置信度
#     'duration': 30.5, # 音频时长
#     'all_language_probs': { # 所有语言概率
#         'zh': 0.98, 'en': 0.01, ...
#     },
#     'transcription_time': 2.3, # 转录耗时(秒)
#     'initial_prompt': None # 初始提示词
# }
# 🔄 segments 生成器(迭代获取 Segment 对象)
for segment in segments:
    print(segment.__dict__) # {
#     'start': 0.0, # 开始时间
#     'end': 4.0, # 结束时间
#     'text': '你好,', # 文本
#     # 可选(word_timestamps=True 时)
#     'words': [ # Word(start=0.0, end=0.2, word='你', probability=0.95),
#         Word(start=0.0, end=0.2, word='你', probability=0.95),
#         Word(start=0.2, end=0.4, word='好', probability=0.92)
#     ]
# }
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-whisperdicttext, segments, language官方实现,功能完整返回语言代码
faster-whispertuple + Generator(segments_generator, info)速度快,内存小包含概率值
whisper.cppJSON/文本各种自定义格式可嵌入式部署需要参数指定
whisper-jaxdicttext, chunksGPU 利用率高HF 格式
whisperXdictsegments, word_segments词级对齐,说话人分离同官方

目录

  1. 一、ASR
  2. 1、特征提取与编码
  3. 梅尔频率:模拟人耳听觉特性
  4. 低频分辨率高,高频分辨率低
  5. 现代 ASR(如 Whisper)直接使用梅尔频谱图
  6. MFCC 包含:
  7. 0 阶:能量
  8. 1-2 阶:谱斜率
  9. 3-13 阶:谱包络细节
  10. 2、解码
  11. CTC class CTC_Decoder:
  12. Attention Seq2Seq class AttentionDecoder:
  13. Transformer 解码器(如 Whisper)class TransformerDecoder:
  14. 3、后处理和格式化输出
  15. 二、Whisper
  16. 1、官方实现——openai-whisper/whisper.cpp 的返回结构
  17. 2、推理优化——faster-whisper 的返回结构
  18. 返回两个对象:生成器和信息对象
  19. 📊 info 对象(TranscriptionInfo)
  20. 'language': 'zh', # 检测语言
  21. 'language_probability': 0.98, # 语言检测置信度
  22. 'duration': 30.5, # 音频时长
  23. 'alllanguageprobs': { # 所有语言概率
  24. 'zh': 0.98, 'en': 0.01, ...
  25. },
  26. 'transcription_time': 2.3, # 转录耗时(秒)
  27. 'initial_prompt': None # 初始提示词
  28. }
  29. 🔄 segments 生成器(迭代获取 Segment 对象)
  30. 'start': 0.0, # 开始时间
  31. 'end': 4.0, # 结束时间
  32. 'text': '你好,', # 文本
  33. # 可选(word_timestamps=True 时)
  34. 'words': [ # Word(start=0.0, end=0.2, word='你', probability=0.95),
  35. Word(start=0.0, end=0.2, word='你', probability=0.95),
  36. Word(start=0.2, end=0.4, word='好', probability=0.92)
  37. ]
  38. }
  39. 3、功能增强——whisperX 的返回结构
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Elasticsearch 全文搜索与数据分析实战指南
  • Code Llama 代码生成模型快速上手与实用技巧
  • 使用 UI UX Pro Max 构建现代前端 UI 工作流
  • LangChain 消息处理:缓存、过滤、合并与流式输出
  • AI 驱动的前端开发新范式:从工具辅助到智能重构
  • 将 Zed 编辑器集成到 Bright Data Web MCP
  • 使用 Vue.js 构建 Java 桌面应用
  • OpenClaw 开源 AI 助手部署与使用指南
  • 生产级 AI Agent 框架设计与实战
  • 青少年机器人编程系统化学习路径:从机械启蒙到人工智能
  • Qwen3-Embedding-4B 基于 llama.cpp 的集成部署教程
  • 企业级招聘数据采集:基于 Bright Data AI Studio 的自动化爬虫方案
  • Raphael AI:基于 Flux 模型的免费图像生成工具评测
  • 单机多节点搭建 RabbitMQ 集群详解
  • 本地 LLM 模型与 Ollama 及 Python 集成实战
  • Web3 入门:从比特币到以太坊智能合约
  • GitHub 日榜速递:AI 智能体与边缘计算新趋势
  • Spring 事务管理与传播机制详解
  • OpenClaw 架构解析:AI 从认知到行动的实践路径
  • 设计支持万人并发抢购的秒杀系统架构方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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