モデル概要
モデル特徴
モデル能力
使用事例
🚀 Whisper
Whisperは、自動音声認識(ASR)と音声翻訳における最先端のモデルです。OpenAIのAlec Radfordらによる論文Robust Speech Recognition via Large-Scale Weak Supervisionで提案されました。500万時間以上のラベル付きデータで訓練されたWhisperは、ゼロショット設定で多くのデータセットやドメインに対して強力な汎化能力を示します。
Whisper large-v3-turboは、プルーニングされたWhisper large-v3の微調整版です。つまり、デコード層の数が32から4に減少した以外は同じモデルです。その結果、モデルは大幅に高速化されますが、若干の品質低下を伴います。詳細については、このGitHubの議論を参照してください。
免責事項:このモデルカードの内容は、一部🤗 Hugging Faceチームによって作成され、一部は元のモデルカードからコピー&ペーストされています。
🚀 クイックスタート
📦 インストール
Whisper large-v3-turboはHugging Face 🤗 Transformersでサポートされています。モデルを実行するには、まずTransformersライブラリをインストールします。この例では、Hugging Face Hubから玩具用の音声データセットをロードするために🤗 Datasetsもインストールし、モデルのロード時間を短縮するために🤗 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-turbo"
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 compression ratio threshold (in token space)
"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を直接使用します。
```python import torch from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor from datasets import Audio, load_datasetdevice = "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-turbo"
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 compression ratio threshold (in token space) "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)
</details>
## 🔧 追加の速度とメモリの改善
Whisperに追加の速度とメモリの改善を適用して、推論速度とVRAM要件をさらに削減することができます。
### チャンク化された長文処理
Whisperの受容野は30秒です。これより長い音声を文字起こしするには、2つの長文アルゴリズムのいずれかが必要です。
1. **シーケンシャル**:バッファ付き推論のための「スライディングウィンドウ」を使用し、30秒のスライスを順番に文字起こしします。
2. **チャンク化**:長い音声ファイルを短いファイルに分割し(セグメント間に小さなオーバーラップを持たせる)、各セグメントを独立して文字起こしし、結果の文字起こしを境界で結合します。
シーケンシャルな長文アルゴリズムは、次のいずれかのシナリオで使用する必要があります。
1. 文字起こしの精度が最も重要な要素で、速度はあまり考慮されない場合。
2. **バッチで**長い音声ファイルを文字起こしする場合。この場合、シーケンシャルのレイテンシはチャンク化と同等ですが、精度は最大0.5% WER高くなります。
逆に、チャンク化アルゴリズムは、次の場合に使用する必要があります。
1. 文字起こしの速度が最も重要な要素である場合。
2. **単一の**長い音声ファイルを文字起こしする場合。
デフォルトでは、Transformersはシーケンシャルアルゴリズムを使用します。チャンク化アルゴリズムを有効にするには、`chunk_length_s`パラメータを`pipeline`に渡します。large-v3の場合、30秒のチャンク長が最適です。長い音声ファイルに対するバッチ処理を有効にするには、`batch_size`引数を渡します。
```python
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-turbo"
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, # batch size for inference - set based on your device
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-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True
).to(device)
# Enable static cache and compile the forward pass
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 warmup steps
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})
# fast run
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上のモデルへのリンクが含まれています。
サイズ | パラメータ数 | 英語専用 | 多言語 |
---|---|---|---|
tiny | 39 M | ✓ | ✓ |
base | 74 M | ✓ | ✓ |
small | 244 M | ✓ | ✓ |
medium | 769 M | ✓ | ✓ |
large | 1550 M | × | ✓ |
large-v2 | 1550 M | × | ✓ |
large-v3 | 1550 M | × | ✓ |
large-v3-turbo | 809 M | × | ✓ |
微調整
事前学習済みのWhisperモデルは、異なるデータセットやドメインに対して強力な汎化能力を示します。ただし、特定の言語やタスクに対しては、微調整によって予測能力をさらに向上させることができます。ブログ記事Fine-Tune Whisper with 🤗 Transformersでは、5時間程度のラベル付きデータでWhisperモデルを微調整する手順が説明されています。
評価済みの使用
これらのモデルの主な対象ユーザーは、現在のモデルのロバスト性、汎化能力、機能、バイアス、制約を研究するAI研究者です。ただし、Whisperは開発者にとっても、特に英語の音声認識において非常に有用なASRソリューションとなる可能性があります。モデルがリリースされると、「意図された」使用法のみにアクセスを制限したり、研究かどうかを判断する合理的なガイドラインを定めたりすることは不可能であることを認識しています。
これらのモデルは、主にASRと英語への音声翻訳のタスクで訓練および評価されています。約10の言語で強力なASR結果を示します。音声活動検出、話者分類、話者分離などの特定のタスクで微調整された場合、追加の機能を示す可能性がありますが、これらの領域では十分に評価されていません。ユーザーは、モデルをデプロイする前に、特定のコンテキストやドメインでモデルを十分に評価することを強くお勧めします。
特に、Whisperモデルを、本人の同意なしに録音された個人の録音を文字起こしするために使用したり、何らかの主観的な分類のために使用することを警告します。精度の欠陥が結果に大きな欠陥を引き起こす可能性のある高リスクのドメインでの使用はお勧めしません。これらのモデルは音声の文字起こしと翻訳を目的としており、分類のためのモデルの使用は評価されておらず、特に人間の属性を推測するために使用することは適切ではありません。
性能と制限
私たちの研究によると、多くの既存のASRシステムに比べて、これらのモデルはアクセント、背景雑音、専門用語に対するロバスト性が向上しており、複数の言語から英語へのゼロショット翻訳も可能です。また、音声認識と翻訳の精度は最先端レベルに近いことが示されています。
ただし、これらのモデルは大規模なノイズデータを使用して弱教師付き学習で訓練されているため、予測結果に音声入力に実際には含まれていないテキスト(すなわち幻覚)が含まれる場合があります。これは、モデルが言語の一般知識を持っているため、音声の次の単語を予測しようとすることと、音声自体を文字起こししようとすることを組み合わせるために起こると考えられます。
私たちのモデルは言語間で不均一な性能を示しており、低リソースおよび/または低発見可能性の言語、または訓練データが少ない言語では精度が低いことが観察されています。また、特定の言語の異なるアクセントや方言でも性能が異なり、異なる性別、人種、年齢、またはその他の人口統計学的基準の話者間での単語誤り率が高くなる場合があります。完全な評価結果は、このリリースに付随する論文に掲載されています。
さらに、モデルのシーケンス-to-シーケンスアーキテクチャのため、繰り返しのテキストを生成しやすくなっています。これはビームサーチや温度スケジューリングによってある程度軽減できますが、完全に解消することはできません。これらの制限に関するさらなる分析は、論文に記載されています。この振る舞いと幻覚は、低リソースおよび/または低発見可能性の言語でより悪化する可能性があります。
広範な影響
Whisperモデルの文字起こし機能は、アクセシビリティツールの改善に役立つ可能性があると予想されます。ただし、Whisperモデルはそのままではリアルタイム文字起こしには使用できませんが、その速度とサイズから、他の人がそれを基にしてほぼリアルタイムの音声認識と翻訳が可能なアプリケーションを構築できる可能性があります。Whisperモデルを基にして構築された有益なアプリケーションの実際の価値から、これらのモデルの不均一な性能が実際の経済的影響を与える可能性があることが示唆されます。
また、Whisperをリリースすることには潜在的な二重使用の懸念もあります。私たちはこの技術が主に有益な目的で使用されることを望んでいますが、ASR技術をより広く利用できるようにすることで、より多くの主体が高性能な監視技術を構築したり、既存の監視活動を拡大したりすることが可能になります。速度と精度のため、大量の音声通信を安価に自動文字起こしおよび翻訳することができます。さらに、これらのモデルはそのままで特定の個人を認識する能力を持っている可能性があり、これは二重使用と不均一な性能に関連する安全上の懸念をもたらします。実際には、文字起こしのコストは監視プロジェクトを拡大する際の制限要因ではないと考えられます。
BibTeXエントリと引用情報
@misc{radford2022whisper,
doi = {10.48550/ARXIV.2212.04356},
url = {https://arxiv.org/abs/2212.04356},
author = {Radford, Alec and Kim, Jong Wook and Xu, Tao and Brockman, Greg and McLeavey, Christine and Sutskever, Ilya},
title = {Robust Speech Recognition via Large-Scale Weak Supervision},
publisher = {arXiv},
year = {2022},
copyright = {arXiv.org perpetual, non-exclusive license}
}
📄 ライセンス
このモデルはMITライセンスの下で提供されています。



