Distil Whisper:更快、更小、更智能的语音转文本利器

本文深入探讨了 Distil Whisper,这是 OpenAI Whisper 模型的一个轻量级版本。它通过知识蒸馏技术实现了高达 6 倍的推理速度提升和 49% 的模型体积减小,同时保持了高准确性。文章详细介绍了其技术创新、架构、功能以及如何通过代码进行短格式、长格式音频转录和推测解码,为开发者提供了高效且经济的语音识别解决方案。

阅读时长: 10 分钟
共 4539字
作者: eimoon.com

在当前的深度学习浪潮中,文本转语音(TTS)和语音识别(ASR)技术扮演着至关重要的角色。OpenAI 推出的 Whisper 模型作为一款开源的 ASR 模型,凭借其媲美生产级模型的卓越性能和免费使用的特性,迅速赢得了广泛关注。然而,在追求效率和资源优化的道路上,总有进一步探索的空间。

今天,我们将聚焦于最近发布的 Distil Whisper 项目,这是一个基于 Whisper 模型构建的轻量级版本。它在保持高准确性的同时,实现了惊人的 6 倍运行速度提升,为实时和大规模转录任务带来了革新。

Distil Whisper 的核心优势与技术亮点

Distil Whisper 的诞生,旨在解决原始 Whisper 模型在某些场景下对计算资源需求较高的问题,通过一系列创新技术,实现了性能与效率的完美平衡:

1. 卓越的性能与效率提升

  • 模型体积减小:Distil Whisper 比原始 Whisper 模型小 49%,大幅降低了存储和部署成本。
  • 推理速度飞跃:推理时间比原始 Whisper 模型快 6 倍,这使其非常适合需要低延迟的实时应用和大规模的离线转录任务。
  • 硬件灵活性:不仅支持 GPU 加速,也在 CPU 上表现出色,并在 CUDA 兼容硬件上提供优化性能。

2. 严谨的准确性保障

  • 准确性保持:在非分布音频数据集上,其词错误率(WER)与原始 Whisper 模型相比,仅有不到 1% 的微小差距,几乎不影响转录质量。
  • 增强鲁棒性:重复词语的重复次数减少了 1.3 倍,插入错误率(IER)降低了 2.1%,这意味着在处理嘈杂音频时,Distil Whisper 能更好地抵抗噪声干扰并减少“幻觉”现象,提供更干净、准确的转录结果。

3. 创新的技术基石

Distil Whisper 采用了以下前沿技术来实现其卓越性能:

  • 分层压缩:通过复制教师模型中间隔最远层的权重来初始化学生模型,实现高效的分层压缩。
  • 伪标签(Pseudo-labeling):利用教师模型生成大量高质量的伪标签数据,作为学生模型的训练依据。
  • Kullback-Leibler 散度(KL Divergence):通过最小化学生模型与教师模型输出的 KL 散度,在词级别上精确地将教师模型的知识传递给学生模型。
  • 训练数据:在超过 22,000 小时的伪标签音频数据上进行训练,涵盖 10 个领域和 18,000 多个说话者,确保了模型的泛化能力。

4. 商业友好的许可与无缝集成

  • 商业许可:Distil Whisper 可用于商业应用和生产环境,为企业提供了强大的 ASR 解决方案。
  • 无缝集成:与 Hugging Face Transformers 库完美协同工作,能够轻松集成到现有的音频处理管道中,降低了开发者的使用门槛。

5. 针对不同场景的优化

  • 短格式转录优化:针对短格式(30 秒以下)音频提供高效的转录能力。
  • 长格式转录算法:为长音频转录提供了高效的分块算法,通过识别重叠部分之间的最长公共序列来连接文本,确保了长音频转录的精确性和连贯性。

前置条件

在开始使用 Distil Whisper 之前,请确保您的环境满足以下要求:

  • 安装 Python 3.8+ 版本。
  • 安装 PyTorch 2.0+ 版本(支持 CUDA 可用于 GPU 加速)。
  • 安装必要的 Python 依赖:
    pip install transformers datasets torchaudio
    
  • 熟悉 Whisper 模型和音频处理基础知识将有助于更好地理解和使用 Distil Whisper。

