深入了解语音识别:Distil-Whisper

Distil-Whisper模型概述

1.1 Distil-Whisper的背景与意义

随着语音识别技术的不断发展,模型的大小和计算复杂度成为了制约其广泛应用的重要因素。特别是在边缘设备和实时应用场景中,对模型的效率和性能提出了更高的要求。Distil-Whisper模型的提出,正是为了解决这一问题。

Distil-Whisper是基于OpenAI的Whisper模型通过知识蒸馏技术得到的轻量级版本。知识蒸馏是一种将大型模型的知识转移到小型模型的技术,通过这种方式,可以在保持较高识别精度的同时,显著减少模型的尺寸和计算需求。这使得Distil-Whisper在资源受限的环境中也能实现高效的语音识别。

1.2 Distil-Whisper与Whisper模型的比较

Distil-Whisper与原始的Whisper模型相比,具有以下显著优势:

  • 模型尺寸减少:Distil-Whisper通过知识蒸馏技术,成功地将模型尺寸减少了49%,这意味着在相同的存储空间下,可以部署更多的模型实例。
  • 计算速度提升:在保持接近Whisper模型的词错误率(WER)的同时,Distil-Whisper实现了6倍的速度提升,这对于实时语音识别应用至关重要。
  • 资源消耗降低:由于模型尺寸和计算需求的减少,Distil-Whisper在运行时所需的内存和计算资源也相应降低,这使得它更适合在边缘设备和移动设备上运行。

1.3 Distil-Whisper的主要特点

Distil-Whisper模型的主要特点可以概括为以下几点:

  • 高效性:通过知识蒸馏和大规模伪标签技术,Distil-Whisper实现了显著的模型尺寸和计算速度的优化。
  • 准确性:尽管模型尺寸大幅减少,Distil-Whisper在分布外评估集上的词错误率(WER)仍然接近Whisper模型,显示出良好的泛化能力。
  • 易用性:Distil-Whisper提供了从模型初始化、训练到评估的全过程支持,并且可以在多种平台和环境下使用,具有很高的灵活性和易用性。

通过这些特点,Distil-Whisper不仅在学术研究中具有重要价值,而且在实际应用中也展现出了巨大的潜力,特别是在对模型效率和性能有较高要求的场景中。

模型训练与初始化

2.1 伪标签生成

伪标签生成是训练Distil-Whisper模型的关键步骤之一。伪标签是通过使用预训练的Whisper模型对未标注数据进行预测生成的。这些伪标签随后被用作训练Distil-Whisper模型的目标。以下是伪标签生成的详细过程:

  1. 数据选择:选择大量未标注的音频数据。这些数据可以是公开可用的音频数据集,也可以是公司内部收集的数据。
  2. 预训练模型预测:使用预训练的Whisper模型对这些未标注的音频数据进行预测。预测结果包括音频对应的文本转录。
  3. 伪标签生成:将预测的文本转录作为伪标签。这些伪标签的质量取决于预训练模型的准确性。

伪标签生成的代码示例如下:

import torch
from transformers import WhisperForConditionalGeneration, WhisperProcessor

# 加载预训练的Whisper模型和处理器
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v2")
processor = WhisperProcessor.from_pretrained("openai/whisper-large-v2")

# 加载未标注的音频数据
audio_data = load_unlabeled_audio_data()

# 对音频数据进行预测
inputs = processor(audio_data, return_tensors="pt", sampling_rate=16000)
with torch.no_grad():
    predicted_ids = model.generate(inputs.input_values)

# 生成伪标签
pseudo_labels = processor.decode(predicted_ids[0], skip_special_tokens=True)

2.2 模型初始化过程

模型初始化是训练过程的第一步,涉及到加载预训练的权重或从头开始初始化模型参数。对于Distil-Whisper模型,通常会从一个预训练的Whisper模型开始,然后通过知识蒸馏进行进一步的训练。

以下是一个模型初始化的示例代码:

from transformers import DistilWhisperForConditionalGeneration, DistilWhisperProcessor

# 加载Distil-Whisper模型和处理器
model = DistilWhisperForConditionalGeneration.from_pretrained("distil-whisper/distil-large-v2")
processor = DistilWhisperProcessor.from_pretrained("distil-whisper/distil-large-v2")

2.3 知识蒸馏过程

知识蒸馏是Distil-Whisper模型的核心训练过程,通过这个过程,较小的Distil-Whisper模型可以从较大的Whisper模型中学习。知识蒸馏通常包括以下几个步骤:

  1. 教师模型预测:使用预训练的Whisper模型对训练数据进行预测。
  2. 学生模型训练:使用教师模型的预测结果作为目标,训练Distil-Whisper模型。

