モデル概要
モデル特徴
モデル能力
使用事例
🚀 Whisper
Whisperは、OpenAIのAlec Radfordらによる論文Robust Speech Recognition via Large-Scale Weak Supervisionで提案された、自動音声認識(ASR)と音声翻訳の最先端モデルです。500万時間以上のラベル付きデータで学習され、ゼロショット設定で多くのデータセットやドメインに対する汎化能力を示しています。
Whisper large-v3は、以前のlargeおよびlarge-v2モデルと同じアーキテクチャを持ちますが、以下のわずかな違いがあります。
- スペクトログラム入力は、80ではなく128のメル周波数ビンを使用します。
- 広東語用の新しい言語トークンが追加されました。
Whisper large-v3モデルは、100万時間の弱ラベル付きオーディオと、Whisper large-v2を使用して収集された400万時間の疑似ラベル付きオーディオで学習されました。この混合データセットに対して2.0エポックで学習されました。
large-v3モデルは、幅広い言語で性能が向上しており、Whisper large-v2と比較して10%から20%のエラー削減を示しています。利用可能な異なるチェックポイントの詳細については、モデルの詳細セクションを参照してください。
免責事項:このモデルカードの内容は、一部が🤗 Hugging Faceチームによって作成され、一部が元のモデルカードからコピー&ペーストされています。
🚀 クイックスタート
Whisper large-v3はHugging Face 🤗 Transformersでサポートされています。モデルを実行するには、まずTransformersライブラリをインストールします。この例では、🤗 DatasetsをインストールしてHugging Face Hubから玩具オーディオデータセットをロードし、🤗 Accelerateをインストールしてモデルのロード時間を短縮します。
pip install --upgrade pip
pip install --upgrade transformers datasets[audio] accelerate
モデルは、pipeline
クラスを使用して、任意の長さのオーディオを文字起こしすることができます。
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 = "openai/whisper-large-v3"
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,
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
result = pipe(sample)
print(result["text"])
ローカルのオーディオファイルを文字起こしするには、パイプラインを呼び出すときにオーディオファイルのパスを渡すだけです。
result = pipe("audio.mp3")
複数のオーディオファイルを並列に文字起こしするには、リストとして指定し、batch_size
パラメータを設定します。
result = pipe(["audio_1.mp3", "audio_2.mp3"], batch_size=2)
Transformersは、温度フォールバックや前のトークンに条件付けるなど、すべてのWhisperデコード戦略と互換性があります。以下の例は、これらのヒューリスティックを有効にする方法を示しています。
generate_kwargs = {
"max_new_tokens": 448,
"num_beams": 1,
"condition_on_prev_tokens": False,
"compression_ratio_threshold": 1.35, # zlib圧縮率の閾値(トークン空間)
"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
"logprob_threshold": -1.0,
"no_speech_threshold": 0.6,
"return_timestamps": True,
}
result = pipe(sample, generate_kwargs=generate_kwargs)
Whisperは、ソースオーディオの言語を自動的に予測します。ソースオーディオの言語が事前にわかっている場合は、パイプラインに引数として渡すことができます。
result = pipe(sample, generate_kwargs={"language": "english"})
デフォルトでは、Whisperは音声文字起こしのタスクを実行します。この場合、ソースオーディオの言語とターゲットテキストの言語は同じです。音声翻訳を行い、ターゲットテキストを英語にするには、タスクを"translate"
に設定します。
result = pipe(sample, generate_kwargs={"task": "translate"})
最後に、モデルにタイムスタンプを予測させることができます。文レベルのタイムスタンプを取得するには、return_timestamps
引数を渡します。
result = pipe(sample, return_timestamps=True)
print(result["chunks"])
単語レベルのタイムスタンプを取得するには、以下のようにします。
result = pipe(sample, return_timestamps="word")
print(result["chunks"])
上記の引数は、単独でまたは組み合わせて使用することができます。たとえば、ソースオーディオがフランス語で、文レベルのタイムスタンプを返したい場合、次のように使用できます。
result = pipe(sample, return_timestamps=True, generate_kwargs={"language": "french", "task": "translate"})
print(result["chunks"])
生成パラメータをより詳細に制御するには、モデル+プロセッサAPIを直接使用します。
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
from datasets import Audio, 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 = "openai/whisper-large-v3"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
dataset = dataset.cast_column("audio", Audio(processor.feature_extractor.sampling_rate))
sample = dataset[0]["audio"]
inputs = processor(
sample["array"],
sampling_rate=sample["sampling_rate"],
return_tensors="pt",
truncation=False,
padding="longest",
return_attention_mask=True,
)
inputs = inputs.to(device, dtype=torch_dtype)
gen_kwargs = {
"max_new_tokens": 448,
"num_beams": 1,
"condition_on_prev_tokens": False,
"compression_ratio_threshold": 1.35, # zlib圧縮率の閾値(トークン空間)
"temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
"logprob_threshold": -1.0,
"no_speech_threshold": 0.6,
"return_timestamps": True,
}
pred_ids = model.generate(**inputs, **gen_kwargs)
pred_text = processor.batch_decode(pred_ids, skip_special_tokens=True, decode_with_timestamps=False)
print(pred_text)
✨ 主な機能
追加の速度とメモリの改善
Whisperに追加の速度とメモリの改善を適用して、推論速度とVRAM要件をさらに削減することができます。
チャンク化された長文処理
Whisperは30秒の受容野を持っています。これより長いオーディオを文字起こしするには、2つの長文アルゴリズムのいずれかが必要です。
- 逐次方式:バッファ付き推論に「スライディングウィンドウ」を使用し、30秒のスライスを1つずつ文字起こしします。
- チャンク化方式:長いオーディオファイルを短いファイルに分割し(セグメント間に小さな重複を持たせる)、各セグメントを独立して文字起こしし、結果の文字起こしを境界で結合します。
逐次長文アルゴリズムは、以下のいずれかのシナリオで使用する必要があります。
- 文字起こしの精度が最も重要な要素で、速度がそれほど重要でない場合。
- バッチで長いオーディオファイルを文字起こしする場合。この場合、逐次方式のレイテンシはチャンク化方式と同等で、誤り率(WER)が最大0.5%正確です。
逆に、チャンク化アルゴリズムは、以下の場合に使用する必要があります。
- 文字起こしの速度が最も重要な要素である場合。
- 単一の長いオーディオファイルを文字起こしする場合。
デフォルトでは、Transformersは逐次アルゴリズムを使用します。チャンク化アルゴリズムを有効にするには、pipeline
にchunk_length_s
パラメータを渡します。large-v3の場合、30秒のチャンク長が最適です。長いオーディオファイルに対してバッチ処理を有効にするには、batch_size
引数を渡します。
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 = "openai/whisper-large-v3"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=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,
chunk_length_s=30,
batch_size=16, # 推論のバッチサイズ - デバイスに合わせて設定
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
result = pipe(sample)
print(result["text"])
Torch compile
Whisperの順伝播は、torch.compile
と互換性があり、4.5倍の速度向上が得られます。
注意:torch.compile
は、現在、チャンク化長文アルゴリズムまたはFlash Attention 2と互換性がありません⚠️
import torch
from torch.nn.attention import SDPBackend, sdpa_kernel
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset
from tqdm import tqdm
torch.set_float32_matmul_precision("high")
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
).to(device)
# 静的キャッシュを有効にし、順伝播をコンパイルする
model.generation_config.cache_implementation = "static"
model.generation_config.max_new_tokens = 256
model.forward = torch.compile(model.forward, mode="reduce-overhead", fullgraph=True)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
# 2回のウォームアップステップ
for _ in tqdm(range(2), desc="Warm-up step"):
with sdpa_kernel(SDPBackend.MATH):
result = pipe(sample.copy(), generate_kwargs={"min_new_tokens": 256, "max_new_tokens": 256})
# 高速実行
with sdpa_kernel(SDPBackend.MATH):
result = pipe(sample.copy())
print(result["text"])
Flash Attention 2
GPUがサポートしており、torch.compileを使用していない場合は、Flash-Attention 2の使用をお勧めします。そのためには、まずFlash Attentionをインストールします。
pip install flash-attn --no-build-isolation
次に、from_pretrained
にattn_implementation="flash_attention_2"
を渡します。
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="flash_attention_2")
Torch Scale-Product-Attention (SDPA)
GPUがFlash Attentionをサポートしていない場合は、PyTorchのscaled dot-product attention (SDPA)の使用をお勧めします。このアテンション実装は、PyTorchバージョン2.1.1以上でデフォルトで有効になっています。互換性のあるPyTorchバージョンがインストールされているかどうかを確認するには、次のPythonコードスニペットを実行します。
from transformers.utils import is_torch_sdpa_available
print(is_torch_sdpa_available())
上記がTrue
を返す場合は、有効なバージョンのPyTorchがインストールされており、SDPAがデフォルトで有効になっています。False
を返す場合は、公式の手順に従ってPyTorchバージョンをアップグレードする必要があります。
有効なPyTorchバージョンがインストールされると、SDPAはデフォルトで有効になります。また、attn_implementation="sdpa"
を指定することで明示的に設定することもできます。
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, attn_implementation="sdpa")
SDPAの使用方法の詳細については、Transformers SDPAドキュメントを参照してください。
📚 ドキュメント
モデルの詳細
Whisperは、Transformerベースのエンコーダ-デコーダモデルであり、シーケンス-to-シーケンス モデルとも呼ばれます。Whisperモデルには2種類あります。英語限定モデルと多言語モデルです。英語限定モデルは、英語の音声認識タスクで学習されました。多言語モデルは、多言語の音声認識と音声翻訳のタスクで同時に学習されました。音声認識の場合、モデルはオーディオと同じ言語の文字起こしを予測します。音声翻訳の場合、モデルはオーディオと異なる言語の文字起こしを予測します。
Whisperのチェックポイントは、モデルサイズが異なる5つの構成で提供されています。最小の4つは英語限定と多言語の両方で利用可能です。最大のチェックポイントは多言語のみです。すべての10個の事前学習済みチェックポイントは、Hugging Face Hubで利用可能です。チェックポイントは、以下の表にまとめられており、Hub上のモデルへのリンクが含まれています。
サイズ | パラメータ数 | 英語限定 | 多言語 |
---|
📄 ライセンス
このモデルは、Apache License 2.0の下で提供されています。