什么是知识蒸馏(Knowledge Distillation, KD)?

知识蒸馏(KD)是一种强大的模型压缩技术,旨在将一个大型、复杂“教师”模型(Teacher Model)的知识迁移到一个小型、计算效率更高的“学生”模型(Student Model)中,以在不显著牺牲性能的前提下实现模型瘦身。

在 Distil Whisper 的案例中,原始的 Whisper 模型充当“教师”模型,而 Distil Whisper 则是“学生”模型。两者都采用了经典的 Seq2Seq 架构,但在模型维度和复杂性上有所不同。知识蒸馏的核心在于,学生模型通过模仿教师模型的行为,学习其内在的表示和决策逻辑,从而获得接近教师模型的性能。

Distil Whisper 的知识蒸馏策略

Distil Whisper 模型通过以下关键策略实现了高效的压缩和知识迁移:

  1. 收缩与微调(Shrink and Fine-tune): Distil Whisper 采用了一种巧妙的初始化方法——通过复制教师模型中间隔最远层的权重来初始化学生模型。这种分层压缩(Hierarchical Compression)的方式,使得学生模型在训练开始时就具备了良好的初始状态,加速了学习过程。

  2. 伪标签(Pseudo-labeling): 知识以序列的形式传递给学生模型。具体做法是,利用训练有素的教师模型处理大量的无标签音频数据,并生成对应的文本转录作为“伪标签”。学生模型随后使用这些伪标签数据进行监督学习,从而从教师模型中学习到序列生成的能力。这种方法尤其适用于缺乏大量人工标注数据的场景。

  3. Kullback-Leibler 散度(KL Divergence): 为了实现“词级别”的知识蒸馏,Distil Whisper 通过最小化学生模型的完整概率分布与教师模型的概率分布之间的 KL 散度进行训练。这意味着学生模型不仅要学会预测正确的词,还要学会模仿教师模型对每个词的预测置信度分布,从而更精细地捕捉教师模型的知识。

Distil Whisper 正是融合了上述策略,使其在保持高性能的同时,实现了 6 倍的速度提升和 49% 的体积减小,在非分布评估集上的词错误率(WER)差异在 1% 以内。其训练目标是最小化蒸馏模型与 Whisper 模型之间的 KL 散度,以及在伪标签音频数据上计算的交叉熵损失。

Distil Whisper 的架构亮点

Distil Whisper 的架构设计是其高效能的关键:

  • 编码器模块:Distil Whisper 的编码器模块完全复制自教师模型(即原始 Whisper 模型),并在整个训练期间保持固定。这意味着它继承了 Whisper 强大的音频特征提取能力。
  • 解码器模块:学生模型的解码器只包含两个解码器层,它们分别初始化自教师模型的起始解码器层和最终解码器层。这种精简的解码器设计,大大减少了模型的参数量和计算复杂度。
  • 训练目标:模型通过 KL 散度项和伪标签(PL)损失项的加权组合进行训练。
  • 推理过程:在推理时,模型能够根据音频的潜在编码以及已经生成的文本,顺序地识别下一个最可能的 Token。

功能特性一览

Distil-Whisper 旨在成为 Whisper 模型的高效替代品,特别适用于英语语音识别场景,其主要功能包括:

  • 更快的推理速度:推理速度提升 6 倍,同时在非分布音频上的 WER 性能与 Whisper 仅相差 1% 以内。
  • 对噪声和幻觉的鲁棒性:与原始 Whisper 相比,重复 5-gram 词语副本减少 1.3 倍,插入错误率(IER)降低 2.1%,显著减少了幻觉现象,提供更可靠的转录结果。
  • 为推测解码(Speculative Decoding)而设计:Distil Whisper 可以作为 Whisper 的辅助模型,将推理速度提升两倍,同时在数学上保证输出结果与原始 Whisper 模型完全一致。
  • 商业许可:Distil-Whisper 在商业许可下可用,使得企业可以放心地将其集成到自己的产品和服务中。