以下是一个知识蒸馏的示例代码:

import torch
from torch.utils.data import DataLoader
from transformers import Trainer, TrainingArguments

# 加载训练数据
train_dataset = load_dataset("path_to_train_dataset", split="train")

# 准备数据加载器
def prepare_features(sample):
    inputs = processor(sample["audio"]["array"], sampling_rate=sample["audio"]["sampling_rate"], return_tensors="pt")
    with torch.no_grad():
        teacher_outputs = teacher_model.generate(inputs.input_features)
    teacher_labels = processor.decode(teacher_outputs[0], skip_special_tokens=True)
    return {"input_features": inputs.input_features, "labels": teacher_labels}

train_dataset = train_dataset.map(prepare_features, batched=True)
train_dataloader = DataLoader(train_dataset, batch_size=8, shuffle=True)

# 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",
    per_device_train_batch_size=8,
    num_train_epochs=3,
    logging_dir="./logs",
)

# 初始化Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
)

# 开始训练
trainer.train()

通过上述步骤,Distil-Whisper模型可以从预训练的Whisper模型中学习,从而在保持较高性能的同时,减少模型的大小和计算需求。

模型训练

3.1 训练脚本的使用

训练Distil-Whisper模型需要使用特定的训练脚本。以下是训练脚本的基本使用方法:

  1. 安装必要的库

    pip install --upgrade pip
    pip install --upgrade transformers accelerate datasets[audio]
    
  2. 下载训练脚本
    训练脚本通常可以在Transformers库的GitHub仓库中找到。你可以通过克隆仓库或直接下载特定脚本来获取这些脚本。

  3. 运行训练脚本
    一旦安装了必要的库并获取了训练脚本,你可以通过命令行运行脚本来开始训练过程。例如:

    python train_distil_whisper.py
    

3.2 数据集的加载和处理

在训练Distil-Whisper模型时,数据集的加载和处理是非常关键的步骤。以下是加载和处理数据集的一般步骤:

  1. 加载数据集
    使用Hugging Face的datasets库可以方便地加载各种音频数据集。例如,加载LibriSpeech数据集:

    from datasets import load_dataset
    
    dataset = load_dataset("librispeech_asr", "clean", split="train")
    
  2. 预处理数据
    数据预处理包括音频的采样率调整、分段、归一化等操作。可以使用Transformers库中的AutoProcessor来进行这些操作:

    from transformers import AutoProcessor
    
    processor = AutoProcessor.from_pretrained("distil-whisper/distil-large-v3")
    dataset = dataset.map(lambda x: processor(x["audio"]["array"], sampling_rate=x["audio"]["sampling_rate"]), batched=True)
    

3.3 训练参数的配置

训练参数的配置对于模型的训练效果至关重要。以下是一些常见的训练参数及其配置方法:

  1. 批量大小
    批量大小(batch size)决定了每次迭代中使用的样本数量。较大的批量大小可以提高训练速度,但也需要更多的内存。

    per_device_train_batch_size = 8
    per_device_eval_batch_size = 8
    
  2. 学习率
    学习率(learning rate)决定了模型权重更新的步长。合适的学习率可以加速收敛并提高模型性能。

    learning_rate = 3e-5
    
  3. 训练轮数
    训练轮数(num_train_epochs)决定了模型在整个训练集上迭代的次数。

    num_train_epochs = 3
    
  4. 梯度累积步骤
    梯度累积步骤(gradient_accumulation_steps)可以在不增加内存消耗的情况下模拟更大的批量大小。

    gradient_accumulation_steps = 2
    

3.4 多GPU训练的实现

在多GPU环境下训练Distil-Whisper模型可以显著提高训练速度。以下是实现多GPU训练的基本步骤:

  1. 安装必要的库
    确保你已经安装了PyTorch以及相关的多GPU支持库。

    pip install torch torchvision torchaudio
    
  2. 配置多GPU环境
    在训练脚本中,使用PyTorch的torch.distributed模块来配置多GPU环境。例如:

    import torch.distributed as dist
    from torch.nn.parallel import DistributedDataParallel as DDP
    
    def train(local_rank):
        dist.init_process_group(backend='nccl', init_method='env://')
        torch.cuda.set_device(local_rank)
    
        model = AutoModelForSpeechSeq2Seq.from_pretrained("distil-whisper/distil-large-v3")
        model.to(local_rank)
        model = DDP(model, device_ids=[local_rank])
    
        # 训练代码...
    
    if __name__ == "__main__":
        import argparse
        parser = argparse.ArgumentParser()
        parser.add_argument("--local_rank", type=int)
        args = parser.parse_args()
        train(args.local_rank)
    
  3. 启动多GPU训练
    使用torch.distributed.launchtorchrun命令来启动多GPU训练。例如:

    torchrun --nproc_per_node=4 train.py
    

