WhisperをPyTorchで動かす音声認識実装ガイド|openai-whisper・faster-whisper・Transformers
「whisper pytorch」で実装を探すとき、まず正しておきたい前提があります。Whisperは自分でMFCCを計算し、RNNやTransformerをゼロから学習して作るモデルではありません。OpenAIが68万時間の音声で事前学習して公開した学習済みモデルで、PyTorch上でパッケージを入れて音声ファイルを渡すだけで文字起こしが動きます。この記事では、openai-whisper・faster-whisper・Transformersの3つの実装、モデルサイズの選び方、torchaudioの正しい使いどころ、日本語とGPUの設定を、動くコードで解説します。
まとめ:Whisperは学習済みモデル、PyTorchでは「使う」だけ
- WhisperはOpenAIの学習済みencoder-decoder Transformer。追加学習なしで動く(ゼロショット)。自前でMFCC抽出やモデル学習をする必要はありません。
- 最短ルートは公式パッケージ openai-whisper。
pip install -U openai-whisperのあとwhisper.load_model()とtranscribe()の2行で文字起こしできます。 - 速度が要るなら faster-whisper(CTranslate2実装、同じ精度で最大4倍高速・低メモリ)。他のHuggingFaceモデルと組むなら Transformers(
WhisperForConditionalGeneration)。 - torchaudioの役割は音声の読み込みと16kHzリサンプリング。学習用の特徴量を作る道具ではありません。
- 日本語は
language="ja"、GPUはdevice="cuda"と半精度(fp16)で速くなります。
以降で、3つの実装コードとモデル選定、日本語・GPU設定を順に見ていきます。
Whisperとは:OpenAIが公開する学習済み音声認識モデル
Whisperは、OpenAIが2022年に公開した汎用音声認識(ASR)モデルです。ラベル付き音声データ68万時間で事前学習されており、英語をはじめ多言語の文字起こしと、非英語音声から英語への翻訳を、追加の微調整なしにそのまま実行できます(HuggingFace Transformers公式ドキュメントは「Whisper just works out of the box」と明記)。重みはApache-2.0ライセンスで配布され、ローカルでもクラウドでも動かせます。
ここが旧来の音声認識実装と大きく違う点です。従来はMFCCなどの特徴量を設計し、音響モデルと言語モデルを自前のデータで学習させる必要がありました。Whisperでは、その学習済みの重みをダウンロードして推論するだけです。「whisper pytorch」で必要になるのは学習コードではなく、モデルをロードして音声を渡す推論コードです。
Whisperの仕組み:encoder-decoder型Transformer
Whisperの中身は、音声を入力にとるエンコーダと、テキストを出力するデコーダを組み合わせたsequence-to-sequence(seq2seq)のTransformerです。処理の流れは次のようになります。
- 前処理:入力音声を16kHzに揃え、対数メルスペクトログラムに変換する(この変換はモデル側が内部で行うため、利用者が用意するのは16kHzの音声)。
- エンコーダ:メルスペクトログラムをTransformerで符号化し、音声の表現ベクトルを得る。
- デコーダ:その表現を条件にトークンを自己回帰生成する。言語指定・文字起こし/翻訳の切り替え・タイムスタンプ出力といったタスクは、デコーダ入力の特殊トークンで制御される。
つまりデコーダ入力のトークンを変えるだけで、同じモデルが「日本語の文字起こし」にも「英語への翻訳」にもなります。この設計のおかげで、利用者側はタスクごとにモデルを学習し直す必要がありません。
PyTorchでWhisperを動かす3つの実装
Whisperを動かす主な選択肢は3つです。いずれもPyTorchベースで、目的に応じて使い分けます。まず動かすなら公式のopenai-whisper、速度優先ならfaster-whisper、他のHuggingFaceパイプラインに組み込むならTransformers実装です。
openai-whisper:公式パッケージで最短に動かす
OpenAI公式の実装です。インストール後、モデル名を指定してロードし、音声ファイルのパスを渡すだけで文字起こしできます。音声の読み込み・リサンプリングは内部でFFmpegが行うため、対応形式ならそのまま渡せます(別途FFmpegのインストールが必要)。
pip install -U openai-whisper
import whisper
model = whisper.load_model("turbo") # tiny/base/small/medium/large/turbo
result = model.transcribe("audio.mp3", language="ja")
print(result["text"])
コマンドラインでも実行でき、日本語は言語名で指定します。whisper audio.mp3 --language Japanese --model large-v3 のように書きます。手軽さが最大の利点で、まず精度と挙動を確認する用途に向きます。
faster-whisper:CTranslate2で最大4倍高速
SYSTRANが公開するfaster-whisperは、同じWhisperの重みを推論エンジンCTranslate2で動かす再実装です。公式READMEは、openai-whisperと同じ精度で最大4倍高速・低メモリと記載しています。int8量子化でさらに軽くでき、音声デコードはPyAV(FFmpegを内包)で行うためFFmpegの別途インストールが不要です(最新はv1.2.1/2025-10-31)。
pip install faster-whisper
from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe("audio.mp3", language="ja", beam_size=5)
for seg in segments:
print(f"[{seg.start:.2f}-{seg.end:.2f}] {seg.text}")
長い音声やまとまった件数を回すバッチ処理では、この速度差とメモリ削減が効きます。segments はジェネレータで、反復して初めて実際の推論が走る点に注意してください。
Transformers:WhisperForConditionalGenerationで統合
HuggingFace Transformersにも実装があり、他のモデルやデータセット処理と同じAPIで扱えます。手早く使うなら pipeline、細かく制御するなら WhisperForConditionalGeneration と WhisperProcessor を直接使います。モデルIDはHub上の名前を指定します。
from transformers import pipeline
pipe = pipeline(
task="automatic-speech-recognition",
model="openai/whisper-large-v3-turbo",
device=0, # GPU番号。CPUは -1
)
result = pipe(
"audio.mp3",
generate_kwargs={"language": "ja", "task": "transcribe"},
return_timestamps=True, # 30秒超の長尺はチャンク分割に必要
)
print(result["text"])
Whisperは30秒単位で処理する設計のため、それより長い音声を pipeline で扱うときは return_timestamps=True を付けてチャンク分割させます。既存のTransformersワークフローに音声認識を足したい場合はこの実装が噛み合います。
モデルサイズの選び方:tiny〜large・turbo
Whisperは6系統のサイズがあり、精度・速度・必要VRAMがトレードオフになります。相対速度はlarge(1x)を基準にした公式READMEの値です。turboはlarge-v3を蒸留した高速版で、精度をほぼ保ったままlargeより大幅に速い一方、翻訳タスクには対応しません(日本語→英語翻訳が必要ならlargeなど多言語モデルを使う)。
| モデル | パラメータ | 必要VRAM | 相対速度 | 備考 |
|---|---|---|---|---|
| tiny | 39M | 約1GB | 約10倍 | 英語専用版tiny.enあり |
| base | 74M | 約1GB | 約7倍 | 英語専用版base.enあり |
| small | 244M | 約2GB | 約4倍 | 実用の下限目安 |
| medium | 769M | 約5GB | 約2倍 | 精度と速度の中庸 |
| large | 1550M | 約10GB | 1倍 | 多言語のみ・最高精度 |
| turbo | 809M | 約6GB | 約8倍 | large-v3の蒸留・翻訳非対応 |
日本語の文字起こし精度を重視するなら large-v3 か、速度と精度の両立を狙う turbo が実務の第一候補です。CPUしかない・短い音声を試すだけなら small まで下げても実用になります。tiny・base は精度が落ちるため、下書きやリアルタイム用途に限定するのが無難です。
torchaudioの正しい使いどころ:音声読み込みと16kHzリサンプリング
「torchaudio」で検索してこの記事に来た場合、旧来よく見かける「torchaudioでMFCCを計算してモデルに学習させる」という説明は、Whisperには当てはまりません。Whisperは学習済みで、しかもメルスペクトログラムへの変換をモデル側が内部で行うため、利用者がMFCCや特徴量を作る工程は不要です。torchaudioの役割は、音声ファイルの読み込みとサンプリングレート変換に絞られます。
import torchaudio
waveform, sr = torchaudio.load("audio.wav") # (channel, time), sr=元のレート
if sr != 16000:
waveform = torchaudio.functional.resample(waveform, sr, 16000)
audio = waveform.mean(dim=0).numpy() # モノラル化してNumPy配列へ
import whisper
model = whisper.load_model("large-v3")
result = model.transcribe(audio, language="ja") # 16kHz float配列を直接渡せる
print(result["text"])
openai-whisperの transcribe() は、パスだけでなく16kHzのfloat配列も受け取れます。前段でノイズ除去やチャンネル選択、区間の切り出しをtorchaudioで済ませ、その結果をWhisperに渡す——これがtorchaudioの実務的な使い方です。
採用すべきでないパターンを明確にしておきます。ゼロからMFCC+RNN/Transformerを学習してWhisper相当を自作する構成は、68万時間で事前学習された公式モデルの精度に到底届かず、学習コストだけがかかります。特定ドメインに合わせたい場合でも、自作ではなく学習済みWhisperのファインチューニング(Transformers+PEFT等)から検討するのが順当です。
日本語文字起こしとGPU実行
日本語の指定と精度
日本語は言語コードで明示します。openai-whisperとTransformersは language="ja"、CLIは --language Japanese です。指定を省くとWhisperが冒頭から言語を自動判定しますが、無音や短い音声で誤判定することがあるため、日本語だと分かっているなら明示した方が安定します。精度はモデルサイズに素直に依存し、日本語ではlarge-v3系が最も安定した結果を出します。
GPU実行と半精度(fp16)
WhisperはPyTorchで動くため、CUDA対応GPUがあれば自動的に高速化できます。デバイスを明示し、GPUでは半精度で動かすとメモリと速度が改善します。
import torch, whisper
device = "cuda" if torch.cuda.is_available() else "cpu"
model = whisper.load_model("large-v3", device=device)
result = model.transcribe("audio.mp3", language="ja", fp16=torch.cuda.is_available())
print(result["text"])
GPUが無くてもCPUで動作します。その場合はsmallやturbo以下に落として実用速度を確保するか、int8量子化が効くfaster-whisperを使うのが現実的です。必要VRAMは上のモデル表が目安で、largeは約10GB、turboは約6GBを見込みます。
よくある質問
WhisperはPyTorchが必要ですか?
公式のopenai-whisperとTransformers実装はPyTorch上で動くため、PyTorchが必要です(インストール時に依存として入ります)。ただし利用者が書くのは学習コードではなく推論コードで、モデルをロードして音声を渡すだけです。faster-whisperはPyTorchではなくCTranslate2を推論エンジンに使う実装で、より軽量に動きます。
torchaudioでMFCCを計算してWhisperに渡す必要はありますか?
必要ありません。Whisperは入力音声を対数メルスペクトログラムへ変換する処理を内部に持っているため、利用者がMFCCや特徴量を作る工程は不要です。torchaudioを使う場面は、音声ファイルの読み込みと16kHzへのリサンプリング、モノラル化といった前段の整形に限られます。
openai-whisperとfaster-whisperはどちらを使うべきですか?
まず動かして精度を確認する段階や、CLIで手軽に使いたい場合はopenai-whisperが向きます。長尺・大量の音声をさばく本番処理では、同じ精度で最大4倍高速・低メモリのfaster-whisperが有利です。int8量子化でCPU実行も現実的になります。
Whisperの日本語文字起こしはどのモデルが良いですか?
日本語の精度を最優先するならlarge-v3、速度と精度を両立したいならlarge-v3の蒸留版であるturboが第一候補です。GPUのVRAMが少ない環境ではmediumやsmallに下げます。翻訳(日本語→英語)も行う場合は、翻訳非対応のturboではなくlargeなどの多言語モデルを選びます。
GPUがなくてもWhisperは動きますか?
動きます。CPUのみでも実行できますが、largeは実用的な速度が出にくいため、smallやturbo以下に下げるか、int8量子化に対応したfaster-whisperを使うのが現実的です。短い音声の試用ならtiny・baseでも動作を確認できます。