モデル概要
モデル特徴
モデル能力
使用事例
language:
- en
- zh
- de
- es
- ru
- ko
- fr
- ja
- pt
- tr
- pl
- ca
- nl
- ar
- sv
- it
- id
- hi
- fi
- vi
- he
- uk
- el
- ms
- cs
- ro
- da
- hu
- ta
- 'no'
- th
- ur
- hr
- bg
- lt
- la
- mi
- ml
- cy
- sk
- te
- fa
- lv
- bn
- sr
- az
- sl
- kn
- et
- mk
- br
- eu
- is
- hy
- ne
- mn
- bs
- kk
- sq
- sw
- gl
- mr
- pa
- si
- km
- sn
- yo
- so
- af
- oc
- ka
- be
- tg
- sd
- gu
- am
- yi
- lo
- uz
- fo
- ht
- ps
- tk
- nn
- mt
- sa
- lb
- my
- bo
- tl
- mg
- as
- tt
- haw
- ln
- ha
- ba
- jw
- su license: mit tags:
- audio
- automatic-speech-recognition widget:
- example_title: Librispeech sample 1 src: https://cdn-media.huggingface.co/speech_samples/sample1.flac
- example_title: Librispeech sample 2 src: https://cdn-media.huggingface.co/speech_samples/sample2.flac pipeline_tag: automatic-speech-recognition base_model:
- openai/whisper-large-v3 library_name: transformers
Whisper
Whisperは、OpenAIのAlec Radfordらによる論文Robust Speech Recognition via Large-Scale Weak Supervisionで提案された、自動音声認識(ASR)および音声翻訳の最先端モデルです。5,000万時間以上のラベル付きデータで訓練されたWhisperは、ゼロショット設定において多くのデータセットやドメインに強く汎化する能力を示しています。
Whisper large-v3-turboは、Whisper large-v3を刈り込んでファインチューニングしたバージョンです。言い換えれば、デコード層の数を32から4に減らした以外は全く同じモデルです。その結果、モデルは大幅に高速化されましたが、品質はわずかに低下しています。詳細はこのGitHubディスカッションで確認できます。
免責事項: このモデルカードの内容は、一部は🤗 Hugging Faceチームによって書かれ、一部は元のモデルカードからコピー&ペーストされています。
使用方法
Whisper large-v3-turboは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-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圧縮率の閾値
"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-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圧縮率の閾値
"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秒のスライスを次々に書き起こします
- チャンク化: 長い音声ファイルを短いものに分割し(セグメント間に小さなオーバーラップあり)、各セグメントを独立して書き起こし、結果の書き起こしを境界でつなぎ合わせます
以下のいずれかのシナリオでは、シーケンシャル長文アルゴリズムを使用する必要があります:
- 書き起こしの精度が最も重要で、速度がそれほど考慮されない場合
- 長い音声ファイルのバッチを書き起こす場合、この場合シーケンシャルのレイテンシはチャンク化と同等で、WERが最大0.5%向上します
逆に、チャンク化アルゴリズムは以下の場合に使用する必要があります:
- 書き起こし速度が最も重要な場合
- 単一の長い音声ファイルを書き起こす場合
デフォルトでは、Transformersはシーケンシャルアルゴリズムを使用します。チャンク化アルゴリズムを有効にするには、chunk_length_s
パラメータをpipeline
に渡します。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-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, # 推論のバッチサイズ - デバイスに基づいて設定
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)
# 静的キャッシュを有効にし、フォワードパスをコンパイル
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ベースのエンコーダ-デコーダモデルで、シーケンス間モデルとも呼ばれます。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 | x | ✓ |
large-v2 | 1550 M | x | ✓ |
large-v3 | 1550 M | x | ✓ |
large-v3-turbo | 809 M | x | ✓ |
ファインチューニング
事前訓練済みのWhisperモデルは、さまざまなデータセットやドメインに強く汎化する能力を示しています。しかし、特定の言語やタスクに対しては、ファインチューニングを通じて予測能力をさらに向上させることができます。ブログ記事Fine-Tune Whisper with 🤗 Transformersでは、わずか5時間のラベル付きデータでWhisperモデルをファインチューニングする手順を段階的に説明しています。
評価された用途
これらのモデルの主な意図されたユーザーは、現在のモデルの堅牢性、汎化性、能力、バイアス、制約を研究するAI研究者です。しかし、Whisperは特に英語音声認識のためのASRソリューションとして開発者にとっても非常に有用です。モデルがリリースされると、「意図された」用途にアクセスを制限したり、何が研究であるかについて合理的なガイドラインを描いたりすることは不可能であることを認識しています。
モデルは主にASRと英語への音声翻訳タスクで訓練および評価されています。約10言語で強いASR結果を示しています。音声活動検出、話者分類、話者ダイアリゼーションなどの特定のタスクでファインチューニングすると、追加の能力を示す可能性がありますが、これらの領域では堅牢に評価されていません。展開前に特定のコンテキストやドメインでモデルを堅牢に評価することを強く推奨します。
特に、個人の同意なしに録音された記録を書き起こしたり、これらのモデルを何らかの主観的分類に使用したりすることに対して警告します。精度の欠陥が顕著な結果の欠陥につながる可能性のある意思決定コンテキストなどの高リスクドメインでの使用は推奨しません。モデルは音声の書き起こしと翻訳を目的としており、分類に使用することは評価されていないだけでなく、特に人間の属性を推論するには適切ではありません。
訓練データ
情報は提供されていません。
性能と制限
私たちの研究によると、多くの既存のASRシステムに比べて、モデルはアクセント、背景ノイズ、専門用語に対する堅牢性が向上し、複数の言語から英語へのゼロショット翻訳が可能であり、音声認識と翻訳の精度はほぼ最先端レベルです。
しかし、モデルは大規模なノイズの多いデータを使用して弱教師ありで訓練されているため、予測には実際には音声入力で話されていないテキスト(つまり、幻覚)が含まれる可能性があります。これは、言語に関する一般的な知識を考慮して、モデルが音声自体を書き起こそうとするのと同時に、音声内の次の単語を予測しようとするためだと仮定しています。
モデルは言語間で不均一な性能を示し、リソースが少ない、または発見可能性が低い言語、または訓練データが少ない言語では精度が低くなります。また、特定の言語の異なるアクセントや方言で異なる性能を示し、性別、人種、年齢、その他の人口統計学的基準が異なる話者間で単語誤り率が高くなる可能性があります。完全な評価結果は、このリリースに伴う論文に記載されています。
さらに、モデルのシーケンス間アーキテクチャは繰り返しテキストを生成しやすい傾向があり、ビームサーチや温度スケジューリングである程度軽減できますが、完全ではありません。これらの制限に関するさらなる分析は論文で提供されています。この動作と幻覚は、リソースが少ない、または発見可能性が低い言語ではさらに悪化する可能性があります。
広範な影響
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}
}