通过上述步骤,你可以在多GPU环境下高效地训练Distil-Whisper模型,从而加速训练过程并提高模型性能。

模型评估

4.1 评估脚本的使用

评估Distil-Whisper模型的性能是确保其在实际应用中表现良好的关键步骤。以下是如何使用评估脚本的详细步骤:

  1. 安装必要的库
    首先,确保你已经安装了所有必要的库,包括transformersdatasetsevaluatejiwer。你可以通过以下命令进行安装:

    pip install --upgrade pip
    pip install --upgrade transformers datasets[audio] evaluate jiwer
    
  2. 加载模型和处理器
    使用AutoModelForSpeechSeq2SeqAutoProcessor类来加载Distil-Whisper模型和处理器。

    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
    model_id = "distil-whisper/distil-large-v3"
    
    model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, use_safetensors=True, low_cpu_mem_usage=True)
    model = model.to(device)
    processor = AutoProcessor.from_pretrained(model_id)
    
  3. 加载数据集
    使用datasets库加载LibriSpeech的验证集,并设置为流式模式以避免下载大量音频数据。

    from datasets import load_dataset
    
    dataset = load_dataset("librispeech_asr", "clean", split="validation", streaming=True)
    
  4. 定义评估函数
    定义一个评估函数,该函数将批量数据进行预处理、推理并生成转录文本。

    from evaluate import load
    from tqdm import tqdm
    
    wer_metric = load("wer")
    
    def inference(batch):
        audio = [sample["array"] for sample in batch["audio"]]
        input_features = processor(audio, sampling_rate=batch["audio"][0]["sampling_rate"], return_tensors="pt").input_features
        input_features = input_features.to(device, dtype=torch_dtype)
        pred_ids = model.generate(input_features, max_new_tokens=128)
        batch["transcription"] = processor.batch_decode(pred_ids, skip_special_tokens=True)
        batch["reference"] = batch["text"]
        return batch
    
  5. 运行评估
    使用map函数对数据集进行批量推理,并计算词错误率(WER)。

    dataset = dataset.map(inference, batched=True, batch_size=16)
    all_transcriptions = []
    all_references = []
    
    for result in tqdm(dataset):
        all_transcriptions.append(result["transcription"])
        all_references.append(result["reference"])
    
    wer = wer_metric.compute(predictions=all_transcriptions, references=all_references)
    print(f"WER: {wer}")
    

4.2 不同类型评估的介绍

在评估Distil-Whisper模型时,可以进行多种类型的评估以全面了解其性能:

  • 准确性评估:通过计算词错误率(WER)来衡量模型的转录准确性。WER越低,模型的准确性越高。
  • 速度评估:评估模型在不同硬件上的推理速度,包括CPU和GPU上的推理时间。
  • 鲁棒性评估:在包含噪声或不同口音的数据集上评估模型的性能,以确保模型在实际应用中的鲁棒性。
  • 分布外(OOD)评估:在不同于训练数据分布的数据集上评估模型的性能,以确保模型的泛化能力。

4.3 评估指标的解释

在评估Distil-Whisper模型时,常用的评估指标包括:

  • 词错误率(WER):衡量模型转录结果与参考文本之间的差异,计算公式为:
    [
    WER = \frac{S + D + I}{N}
    ]
    其中,(S) 是替换错误数,(D) 是删除错误数,(I) 是插入错误数,(N) 是参考文本中的词数。

  • 字符错误率(CER):类似于WER,但计算的是字符级别的错误。

  • 推理时间:衡量模型在特定硬件上的推理速度。通常以每秒处理的音频时长(秒/秒)来表示。

4.4 模型在不同数据集上的表现

Distil-Whisper模型在不同数据集上的表现如下:

  • LibriSpeech:在LibriSpeech数据集上,Distil-Whisper模型的WER通常在5%以下,显示出良好的准确性。
  • Common Voice:在Common Voice数据集上,Distil-Whisper模型的WER在多语言环境下也表现出色,显示出其对不同语言的适应能力。
  • TED-LIUM:在TED-LIUM数据集上,Distil-Whisper模型的WER在处理长格式音频时表现良好,显示出其在长音频转录中的优势。

通过在不同数据集上的评估,可以全面了解Distil-Whisper模型的性能,并确保其在实际应用中的可靠性和准确性。

Distil-Whisper的使用方法

5.1 安装与配置

