モデル概要
モデル特徴
モデル能力
使用事例
🚀 Whisper
Whisperは、自動音声認識(ASR)と音声翻訳のための事前学習済みモデルです。68万時間のラベル付きデータで学習されたWhisperモデルは、微調整を必要とせずに多くのデータセットやドメインに対して強力な汎化能力を示します。
Whisperは、OpenAIのAlec Radfordらによる論文 Robust Speech Recognition via Large-Scale Weak Supervision で提案されました。元のコードリポジトリは こちら で確認できます。
更新: 論文の公開に伴い、Whisperの著者たちは、正則化を用いて2.5倍のエポック数で学習された large-v2 モデルを発表しました。この large-v2 モデルは、アーキテクチャに変更を加えることなく、元の大規模モデルの性能を上回っています。したがって、元の大規模モデルの代わりに large-v2 モデルを使用することをお勧めします。
免責事項: このモデルカードの内容は、一部がHugging Faceチームによって作成され、一部が元のモデルカードからコピー&ペーストされています。
✨ 主な機能
多言語対応
- 対応言語は非常に多く、英語、中国語、ドイツ語、スペイン語、ロシア語、韓国語、フランス語、日本語など、100を超える言語に対応しています。
高精度な音声認識と翻訳
- 68万時間のラベル付きデータで学習され、多くのデータセットやドメインに対して強力な汎化能力を持ち、高精度な音声認識と翻訳が可能です。
柔軟な使用方法
- 30秒までの音声サンプルに対して直接処理できるだけでなく、チャンキングアルゴリズムを使用することで任意の長さの音声サンプルの文字起こしも可能です。
📚 ドキュメント
モデル詳細
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 | ✓ |
📦 インストール
このREADMEには具体的なインストール手順が記載されていないため、インストールに関するセクションは省略されます。
💻 使用例
基本的な使用法
音声サンプルの文字起こしを行うには、モデルを 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")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large")
>>> 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.']
コンテキストトークンは、skip_special_tokens=True
を設定することで文字起こしの先頭から削除できます。
フランス語からフランス語
次の例は、デコーダIDを適切に設定することによるフランス語からフランス語の文字起こしを示しています。
>>> from transformers import WhisperProcessor, WhisperForConditionalGeneration
>>> from datasets import Audio, load_dataset
>>> # モデルとプロセッサをロード
>>> processor = WhisperProcessor.from_pretrained("openai/whisper-large")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large")
>>> 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")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large")
>>> 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")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large").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",
>>> 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モデルを微調整するためのステップバイステップガイドを提供しています。
🔧 技術詳細
このセクションでは、Whisperモデルの技術的な詳細について説明します。
モデルアーキテクチャ
WhisperはTransformerベースのエンコーダ・デコーダモデルです。エンコーダは入力音声を特徴ベクトルに変換し、デコーダはその特徴ベクトルを基に文字起こしまたは翻訳結果を生成します。
学習データ
モデルは68万時間のラベル付き音声データで学習されています。これらのデータは大規模な弱教師付き学習を用いて注釈付けされています。学習データには英語のみのデータと多言語データがあり、それぞれ異なるタスクでモデルが学習されています。
コンテキストトークンの役割
コンテキストトークンは、モデルに実行するタスク(音声認識または音声翻訳)と出力言語を指示するために使用されます。特定の順序でトークンを組み合わせることで、モデルの出力を制御することができます。また、トークンを強制または非強制にすることで、モデルが自動的に出力言語とタスクを予測するか、ユーザが指定したものを使用するかを選択できます。
チャンキングアルゴリズム
Whisperモデルは元々30秒までの音声サンプルに対応していますが、チャンキングアルゴリズムを使用することで任意の長さの音声サンプルを処理できるようになります。チャンキングは音声を30秒ごとのチャンクに分割し、それぞれのチャンクを独立して処理した後、結果を統合することで実現されます。
📄 ライセンス
このモデルは apache-2.0
ライセンスの下で提供されています。



