モデル概要
モデル特徴
モデル能力
使用事例
🚀 Whisper
Whisperは、自動音声認識(ASR)と音声翻訳のための事前学習モデルです。68万時間のラベル付きデータで学習されたWhisperモデルは、微調整を行う必要なく、多くのデータセットやドメインに対して強力な汎化能力を示します。
Whisperは、OpenAIのAlec Radfordらによる論文Robust Speech Recognition via Large-Scale Weak Supervisionで提案されました。元のコードリポジトリはこちらにあります。
Whisperの大規模モデルと比較して、large-v2モデルはエポック数を2.5倍にし、正則化を追加して学習されており、性能が向上しています。
免責事項:このモデルカードの内容の一部はHugging Faceチームによって作成され、一部は元のモデルカードからコピー&ペーストされています。
✨ 主な機能
- 68万時間のラベル付きデータで学習され、多くのデータセットやドメインに対して強力な汎化能力を持つ。
- 音声認識と音声翻訳の両方のタスクに対応。
- 5種類の異なるモデルサイズのチェックポイントが用意されている。
📚 ドキュメント
モデルの詳細
WhisperはTransformerベースのエンコーダ・デコーダモデルで、シーケンス-to-シーケンス モデルとも呼ばれます。大規模な弱教師付き学習を用いて注釈付けされた68万時間のラベル付き音声データで学習されました。
モデルは英語のみのデータまたは多言語データで学習されています。英語のみのモデルは音声認識タスクで学習され、多言語モデルは音声認識と音声翻訳の両方のタスクで学習されています。音声認識の場合、モデルは音声と同じ言語の文字起こしを予測します。音声翻訳の場合、モデルは音声と異なる言語の文字起こしを予測します。
Whisperのチェックポイントは、モデルサイズが異なる5つの構成で提供されています。最小の4つは英語のみまたは多言語データで学習され、最大のチェックポイントは多言語のみです。事前学習された10個のチェックポイントはすべてHugging Face Hubで利用可能です。チェックポイントは以下の表にまとめられており、Hub上のモデルへのリンクも記載されています。
サイズ | パラメータ数 | 英語のみ | 多言語 |
---|---|---|---|
tiny | 39 M | ✓ | ✓ |
base | 74 M | ✓ | ✓ |
small | 244 M | ✓ | ✓ |
medium | 769 M | ✓ | ✓ |
large | 1550 M | x | ✓ |
large-v2 | 1550 M | x | ✓ |
使用方法
音声サンプルを文字起こしするには、モデルをWhisperProcessor
と一緒に使用する必要があります。
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")
これにより、モデルは音声認識タスクで英語で予測するように強制されます。
💻 使用例
基本的な使用法
英語から英語の文字起こし
この例では、コンテキストトークンが「非強制」であり、モデルが自動的に出力言語(英語)とタスク(文字起こし)を予測します。
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import load_dataset
>>> # モデルとプロセッサをロード
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-large-v2")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v2")
>>> 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-large-v2")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v2")
>>> 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-large-v2")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v2")
>>> 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 Largeを評価する方法を示しています。
>>> 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-large-v2")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v2").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"]))
3.0003583080317572
長時間の文字起こし
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-large-v2",
>>> 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モデルは、異なるデータセットやドメインに対して強力な汎化能力を示します。ただし、特定の言語やタスクに対しては、微調整を行うことで予測能力をさらに向上させることができます。ブログ記事Fine-Tune Whisper with 🤗 Transformersは、わずか5時間のラベル付きデータでWhisperモデルを微調整する手順を提供しています。
評価と注意事項
これらのモデルの主な対象ユーザーは、現在のモデルの頑健性、汎化能力、機能、バイアス、制約を研究するAI研究者です。ただし、Whisperは開発者にとっても、特に英語の音声認識において非常に有用なASRソリューションとなる可能性があります。モデルがリリースされた後は、「意図された」使用法のみにアクセスを制限したり、研究か否かの合理的なガイドラインを定めたりすることは不可能であることを認識しています。
モデルは主にASRと英語への音声翻訳タスクで学習および評価されています。約10の言語で強力なASR結果を示しています。特に、音声活動検出、話者分類、または話者分離などの特定のタスクで微調整された場合、追加の機能を示す可能性がありますが、これらの領域では十分な評価が行われていません。ユーザーは、モデルを特定のコンテキストやドメインでデプロイする前に、モデルの頑健な評価を行うことを強くお勧めします。
特に、Whisperモデルを、本人の同意なく録音した個人の録音を文字起こしするために使用したり、いかなる種類の主観的な分類にこれらのモデルを使用することを偽称したりすることは避けてください。精度の欠陥が結果に大きな欠陥を引き起こす可能性のある、意思決定の文脈などの高リスクドメインでの使用はお勧めしません。モデルは音声の文字起こしと翻訳を目的としており、分類のためのモデルの使用は評価されていないだけでなく、特に人間の属性を推測するためには適切ではありません。
学習データ
モデルは、インターネットから収集された68万時間の音声とそれに対応する文字起こしデータで学習されています。このデータの65%(つまり43万8000時間)は英語の音声を表しています。
📄 ライセンス
このモデルはApache 2.0ライセンスの下で提供されています。