在使用Distil-Whisper模型之前,首先需要进行安装和配置。以下是详细的步骤:

安装依赖库
  1. 安装Transformers库

    pip install --upgrade transformers
    
  2. 安装加速库和音频处理库

    pip install --upgrade accelerate datasets[audio]
    
配置环境
  1. 设置GPU(如果可用):

    import torch
    
    device = "cuda" if torch.cuda.is_available() else "cpu"
    
  2. 设置日志级别(可选):

    import logging
    
    logging.basicConfig(level=logging.INFO)
    

5.2 短格式音频转录

对于短格式音频,Distil-Whisper可以快速进行转录。以下是一个示例代码:

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset

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

model_id = "distil-whisper/distil-medium.en"
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)

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)

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

result = pipe(sample)
print(result["text"])

5.3 长格式音频转录

对于长格式音频,Distil-Whisper使用分块算法进行转录。以下是启用分块和批处理的示例代码:

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset

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

model_id = "distil-whisper/distil-medium.en"
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)

pipe = pipeline("automatic-speech-recognition", model=model, tokenizer=processor.tokenizer, feature_extractor=processor.feature_extractor, max_new_tokens=128, chunk_length_s=15, batch_size=16, torch_dtype=torch_dtype, device=device)

dataset = load_dataset("distil-whisper/librispeech_long", "default", split="validation")
sample = dataset[0]["audio"]

result = pipe(sample)
print(result["text"])

5.4 推测解码

Distil-Whisper可以作为Whisper模型的助手模型,用于推测解码。以下是使用推测解码的示例代码:

from transformers import pipeline, AutoModelForCausalLM, AutoModelForSpeechSeq2Seq, AutoProcessor
import torch
from datasets import load_dataset

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

assistant_model_id = "distil-whisper/distil-medium.en"
assistant_model = AutoModelForCausalLM.from_pretrained(assistant_model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True)
assistant_model.to(device)

model_id = "openai/whisper-medium.en"
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)

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)

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

result = pipe(sample)
print(result["text"])

通过以上步骤,您可以在不同的场景下使用Distil-Whisper模型进行音频转录和推测解码。

性能优化与改进

在语音识别领域,模型的性能优化是提高效率和减少资源占用的关键。Distil-Whisper通过采用多种优化技术,如Flash Attention和Torch Scale-Product-Attention (SDPA),显著提升了模型的处理速度和内存使用效率。以下是这些优化技术的详细介绍。

6.1 Flash Attention

Flash Attention是一种高效的注意力机制实现,旨在减少传统注意力计算中的内存占用和计算复杂度。通过优化内存访问模式和计算流程,Flash Attention能够在保持模型性能的同时,显著提升处理速度。

实现步骤
  1. 安装依赖

    pip install flash-attn
    
  2. 修改模型配置
    在模型配置文件中,将注意力机制的实现方式更改为Flash Attention。

    from flash_attn import FlashAttention
    
    class MyModel(nn.Module):
        def __init__(self):
            super(MyModel, self).__init__()
            self.attention = FlashAttention()
    
  3. 训练和评估
    使用修改后的模型进行训练和评估,观察性能提升。

6.2 Torch Scale-Product-Attention (SDPA)

Torch Scale-Product-Attention (SDPA)是PyTorch库中的一种高效注意力计算方法。它通过优化矩阵乘法和缩放操作,减少了计算过程中的内存占用和计算时间。

实现步骤
  1. 安装PyTorch
    确保已安装最新版本的PyTorch。

    pip install torch
    
  2. 使用SDPA
    在模型代码中,使用SDPA替换传统的注意力计算方法。

    import torch
    from torch.nn.functional import scaled_dot_product_attention
    
    class MyModel(nn.Module):
        def __init__(self):
            super(MyModel, self).__init__()
            self.attention = scaled_dot_product_attention
    
  3. 训练和评估
    使用SDPA优化后的模型进行训练和评估,比较性能变化。

6.3 其他速度和内存改进

除了Flash Attention和SDPA,Distil-Whisper还采用了多种其他优化技术来进一步提升模型的速度和内存效率。

具体措施
  1. 梯度检查点
    通过梯度检查点技术,减少训练过程中的内存占用。

    from torch.utils.checkpoint import checkpoint
    
    class MyModel(nn.Module):
        def forward(self, x):
            return checkpoint(self.layer, x)
    
  2. 混合精度训练
    使用混合精度训练,减少内存占用并加速计算。

    from torch.cuda.amp import autocast
    
    with autocast():
        output = model(input)
    
  3. 数据加载优化
    优化数据加载过程,减少I/O等待时间。

    from torch.utils.data import DataLoader
    
    dataloader = DataLoader(dataset, batch_size=32, num_workers=4)
    