快速上手:代码演示

下面我们将通过代码演示如何使用 Distil Whisper 模型进行音频转录。

1. 安装依赖

首先,确保您的环境安装了最新的 pip,并安装 transformersacceleratedatasets[audio] 等核心库。

!pip install --upgrade pip
!pip install --upgrade transformers accelerate datasets[audio]

2. 短格式转录(小于 30 秒)

对于较短的音频片段,Distil Whisper 可以快速提供转录结果。

加载模型和处理器

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline

# 检查CUDA是否可用,否则使用CPU
device = "cuda:0" if torch.cuda.is_available() else "cpu"
# 根据设备设置浮点精度
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32

# 指定Distil Whisper模型ID
model_id = "distil-whisper/distil-large-v2"

# 从预训练模型加载Distil Whisper模型
model = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id, 
    torch_dtype=torch_dtype, 
    low_cpu_mem_usage=True, 
    use_safetensors=True # 使用更安全的safetensors格式加载
)
# 将模型移动到指定设备
model.to(device)

# 加载对应的处理器(tokenizer和feature_extractor)
processor = AutoProcessor.from_pretrained(model_id)

创建转录管道

Hugging Face pipeline 提供了一个高级接口,简化了模型的使用。

pipe = pipeline(
    "automatic-speech-recognition", # 指定任务类型
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128, # 设置生成文本的最大长度
    torch_dtype=torch_dtype,
    device=device,
)

加载并转录音频

这里我们使用 datasets 库中的一个虚拟数据集作为示例。

from datasets import load_dataset

# 加载测试数据集中的一个音频样本
dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
sample = dataset[0]["audio"]

# 调用管道进行转录
result = pipe(sample)
print(result["text"])
# 预期输出: A MAN SAID TO THE UNIVERSE SIR I EXIST

转录本地音频文件

您也可以轻松转录本地的音频文件(如 .mp3, .wav 等)。

# 假设您有一个名为 "path_to_the_audio.mp3" 的本地文件
# result = pipe("path_to_the_audio.mp3")
# print(result["text"])

3. 长格式转录(大于 30 秒)

对于长音频文件,Distil Whisper 提供了分块处理机制,以优化性能和内存使用。

创建支持分块的管道

加载模型和处理器与短格式相同。关键在于在 pipeline 中设置 chunk_length_s 参数。

# pipe = pipeline(
#     "automatic-speech-recognition",
#     model=model,
#     tokenizer=processor.tokenizer,
#     feature_extractor=processor.feature_extractor,
#     max_new_tokens=128,
#     chunk_length_s=15, # 设置音频分块长度,建议至少15秒
#     batch_size=16,      # 激活批处理以进一步提升长音频转录速度
#     torch_dtype=torch_dtype,
#     device=device,
# )

# 重新初始化pipe,以确保chunking生效
pipe = pipeline(
    "automatic-speech-recognition",
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128,
    chunk_length_s=15, # 设置分块长度为15秒
    batch_size=16, # 批处理大小
    torch_dtype=torch_dtype,
    device=device,
)

转录长音频文件

# 假设您有一个名为 "your_long_audio.mp3" 的长音频文件
# result = pipe('/path/to/your_long_audio.mp3')
# print(result["text"])

格式化输出

为了更好地阅读长篇转录文本,您可以使用 textwrap 库进行格式化。

import textwrap

wrapper = textwrap.TextWrapper(width=80, # 每行最大宽度
    initial_indent=" " * 8, # 首行缩进
    subsequent_indent=" " * 8, # 后续行缩进
    break_long_words=False, # 不在单词中间断行
    break_on_hyphens=False) # 不在连字符处断行

# 假设 result["text"] 是您长音频的转录结果
# print(wrapper.fill(result["text"]))

4. 推测解码(Speculative Decoding, SD)

推测解码是一种加速自回归模型推理的技术,它利用一个小型辅助模型(学生模型)预测序列,然后由大型主模型(教师模型)快速验证。Distil Whisper 正是设计用于作为 Whisper 的辅助模型,实现推理加速且不损失准确性。

