モデル概要
モデル特徴
モデル能力
使用事例
🚀 Whisper
Whisperは、自動音声認識(ASR)と音声翻訳のための事前学習済みモデルです。68万時間のラベル付きデータで学習されたWhisperモデルは、微調整を必要とせずに多くのデータセットやドメインに対して強力な汎化能力を示します。
Whisperは、OpenAIのAlec Radfordらによる論文 Robust Speech Recognition via Large-Scale Weak Supervision で提案されました。元のコードリポジトリは こちら で確認できます。
免責事項:このモデルカードの内容の一部はHugging Faceチームによって作成され、一部は元のモデルカードからコピー&ペーストされています。
✨ 主な機能
- 自動音声認識(ASR)と音声翻訳のための事前学習済みモデル。
- 68万時間のラベル付きデータで学習され、微調整なしで多くのデータセットやドメインに汎化できる。
- 英語のみのデータまたは多言語データで学習された複数のモデルサイズがある。
📦 インストール
このREADMEには具体的なインストール手順が記載されていないため、このセクションをスキップします。
💻 使用例
基本的な使用法
音声サンプルを文字起こしするには、モデルを WhisperProcessor
と一緒に使用する必要があります。
# モデルとプロセッサをロード
from transformers import WhisperProcessor, WhisperForConditionalGeneration
from datasets import load_dataset
processor = WhisperProcessor.from_pretrained("openai/whisper-base")
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")
model.config.forced_decoder_ids = None
# ダミーデータセットをロードし、音声ファイルを読み込む
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
sample = ds[0]["audio"]
input_features = processor(sample["array"], sampling_rate=sample["sampling_rate"], return_tensors="pt").input_features
# トークンIDを生成
predicted_ids = model.generate(input_features)
# トークンIDをテキストにデコード
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=False)
print(transcription)
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
print(transcription)
高度な使用法
英語から英語の文字起こし
この例では、コンテキストトークンが「非強制」であり、モデルが出力言語(英語)とタスク(文字起こし)を自動的に予測します。
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import load_dataset
>>> # モデルとプロセッサをロード
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")
>>> model.config.forced_decoder_ids = None
>>> # ダミーデータセットをロードし、音声ファイルを読み込む
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> sample = ds[0]["audio"]
>>> input_features = processor(sample["array"], sampling_rate=sample["sampling_rate"], return_tensors="pt").input_features
>>> # トークンIDを生成
>>> predicted_ids = model.generate(input_features)
>>> # トークンIDをテキストにデコード
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=False)
['<|startoftranscript|><|en|><|transcribe|><|notimestamps|> Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.<|endoftext|>']
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
[' Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.']
フランス語からフランス語の文字起こし
以下の例は、デコーダIDを適切に設定することで、フランス語からフランス語の文字起こしを行う方法を示しています。
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import Audio, load_dataset
>>> # モデルとプロセッサをロード
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")
>>> forced_decoder_ids = processor.get_decoder_prompt_ids(language="french", task="transcribe")
>>> # ストリーミングデータセットをロードし、最初の音声サンプルを読み込む
>>> ds = load_dataset("common_voice", "fr", split="test", streaming=True)
>>> ds = ds.cast_column("audio", Audio(sampling_rate=16_000))
>>> input_speech = next(iter(ds))["audio"]
>>> input_features = processor(input_speech["array"], sampling_rate=input_speech["sampling_rate"], return_tensors="pt").input_features
>>> # トークンIDを生成
>>> predicted_ids = model.generate(input_features, forced_decoder_ids=forced_decoder_ids)
>>> # トークンIDをテキストにデコード
>>> transcription = processor.batch_decode(predicted_ids)
['<|startoftranscript|><|fr|><|transcribe|><|notimestamps|> Un vrai travail intéressant va enfin être mené sur ce sujet.<|endoftext|>']
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
[' Un vrai travail intéressant va enfin être mené sur ce sujet.']
フランス語から英語の翻訳
タスクを「translate」に設定すると、Whisperモデルは音声翻訳を行います。
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import Audio, load_dataset
>>> # モデルとプロセッサをロード
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")
>>> forced_decoder_ids = processor.get_decoder_prompt_ids(language="french", task="translate")
>>> # ストリーミングデータセットをロードし、最初の音声サンプルを読み込む
>>> ds = load_dataset("common_voice", "fr", split="test", streaming=True)
>>> ds = ds.cast_column("audio", Audio(sampling_rate=16_000))
>>> input_speech = next(iter(ds))["audio"]
>>> input_features = processor(input_speech["array"], sampling_rate=input_speech["sampling_rate"], return_tensors="pt").input_features
>>> # トークンIDを生成
>>> predicted_ids = model.generate(input_features, forced_decoder_ids=forced_decoder_ids)
>>> # トークンIDをテキストにデコード
>>> transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
[' A very interesting work, we will finally be given on this subject.']
評価
このコードスニペットは、LibriSpeech test-clean でWhisper Baseを評価する方法を示しています。
>>> from datasets import load_dataset
>>> from transformers import WhisperForConditionalGeneration, WhisperProcessor
>>> import torch
>>> from evaluate import load
>>> librispeech_test_clean = load_dataset("librispeech_asr", "clean", split="test")
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-base")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base").to("cuda")
>>> def map_to_pred(batch):
>>> audio = batch["audio"]
>>> input_features = processor(audio["array"], sampling_rate=audio["sampling_rate"], return_tensors="pt").input_features
>>> batch["reference"] = processor.tokenizer._normalize(batch['text'])
>>>
>>> with torch.no_grad():
>>> predicted_ids = model.generate(input_features.to("cuda"))[0]
>>> transcription = processor.decode(predicted_ids)
>>> batch["prediction"] = processor.tokenizer._normalize(transcription)
>>> return batch
>>> result = librispeech_test_clean.map(map_to_pred)
>>> wer = load("wer")
>>> print(100 * wer.compute(references=result["reference"], predictions=result["prediction"]))
5.082316555716899
長文の文字起こし
Whisperモデルは、基本的に最大30秒の音声サンプルで動作するように設計されています。しかし、チャンキングアルゴリズムを使用することで、任意の長さの音声サンプルを文字起こしすることができます。これは、Transformersの pipeline
メソッドを通じて可能です。パイプラインをインスタンス化する際に chunk_length_s=30
を設定すると、チャンキングが有効になります。チャンキングを有効にすると、パイプラインはバッチ推論で実行できます。また、return_timestamps=True
を渡すことで、シーケンスレベルのタイムスタンプを予測するように拡張することもできます。
>>> import torch
>>> from transformers import pipeline
>>> from datasets import load_dataset
>>> device = "cuda:0" if torch.cuda.is_available() else "cpu"
>>> pipe = pipeline(
>>> "automatic-speech-recognition",
>>> model="openai/whisper-base",
>>> chunk_length_s=30,
>>> device=device,
>>> )
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> sample = ds[0]["audio"]
>>> prediction = pipe(sample.copy(), batch_size=8)["text"]
" Mr. Quilter is the apostle of the middle classes, and we are glad to welcome his gospel."
>>> # 予測のタイムスタンプを返すこともできます
>>> prediction = pipe(sample.copy(), batch_size=8, return_timestamps=True)["chunks"]
[{'text': ' Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.',
'timestamp': (0.0, 5.44)}]
チャンキングアルゴリズムの詳細については、ブログ記事 ASR Chunking を参照してください。
📚 ドキュメント
モデルの詳細
Whisperは、Transformerベースのエンコーダ・デコーダモデルであり、シーケンス-to-シーケンス モデルとも呼ばれます。大規模な弱教師付きでアノテーションされた68万時間のラベル付き音声データで学習されています。
モデルは、英語のみのデータまたは多言語データで学習されています。英語のみのモデルは、音声認識のタスクで学習されています。多言語モデルは、音声認識と音声翻訳の両方で学習されています。音声認識の場合、モデルは音声と同じ言語で文字起こしを予測します。音声翻訳の場合、モデルは音声とは異なる言語で文字起こしを予測します。
Whisperのチェックポイントには、モデルサイズが異なる5つの構成があります。最小の4つは、英語のみまたは多言語データで学習されています。最大のチェックポイントは、多言語のみです。10個の事前学習済みチェックポイントはすべて、Hugging Face Hub で利用可能です。以下の表に、ハブ上のモデルへのリンクとともにチェックポイントをまとめます。
サイズ | パラメータ | 英語のみ | 多言語 |
---|---|---|---|
tiny | 39 M | ✓ | ✓ |
base | 74 M | ✓ | ✓ |
small | 244 M | ✓ | ✓ |
medium | 769 M | ✓ | ✓ |
large | 1550 M | x | ✓ |
large-v2 | 1550 M | x | ✓ |
コンテキストトークン
WhisperProcessor
は、以下の目的で使用されます。
- 音声入力を前処理する(モデル用のログメルスペクトログラムに変換する)
- モデルの出力を後処理する(トークンからテキストに変換する)
モデルは、適切な「コンテキストトークン」を渡すことで、実行するタスク(文字起こしまたは翻訳)を知らされます。これらのコンテキストトークンは、デコードプロセスの開始時にデコーダに与えられるトークンのシーケンスであり、以下の順序になります。
- 文字起こしは常に
<|startoftranscript|>
トークンで始まります。 - 2番目のトークンは言語トークンです(例:英語の場合は
<|en|>
)。 - 3番目のトークンは「タスクトークン」です。
<|transcribe|>
(音声認識)または<|translate|>
(音声翻訳)の2つの値のいずれかを取ります。 - さらに、モデルがタイムスタンプ予測を含めない場合は、
<|notimestamps|>
トークンが追加されます。
したがって、典型的なコンテキストトークンのシーケンスは次のようになります。
<|startoftranscript|> <|en|> <|transcribe|> <|notimestamps|>
これは、モデルに対して、音声認識のタスクで英語でデコードし、タイムスタンプを予測しないように指示します。
これらのトークンは、強制または非強制のいずれかにすることができます。強制された場合、モデルは各位置で各トークンを予測するようにされます。これにより、Whisperモデルの出力言語とタスクを制御することができます。非強制の場合、Whisperモデルは自動的に出力言語とタスクを予測します。
コンテキストトークンは、次のように設定することができます。
model.config.forced_decoder_ids = WhisperProcessor.get_decoder_prompt_ids(language="english", task="transcribe")
これにより、モデルは音声認識のタスクで英語で予測するように強制されます。
🔧 技術詳細
このREADMEには具体的な技術詳細が記載されていないため、このセクションをスキップします。
📄 ライセンス
このモデルは、Apache 2.0ライセンスの下で提供されています。