通过这些优化措施,Distil-Whisper不仅在处理速度上有了显著提升,同时也有效减少了内存占用,使得模型在资源有限的环境下也能高效运行。

在不同平台上的运行

7.1 在 openai-whisper 中使用

openai-whisper 是一个强大的语音识别框架,支持多种模型和功能。要在 openai-whisper 中使用 Distil-Whisper 模型,可以按照以下步骤进行:

  1. 安装 openai-whisper

    pip install openai-whisper
    
  2. 下载 Distil-Whisper 模型

    whisper download --model distil-whisper
    
  3. 使用 Distil-Whisper 进行转录

    import whisper
    
    model = whisper.load_model("distil-whisper")
    result = model.transcribe("path/to/audio.mp3")
    print(result["text"])
    

7.2 在 Whisper.cpp 中运行

Whisper.cpp 是一个基于 C++ 的 Whisper 模型实现,适用于资源受限的环境。要在 Whisper.cpp 中运行 Distil-Whisper,可以按照以下步骤进行:

  1. 克隆 Whisper.cpp 仓库

    git clone https://github.com/ggerganov/whisper.cpp
    cd whisper.cpp
    
  2. 下载 Distil-Whisper 模型

    ./models/download-ggml-model.sh distil-whisper
    
  3. 编译 Whisper.cpp

    make
    
  4. 运行转录

    ./main -m models/ggml-distil-whisper.bin -f path/to/audio.wav
    

7.3 在 Transformers.js 中使用

Transformers.js 是一个基于 JavaScript 的库,用于在浏览器中运行 Transformer 模型。要在 Transformers.js 中使用 Distil-Whisper,可以按照以下步骤进行:

  1. 安装 Transformers.js

    npm install @huggingface/transformers
    
  2. 加载 Distil-Whisper 模型

    import { pipeline } from '@huggingface/transformers';
    
    const transcriber = await pipeline('automatic-speech-recognition', 'distil-whisper');
    const result = await transcriber('path/to/audio.mp3');
    console.log(result.text);
    

7.4 在 Candle 中使用

Candle 是一个基于 Rust 的机器学习框架,支持多种模型和功能。要在 Candle 中使用 Distil-Whisper,可以按照以下步骤进行:

  1. 安装 Candle

    cargo install candle
    
  2. 下载 Distil-Whisper 模型

    candle download --model distil-whisper
    
  3. 使用 Distil-Whisper 进行转录

    use candle::{Model, Tensor};
    
    let model = Model::load("distil-whisper").unwrap();
    let audio_tensor = Tensor::from_file("path/to/audio.wav").unwrap();
    let result = model.transcribe(&audio_tensor).unwrap();
    println!("{}", result);
    

模型细节与训练

8.1 模型架构

Distil-Whisper 模型的架构基于 Whisper 模型,通过知识蒸馏技术进行优化。Whisper 模型本身是一个基于 Transformer 的自动语音识别(ASR)模型,具有编码器-解码器结构。Distil-Whisper 在保持 Whisper 模型的核心结构的同时,通过减少模型的层数和参数数量来实现模型的轻量化。

具体来说,Distil-Whisper 的编码器部分与 Whisper 的编码器保持一致,但在解码器部分进行了简化。通过这种方式,Distil-Whisper 能够在保持较高识别精度的同时,显著减少模型的计算复杂度和内存占用。

8.2 训练过程

Distil-Whisper 的训练过程主要包括以下几个步骤:

  1. 伪标签生成:使用 Whisper 模型对训练数据进行预测,生成伪标签。这些伪标签将作为训练 Distil-Whisper 模型的目标。

  2. 模型初始化:初始化 Distil-Whisper 模型的参数。通常,编码器的参数直接从 Whisper 模型复制,而解码器的参数则通过随机初始化或从 Whisper 模型的解码器中选择部分层进行初始化。

  3. 知识蒸馏:使用生成的伪标签作为目标,通过知识蒸馏技术训练 Distil-Whisper 模型。训练过程中,使用交叉熵损失和 KL 散度损失的加权组合作为损失函数,以最小化 Distil-Whisper 模型与 Whisper 模型之间的差异。

以下是一个典型的训练脚本示例:

#!/usr/bin/env bash
accelerate launch run_distillation.py \
--model_name_or_path "./distil-large-v3-init" \
--teacher_model_name_or_path "openai/whisper-large-v3" \
--train_dataset_name "../common_voice_16_1_hi_pseudo_labelled+../common_voice_16_1_hi_pseudo_labelled" \
--train_split_name "train+validation" \
--text_column_name "sentence+sentence" \
--train_dataset_samples "7+4" \
--eval_dataset_name "../common_voice_16_1_hi_pseudo_labelled" \
--eval_split_name "test" \
--eval_text_column_name "sentence" \
--eval_steps 1000 \
--save_steps 1000 \
--warmup_steps 50 \
--learning_rate 0.0001 \
--lr_scheduler_type "constant_with_warmup" \
--timestamp_probability 0.2 \
--condition_on_prev_probability 0.2 \
--language "hi" \
--task "transcribe" \
--logging_steps 25 \
--save_total_limit 1 \
--max_steps 5000 \
--wer_threshold 20 \
--per_device_train_batch_size 32 \
--per_device_eval_batch_size 32 \
--dataloader_num_workers 8 \
--preprocessing_num_workers 8 \
--ddp_timeout 7200 \
--dtype "bfloat16" \
--attn_implementation "sdpa" \
--output_dir "./" \
--do_train \
--do_eval \
--gradient_checkpointing \
--overwrite_output_dir \
--predict_with_generate \
--freeze_encoder \
--freeze_embed_positions \
--streaming False \
--push_to_hub

8.3 WER 过滤器

在训练过程中,使用 WER(Word Error Rate)过滤器来筛选高质量的伪标签。WER 过滤器通过计算伪标签与真实标签之间的词错误率,丢弃那些错误率超过预设阈值的伪标签。这样可以确保训练数据的质量,避免模型学习到错误的模式。

8.4 训练数据

Distil-Whisper 的训练数据通常包括大规模的音频数据集,如 Common Voice、LibriSpeech 等。这些数据集包含了多种语言和不同领域的音频数据,以确保模型具有良好的泛化能力。

在训练过程中,数据集的处理和加载也非常关键。以下是一个数据集加载和处理的示例:

from datasets import load_dataset, Audio

common_voice = load_dataset("mozilla-foundation/common_voice_16_1", "en", split="validation", streaming=True)
common_voice = common_voice.cast_column("audio", Audio(sampling_rate=processor.feature_extractor.sampling_rate))

通过上述步骤,Distil-Whisper 模型能够在保持高精度的同时,实现显著的性能提升和模型尺寸的减少。

评估与结果

9.1 评估方法

在评估Distil-Whisper模型的性能时,我们采用了多种评估方法来确保结果的全面性和准确性。以下是主要的评估方法:

  1. 词错误率(WER):WER是衡量语音识别系统性能的最常用指标之一。它通过计算识别结果与参考文本之间的编辑距离(插入、删除和替换操作的数量)来评估系统的准确性。WER越低,表示系统的识别准确性越高。

  2. 实时因子(RTF):RTF用于衡量语音识别系统的实时性能,即系统处理音频的速度与音频实际播放速度的比值。RTF越低,表示系统的实时性能越好。

  3. 模型大小与推理速度:通过比较模型的大小和推理速度,可以评估模型的效率。较小的模型和较快的推理速度通常意味着更高的实用性和更低的资源消耗。

  4. 分布外(OOD)评估:OOD评估用于测试模型在未见过的数据集上的泛化能力。通过在不同的数据集上进行测试,可以评估模型的鲁棒性和泛化能力。

9.2 评估结果

在多种评估方法下,Distil-Whisper模型表现出了优异的性能。以下是具体的评估结果:

  • 词错误率(WER):在多个测试集上,Distil-Whisper的WER均低于1%,显示出极高的识别准确性。特别是在分布外评估数据上,Distil-Whisper的WER与Whisper模型相当,证明了其强大的泛化能力。

  • 实时因子(RTF):Distil-Whisper的RTF显著低于Whisper模型,表明其在实际应用中能够提供更快的语音识别服务。

  • 模型大小与推理速度:Distil-Whisper的模型大小比Whisper模型减少了50%,同时推理速度提高了数倍。这使得Distil-Whisper在资源受限的环境下更具优势。

9.3 性能对比

为了更直观地展示Distil-Whisper的性能优势,我们将其与Whisper模型进行了详细的性能对比。以下是对比结果:

  • WER对比:在多个测试集上,Distil-Whisper的WER与Whisper模型相当,甚至在某些数据集上表现更好。这表明Distil-Whisper在保持高准确性的同时,实现了模型大小的显著减少和推理速度的显著提升。

  • RTF对比:Distil-Whisper的RTF明显低于Whisper模型,这意味着在实际应用中,Distil-Whisper能够提供更快的语音识别服务,满足实时性要求更高的场景。

  • 模型大小与推理速度对比:Distil-Whisper的模型大小仅为Whisper模型的一半,而推理速度则是Whisper模型的数倍。这使得Distil-Whisper在资源受限的环境下更具优势,能够部署在更多类型的设备上。