加载教师模型 (openai/whisper-large-v2) 和处理器

from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
import torch

device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32

# 加载原始的Whisper-large-v2作为教师模型
model_id = "openai/whisper-large-v2"

model = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)

processor = AutoProcessor.from_pretrained(model_id)

加载学生模型 (distil-whisper/distil-large-v2)

这里,Distil Whisper 被用作辅助模型,仅需加载其解码器部分。

from transformers import AutoModelForCausalLM
assistant_model_id = "distil-whisper/distil-large-v2"

# 加载Distil Whisper作为辅助模型,注意这里使用AutoModelForCausalLM
assistant_model = AutoModelForCausalLM.from_pretrained(
    assistant_model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
assistant_model.to(device)

创建管道并启用推测解码

pipeline 中将学生模型作为 generate_kwargs={"assistant_model": assistant_model} 参数传入。

pipe = pipeline(
    "automatic-speech-recognition",
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128,
    generate_kwargs={"assistant_model": assistant_model}, # 传入辅助模型
    torch_dtype=torch_dtype,
    device=device,
)

转录样本

from datasets import load_dataset

dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
sample = dataset[0]["audio"]

result = pipe(sample)
print(result["text"])
# 预期输出: A MAN SAID TO THE UNIVERSE SIR I EXIST

5. 性能优化

为了进一步提升性能,您可以使用以下优化技术:

  • Flash Attention 2: 安装 flash-attn 库 (pip install flash-attn --no-build-isolation),然后在 from_pretrained 函数中添加 use_flash_attention_2=True 参数。这可以显著加速注意力机制的计算。

  • BetterTransformers: 安装 optimum 库 (pip install --upgrade optimum)。然后将模型转换为 BetterTransformers 格式:

    # model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True)
    # model = model.to_bettertransformer()
    

    这将利用 BetterTransformers 提供的优化,进一步提升推理效率。

常见问题 (FAQ)

1. Distil Whisper 与原始 Whisper 模型有何不同?

Distil Whisper 是 Whisper 的蒸馏版本,旨在保持大部分性能的同时,实现更小的体积和更快的推理速度。它针对速度和效率进行了优化,可实现近乎实时的转录,且无需高端 GPU 即可运行。

2. Distil Whisper 是否为了速度而牺牲了准确性?

没有显著牺牲。Distil Whisper 在速度和准确性之间取得了出色的平衡,提供了更快的转录速度,同时其准确性在各种应用中仍然极具竞争力,与原始 Whisper 模型的 WER 差异通常在 1% 以内。

3. 谁应该使用 Distil Whisper?

Distil Whisper 适用于需要可扩展转录解决方案的开发者、内容创作者和企业。例如,它非常适合构建实时字幕工具、转录播客内容、生成多语言字幕或任何对语音识别速度和资源效率有较高要求的场景。

4. Distil Whisper 能处理多语言转录吗?

是的,与原始 Whisper 模型一样,Distil Whisper 也支持多种语言。这使得它对于国际化应用具有很高的价值。

5. 如何开始使用 Distil Whisper?

您可以通过 Hugging Face Transformers 库轻松获取和使用 Distil Whisper。它通过最少的设置即可集成到现有工作流中,可以在本地机器或云平台上运行,即使在性能较低的 GPU 上也能良好运行,对初学者友好且经济高效。

结语

Distil-Whisper 作为 Whisper 的蒸馏加速版本,其性能表现令人印象深刻,是开发和测试各种语音应用的出色选择。尤其是在处理非分布长格式音频时,它超越了 Whisper,有效减少了幻觉和重复现象。这充分证明了大规模伪标签结合 WER 阈值过滤在蒸馏 ASR 模型方面的强大有效性。

通过本文的介绍和代码演示,我们希望您能了解如何使用 Distil-Whisper 无缝地转录英语短格式和长格式音频,并将其集成到您的项目中,从而加速您的语音应用开发。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计