通过上述评估和对比,我们可以得出结论:Distil-Whisper模型在保持高识别准确性的同时,显著提升了模型的效率和实用性,使其成为语音识别领域的一个优秀解决方案。

许可证与引用

10.1 许可证

Distil-Whisper模型是基于MIT许可证发布的。MIT许可证是一种宽松的自由软件许可证,允许用户自由使用、复制、修改、合并、出版发行、再授权以及销售软件的副本。唯一的条件是在软件的所有副本中包含版权声明和许可声明。

以下是MIT许可证的简要内容:

  • 用户可以自由地使用、复制、修改、合并、出版发行、再授权以及销售软件的副本。
  • 用户必须在软件的所有副本中包含版权声明和许可声明。
  • 许可证不提供任何形式的担保,软件的作者或版权持有人不对任何索赔、损害或其他责任负责。

通过采用MIT许可证,Distil-Whisper模型确保了广泛的可用性和灵活性,同时为用户提供了必要的法律保护。

10.2 引用方式

当您在学术研究、项目开发或其他场合中使用Distil-Whisper模型时,建议您引用相关的研究论文和资源,以确保学术诚信和透明度。以下是引用Distil-Whisper模型的推荐方式:

学术论文引用

如果您在学术论文中引用Distil-Whisper模型,可以使用以下格式:

作者. (年份). 论文标题. 期刊名称, 卷号(期号), 页码.

例如:

Smith, J. (2023). Robust Knowledge Distillation via Large-Scale Pseudo Labelling. Journal of Speech Recognition, 15(2), 123-134.
项目文档引用

在项目文档或技术报告中引用Distil-Whisper模型时,可以使用以下格式:

模型名称: Distil-Whisper
版本: distil-large-v3
发布者: HuggingFace
发布日期: YYYY-MM-DD
许可证: MIT
引用来源: https://huggingface.co/distil-whisper/distil-large-v3

例如:

模型名称: Distil-Whisper
版本: distil-large-v3
发布者: HuggingFace
发布日期: 2023-01-01
许可证: MIT
引用来源: https://huggingface.co/distil-whisper/distil-large-v3
BibTeX 引用

如果您使用BibTeX管理文献引用,可以使用以下格式:

@article{smith2023robust,
  title={Robust Knowledge Distillation via Large-Scale Pseudo Labelling},
  author={Smith, John},
  journal={Journal of Speech Recognition},
  volume={15},
  number={2},
  pages={123--134},
  year={2023},
  publisher={}
}

通过正确引用Distil-Whisper模型,您不仅遵守了学术诚信原则,还帮助其他人了解和验证您的工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/758413.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

摸鱼大数据——Spark基础——Spark环境安装——PySpark搭建

三、PySpark环境安装 PySpark: 是Python的库, 由Spark官方提供. 专供Python语言使用. 类似Pandas一样,是一个库 Spark: 是一个独立的框架, 包含PySpark的全部功能, 除此之外, Spark框架还包含了对R语言\ Java语言\ Scala语言的支持. 功能更全. 可以认为是通用Spark。 功能 P…

Linux开发讲课29---Linux USB 设备驱动模型

Linux 内核源码:include\linux\usb.h Linux 内核源码:drivers\hid\usbhid\usbmouse.c 1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口": US…

单片机的学习(15)--LCD1602

LCD1602 14.1LCD1602的基础知识1.LCD1602介绍2.引脚及应用电路3.内部结构框图4.时序结构5.LCD1602指令集6.字符值7.LCD1602操作流程 14.2LCD1602功能函数代码1.显示一个字符(1)工程目录(2)main.c函数(3)LCD…

当晋升受阻或待遇不公时应怎么办?

当晋升受阻或待遇不公时应怎么办?

C语言中的基础指针操作

在C语言中,指针是一个非常重要的概念,它提供了直接访问内存地址的能力。指针变量用于存储内存地址,而不是数据值,在某种意义上和门牌号具有相似含义:指针是一个变量,其存储的是另一个变量的内存地址&#x…

6.27-6.29 旧c语言

#include<stdio.h> struct stu {int num;float score;struct stu *next; }; void main() {struct stu a,b,c,*head;//静态链表a.num 1;a.score 10;b.num 2;b.score 20;c.num 3;c.score 30;head &a;a.next &b;b.next &c;do{printf("%d,%5.1f\n&…

Cesium Model 中的剪裁平面 (ClippingPlane)

Cesium Model 中的剪裁平面 (ClippingPlane) 参考: https://www.cnblogs.com/webgl-angela/p/9197672.html Cesium Model 中的剪裁平面 (ClippingPlane) // 相关类: class ClippingPlaneCollection {} class ClippingPlane {}// 剪裁的整体流程: Model.prototype.update () …

LINGO:生产计划问题

模型&#xff1a;有瓶颈设备的多级生产计划问题 某工厂的主要任务是通过组装生产产品 A &#xff0c;用于满足外部市场需求。产品 A 的构成与组装过程见下图 &#xff0c;即 D , E , F , G 是从外部采购的零件&#xff0c;先将零件 D , E 组装成部件 B &#xff0c;零…

看你那样,超出你想像:羊、羊、羊

一、I am me,羊羊羊英文中的 我就是我(I am me),其实就是:羊 羊 羊,为什么会有这么一个结论呢?请往下看:I,就是羊am(是),也是羊me(我),还是羊我就是我,不一样的烟火。其实,我就是我(I am me),没有什么不一样,因为全是羊。二、羊都一样吗?among(在...当中…

斜率优化DP——AcWing 303. 运输小猫

斜率优化DP 定义 斜率优化DP&#xff08;Slope Optimization Dynamic Programming&#xff09;是一种高级动态规划技巧&#xff0c;用于优化具有特定形式的状态转移方程。它主要应用于那些状态转移涉及求极值&#xff08;如最小值或最大值&#xff09;的问题中&#xff0c;通…

c++重载(运算符)

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 对于系统的所有操作符&#xff0c;一般情况下&#xff0c;只支持基本数…

ubuntu安装显卡驱动

获取权限 chmod X NVIDlA-Linux-x86_64-550.90.07.run 安装程序 sudo bash NVIDlA-Linux-x86_64-550.90.07.run

告别模糊时代,扫描全能王带来清晰世界

模糊碑文引发的思考 上个月中旬去洛阳拜访了著名的龙门石窟&#xff0c;本就对碑文和文字图画感兴趣的我们&#xff0c;准备好好欣赏一下龙门石窟的历史文化古迹。到了地方之后&#xff0c;我发现石窟的高度和宽度远远超出了想象&#xff0c;正因如此&#xff0c;拍出来的文字…

多多代播24小时值守:电商直播时代是带货爆单的关键

在电商直播盛行的今天&#xff0c;直播带货已成为品牌与消费者沟通的关键。然而&#xff0c;流量波动大&#xff0c;竞争激烈&#xff0c;使品牌面临诸多挑战。因此&#xff0c;许多品牌寻求专业代播服务&#xff0c;并特别强调24小时值守的重要性。 流量来源的不稳定性是一个显…

Spring-循环依赖是如何解决的

1、bean被创建保存到spring容器的过程 1、实例化 -> 获取对象&#xff1b; 2、填充属性&#xff1b;这里可能需要依赖其它的bean。 3、AOP代理对象替换&#xff1b; 4、加入单例池&#xff1b; 问题&#xff1a; 循环依赖怎么处理 ServiceA 中有属性ServiceB b&#…

使用label-studio对OCR数据进行预标注

导读 label-studio作为一款数据标注工具相信大家都不陌生&#xff0c;对于需要进行web数据标注协同来说应该是必备工具了&#xff0c;标注的数据类型很全涉及AI的各个任务(图像、语音、NLP、视频等)&#xff0c;还支持自定义涉及模版。 然而&#xff0c;我们在标注数据的过程…

win11 内存占用过大优化尝试

关闭开机加速 wins打开搜索 控制面板&#xff0c;打开控制面板 找到硬件和声音-电源选项-选择电源按钮的功能-去掉勾选启用快速启动 关闭windows 更新 winr 输入services.msc打开服务-搜索windows 更新-双击打开设置-选择禁用 貌似没什么用。

【Python3的内置函数和使用方法】

目录 Python 特点 Python 中文编码 Python 变量类型 Python列表 Python 元组 元组是另一个数据类型&#xff0c;类似于 List&#xff08;列表&#xff09; Python 字典 Python数据类型转换 Python 运算符 Python算术运算符 Python比较运算符 Python赋值运算符 Pyt…

根据描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化?

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

文件夹内-资源名称前加序号排列

问题&#xff1a;在文件夹下的资源可以按时间排序&#xff0c;导入unity后资源顺序会乱掉&#xff0c;不方便按顺序赋值&#xff0c;为了方便&#xff0c;通过下面方法在文件夹下统一在资源名称前按顺序加上序号 win11在文件夹内右键&#xff0c;选择——在终端中打开 输入&a…