WhisperはOpenAIが公開している学習済みの音声認識モデルで、PyTorchで動かすときに書くのは学習コードではなく推論コードです。CUDA版のPyTorchとFFmpegを入れ、pip install -U openai-whisper のあと2行書けば日本語の文字起こしが動きます。この記事では、インストール手順とGPUの確認、openai-whisper・faster-whisper・Transformersの3実装のコード、モデルサイズの選び方、torchaudio 2.9以降の前処理の書き方、つまずきやすいエラーの対処までを、2026年10月時点の版でまとめます。
掲載コードのうち、openai-whisper 20250625・faster-whisper 1.2.1・Transformers 4.46.3の例はCPU環境(PyTorch 2.2.2)で実行を確認しました。GPU構成、Transformers 5.19.0、TorchCodecの例は、各プロジェクトの公式ドキュメントとソースコードに基づいています。
まとめ:Whisperの推論実行と3実装の選択
- Whisperは追加学習なしで動く。MFCCを自作してモデルを学習させる工程は不要で、重みをダウンロードして
transcribe()を呼ぶだけです。 - インストールはCUDA版PyTorchが先。WindowsやmacOSでは、pipが依存関係として入れるtorchがCUDA非対応のビルドになります。openai-whisperにはFFmpegも別途必要です。
- まず動かすならopenai-whisper(PyPI最新は20250625)、長尺や大量処理ならfaster-whisper 1.2.1(CTranslate2実装・PyTorch非依存)、Hugging Faceの他モデルと組むならTransformers。
- 日本語の第一候補はturboかlarge-v3。turboは翻訳に使えず、VRAMは約6GB、large-v3は約10GBが目安です。
- torchaudio 2.9以降の
torchaudio.loadはTorchCodecが必要。Whisperの前処理だけならTorchCodecのAudioDecoderで16kHz・モノラルに変換して渡すのが現行の書き方です。
Whisperの仕組み:学習済みのencoder-decoder型Transformer
Whisperは、大量の音声で事前学習されたsequence-to-sequenceのTransformerです。初期モデルは68万時間のラベル付き音声で、large-v3はモデルカードによると弱ラベル付き音声100万時間と、large-v2で作った疑似ラベル付き音声400万時間で学習されています。openai/whisperのREADMEは、多言語の音声認識・英語への音声翻訳・言語識別をひとつのモデルで扱い、タスクはデコーダに渡す特殊トークンで切り替えると説明しています。重みとコードはMITライセンスで公開されています。
処理は3段です。入力音声を16kHzに揃えて対数メルスペクトログラムへ変換し、エンコーダが30秒単位で符号化し、デコーダがその表現からトークンを自己回帰生成します。メルスペクトログラムへの変換はWhisper側が行うため、特徴量設計や音響モデル・言語モデルの学習は利用者の仕事ではありません。
インストール手順:CUDA版PyTorch・openai-whisper・FFmpeg
CUDA版PyTorchの選択と事前インストール
openai-whisperは依存関係に版指定なしの torch を持つため、PyTorchが入っていない環境で先に pip install openai-whisper を実行すると、pipがPyPIの既定ビルドのtorchを入れます。LinuxではPyPIのtorchがCUDA対応ですが、WindowsとmacOSではCUDA非対応のビルドが入ります。CUDAの版を自分の環境に合わせるためにも、PyTorch公式のインストールページで自分のCUDAに合うコマンドを選び、Whisperより先に入れておくのが確実です。インデックスURLの末尾(cu126・cu130 など)がCUDAの版です。
# 例:CUDA 13.0向けのPyTorch(版は公式ページのセレクタで確認する)
pip install torch --index-url https://download.pytorch.org/whl/cu130
# その後にWhisper本体
pip install -U openai-whisper
OpenAIはWhisperをPython 3.9.9とPyTorch 1.10.1で学習・評価し、近年のPyTorchでも動く見込みとしています。PyPIのメタデータ上の要件はPython 3.8以上です。
FFmpegのOS別インストール
openai-whisperは音声ファイルのデコードにFFmpegのコマンドラインツールを呼び出します。pipでは入らないので、OSのパッケージマネージャーで導入します。READMEが挙げるのは次のコマンドです。FFmpeg自体の版や確認方法はFFmpegの最新バージョンは9.0|8.1・8.0との違いとインストール・確認方法【2026年9月】で扱っています。
# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg
# macOS(Homebrew)
brew install ffmpeg
# Windows(Chocolatey または Scoop)
choco install ffmpeg
scoop install ffmpeg
PyTorchのCUDA利用可否の確認
インストール後、PyTorchからCUDAを使えるかを確かめます。is_available() が False のとき、torch.version.cuda が None ならCPU版のtorchです。版番号が出ているのに False なら、GPUドライバーの未導入や版の不一致、GPUが認識されていないことを疑います。
import torch
print(torch.__version__) # 例: 2.14.1+cu130 のように +cuXXX が付くか
print(torch.version.cuda) # CPU版では None
print(torch.cuda.is_available()) # True ならGPUで推論できる
openai-whisperによる日本語文字起こし
Pythonのtranscribe()による推論実行
whisper.load_model() にモデル名を渡すと、初回だけ重みが ~/.cache/whisper にダウンロードされます。transcribe() は30秒の窓をずらしながら音声全体を処理し、全文を text、区間ごとの結果を segments に返します。
import torch
import whisper
device = "cuda" if torch.cuda.is_available() else "cpu"
model = whisper.load_model("turbo", device=device)
result = model.transcribe(
"meeting.mp3",
language="ja", # 日本語と分かっているなら明示する
fp16=torch.cuda.is_available(), # CPUでは半精度が使えない
)
print(result["text"])
for seg in result["segments"]:
print(f"[{seg['start']:.2f}-{seg['end']:.2f}] {seg['text']}")
fp16 の既定は True で、CPUで実行すると「FP16 is not supported on CPU; using FP32 instead」という警告を出してFP32に切り替わります。上のように torch.cuda.is_available() を渡しておけば警告は出ません。language を省くと冒頭の音声から言語を自動判定しますが、無音や短い音声では誤判定することがあるため、日本語と決まっているなら指定した方が安定します。
コマンドラインでのSRT・VTT字幕出力
CLIの既定モデルは turbo で、--output_format を省くと txt・vtt・srt・tsv・json の5形式をまとめて出力します。字幕に使うならsrtかvttを指定します。
whisper meeting.mp3 --language Japanese --model turbo --output_format srt --output_dir out
Pythonから同じファイルを書き出すときは、whisper.utils.get_writer("srt", "out") で取得したライターに transcribe() の結果を渡します。
initial_promptによる固有名詞の表記補正
Whisperは製品名や人名をカタカナや同音の別語で書き起こすことがあります。initial_prompt に出てくる語を並べておくと、表記がその語に寄ります。たとえば「本日は音声認識モデルのウィスパーについて説明します。パイトーチで動かす方法を見ていきましょう。」という約8秒の合成音声(macOSの読み上げ音声Kyokoで16kHz出力)をbaseモデルで処理したところ、指定なしでは「ワイスパー」「バイトーチ」と書き起こされ、句読点もつきませんでした。
model = whisper.load_model("base", device=device)
result = model.transcribe("sample_ja.wav", language="ja", initial_prompt="Whisper、PyTorch")
# 指定なし: 本日は音声認識モデルのワイスパーについて説明しますバイトーチで動かす方法を見ていきましょう
# 指定あり: 本日は、音声認識モデルの Whisperについて説明します。PyTorchで動かす方法を見ていきましょう。
プロンプトの語に句読点を含めると、出力にも句読点がつきやすくなります。initial_prompt がデコーダに渡されるのは最初の30秒の窓で、後続の窓には既定の condition_on_previous_text=True により直前の出力が引き継がれます。すべての窓にプロンプトを付けたい場合は carry_initial_prompt=True を指定します(前の出力を引き継ぐ効果は弱まる場合があります)。
faster-whisperで速くする:CTranslate2版の使い方
基本コードとcompute_type
SYSTRANのfaster-whisperは、Whisperの重みを推論エンジンCTranslate2で動かす再実装です。READMEは「openai/whisperと同じ精度で最大4倍高速、メモリも少ない」としています。PyPIの依存関係は ctranslate2・av・onnxruntime などで、PyTorchには依存しません。音声はPyAVでデコードするため、FFmpegの別途インストールも不要です。
pip install faster-whisper
from faster_whisper import WhisperModel
# GPU: float16 / GPUでメモリを減らす: int8_float16 / CPU: int8
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe("meeting.mp3", language="ja", beam_size=5, vad_filter=True)
print(info.language, info.duration)
for seg in segments: # segmentsはジェネレータ。反復した時点で推論が走る
print(f"[{seg.start:.2f}-{seg.end:.2f}] {seg.text}")
vad_filter=True はSilero VADで無音区間を除き、無音部分での幻聴(存在しない文の出力)を減らします。segments はジェネレータなので、transcribe() を呼んだだけでは処理が終わっていません。処理時間を測るときは、ループを回し切るか list(segments) で展開してから計測してください。int8量子化の考え方は量子化(モデル量子化)とは?仕組み・PTQとQATの違いと実装判断を解説【2026年版】で詳しく扱っています。
GPU要件:CUDA 12とcuDNN 9
faster-whisper 1.2.1のREADMEは、GPU実行の要件を「cuBLAS for CUDA 12」と「cuDNN 9 for CUDA 12」としています。PyTorchはCUDAライブラリを同梱したホイールで入るのに対し、CTranslate2はシステムかpipで入れたcuBLAS・cuDNNを探すため、PyTorchが動く環境でもfaster-whisperだけGPUで落ちることがあります。Linuxではpipで入れてライブラリパスを通す方法がREADMEに載っています。
pip install nvidia-cublas-cu12 "nvidia-cudnn-cu12==9.*"
export LD_LIBRARY_PATH=$(python3 -c 'import os, nvidia.cublas, nvidia.cudnn; print(os.path.dirname(nvidia.cublas.__path__[0]) + "/cublas/lib:" + os.path.dirname(nvidia.cudnn.__path__[0]) + "/cudnn/lib")')
CUDA 12とcuDNN 8の環境では、ctranslate2==4.4.0 に下げる回避策が案内されています。READMEにはCUDA 11向けに ctranslate2==3.24.0 へ下げる方法も載っていますが、faster-whisper 1.2.1の依存条件は ctranslate2>=4.0,<5 なので、この組み合わせは1.2.1では使えません。CUDA 11の環境は、CUDA 12へ上げるか、faster-whisper自体の版を下げて合わせる必要があります。
長尺音声のバッチ推論と処理時間・VRAMの比較
BatchedInferencePipeline は WhisperModel.transcribe と同じ呼び方で使え、音声を区間に分けてまとめて推論します。バッチ推論ではVADが既定で有効です。
from faster_whisper import WhisperModel, BatchedInferencePipeline
model = WhisperModel("turbo", device="cuda", compute_type="float16")
batched = BatchedInferencePipeline(model=model)
segments, info = batched.transcribe("meeting.mp3", language="ja", batch_size=16)
print("".join(seg.text for seg in segments))
READMEのベンチマーク(13分の音声・large-v2・RTX 3070 Ti 8GB・CUDA 12.4・beam size 5)では、実装による差が次のように出ています。
| 実装 | 精度 | 処理時間 | VRAM |
|---|---|---|---|
| openai/whisper | fp16 | 2分23秒 | 4,708MB |
| transformers(SDPA) | fp16 | 1分52秒 | 4,960MB |
| faster-whisper | fp16 | 1分03秒 | 4,525MB |
| faster-whisper(batch_size=8) | fp16 | 17秒 | 6,090MB |
| faster-whisper | int8 | 59秒 | 2,926MB |
計測時の版はopenai/whisper v20240930・transformers v4.46.3・faster-whisper v1.1.0で、現行版とは異なります。openai/whisperからfaster-whisperのバッチ推論に替えると約8.4倍(143秒→17秒)、faster-whisperの中でバッチ化した効果だけを見ると約3.7倍(63秒→17秒)です。その代わり、この条件ではVRAM使用量が4,525MBから6,090MBに増えました。
TransformersでWhisperを使う:pipelineと長尺音声
Hugging Face Transformers(PyPI最新は5.19.0)にもWhisperの実装があり、他のモデルやデータセット処理と同じAPIで扱えます。手早く使うなら pipeline、トークン単位で制御するなら WhisperProcessor と WhisperForConditionalGeneration を直接使います。インストールガイドによると、現行版はPython 3.10以上・PyTorch 2.5以上で検証されています。openai-whisperより要件が新しい点に注意してください。
pip install -U transformers accelerate
import torch
from transformers import pipeline
pipe = pipeline(
"automatic-speech-recognition",
model="openai/whisper-large-v3-turbo",
dtype=torch.float16,
device=0, # GPU番号。CPUは -1
)
result = pipe(
"meeting.mp3",
generate_kwargs={"language": "ja", "task": "transcribe"},
return_timestamps=True, # 30秒を超える音声では必須
)
print(result["text"])
print(result["chunks"][:3]) # [{'timestamp': (0.0, 4.6), 'text': '...'}, ...]
Transformersの generation_whisper.py は「30秒を超える音声では return_timestamps=True の設定が必要」と明記しています。一方、chunk_length_s でチャンクに分ける方式は、パイプラインのソースが「seq2seqモデルではvery experimental」と警告しています。長尺音声は return_timestamps=True を付けた逐次処理を基本にしてください。return_timestamps="word" にすると単語単位の近似時刻が返ります。
配列を渡す場合は {"raw": 配列, "sampling_rate": 16000} の辞書形式にします。
モデルサイズの選び方:tiny〜large・turbo
openai/whisperのREADMEに載っている公式の目安です。相対速度はlargeを1倍とした値で、A100で英語音声を処理して測ったものです。READMEは、言語・話す速さ・ハードウェアによって実際の速度は大きく変わるとしています。
| モデル | パラメータ | 必要VRAM | 相対速度 | 英語専用版 |
|---|---|---|---|---|
| tiny | 39M | 約1GB | 約10倍 | tiny.en |
| base | 74M | 約1GB | 約7倍 | base.en |
| small | 244M | 約2GB | 約4倍 | small.en |
| medium | 769M | 約5GB | 約2倍 | medium.en |
| large | 1550M | 約10GB | 1倍 | なし |
| turbo | 809M | 約6GB | 約8倍 | なし |
turboは蒸留モデルではありません。Hugging Faceのモデルカードによると、large-v3のデコーダ層を32層から4層に減らして微調整したモデルで、エンコーダはlarge-v3と同じです。READMEは精度の低下が小さいとする一方、翻訳タスクでは学習されていないと明記しており、task="translate" を指定しても元の言語のまま返ります。日本語の音声を英語に訳したいなら、mediumかlargeを使います。
選び方は、GPUのVRAMで上限を決めてから精度で詰めるのが早道です。VRAMが8GBならturbo、12GB以上ならlarge-v3も候補に入ります。8GB未満ならmediumかsmall、CPUだけの環境ではfaster-whisperのint8でsmallかturboを試します。tinyとbaseは、実際の録音を数分ぶん書き起こして固有名詞と同音異義語の誤りを数え、許容できなければ一段上のモデルに切り替える、という順で判断します。
torchaudio 2.9以降の音声前処理:TorchCodecへの移行
「whisper pytorch」で探すと、torchaudioで音声を読み込んでからWhisperに渡す古いコード例が多く見つかります。このコードは、torchaudio 2.9以降の環境ではそのままでは動かないことがあります。torchaudioのREADMEによると、torchaudioはメンテナンス段階に移り、一部の機能を2.8で非推奨にして2.9で削除しました。PyPIの最新は2.11.0(2026年3月23日公開)です。
torchaudio.loadのドキュメントは、2.9以降の torchaudio.load は内部でTorchCodecの AudioDecoder を使い、引数の normalize・buffer_size・backend は互換性のために受け付けるだけで無視されると説明しています。torchcodecが入っていなければ読み込めません。ドキュメント自体も、TorchCodecのAPIを直接使う書き方への移行を勧めています。
Whisperの前処理なら、TorchCodecの AudioDecoder でデコード・16kHzへのリサンプリング・モノラル化を一度に済ませられます。TorchCodecはシステムのFFmpeg(4〜9系、共有ライブラリ付き)を使います。torchとの対応はTorchCodecのREADMEの互換表で決まっており、0.12以降はtorch 2.11以上、torch 2.9の環境なら0.8か0.9です。
pip install torchcodec # torch 2.11以上の場合
pip install "torchcodec==0.9.*" # torch 2.9の場合
from torchcodec.decoders import AudioDecoder
import whisper
decoder = AudioDecoder("meeting.mp3", sample_rate=16000, num_channels=1)
samples = decoder.get_all_samples() # data: (チャンネル数, サンプル数) のfloat32、値は[-1, 1]
audio = samples.data[0].numpy() # 1次元の16kHz波形
model = whisper.load_model("turbo")
result = model.transcribe(audio, language="ja")
print(result["text"])
openai-whisperの transcribe() はファイルパスだけでなく、16kHzのfloat32配列も受け取ります。区間の切り出しや特定チャンネルの抽出を前段で済ませたいときは、この書き方が使えます。torchaudioを残す場面は、torchaudio.functional.resample や MelSpectrogram などテンソル上の変換に絞られます。WhisperのためにMFCCを計算する必要はありません。
つまずきやすいエラーと対処
torch.cuda.is_available()がFalseになる:まずtorch.version.cudaを確認します。NoneならCPU版なので、pip uninstall torchのあと公式ページのCUDA版コマンドで入れ直します。版番号が出ているなら、nvidia-smiでドライバーとGPUが見えているかを確かめます。FileNotFoundError: [Errno 2] No such file or directory: 'ffmpeg':openai-whisperにファイルパスを渡したとき、FFmpegが無いと出ます。FFmpegを入れてPATHを通すか、上のように配列で渡します。CUDA out of memory(OutOfMemoryError):モデルがVRAMに収まっていません。モデルを一段小さくするか、faster-whisperのint8_float16に切り替えます。バッチ推論ではbatch_sizeを下げます。pip install openai-whisperがtiktokenのビルドで失敗する:tiktokenのビルド済みホイールが無い環境です。READMEの指示どおりRustを入れ、No module named 'setuptools_rust'が出たらpip install setuptools-rustを実行します。- faster-whisperでcuDNNのライブラリが見つからない:cuDNN 9とcuBLAS(CUDA 12向け)が入っていないか、ライブラリパスが通っていません。前章の
nvidia-cudnn-cu12の手順か、ctranslate2のダウングレードで合わせます。 - 無音区間で同じ文を繰り返す:Whisperの幻聴です。faster-whisperなら
vad_filter=True、openai-whisperならcondition_on_previous_text=Falseで前の窓の出力を引き継がないようにすると減ります。
3実装の選び方と、自作学習を避ける理由
実装は用途で決まります。まず精度と挙動を見る段階、CLIで字幕を作るだけの用途はopenai-whisperで足ります。録音の総時間に対して処理が期限内に終わらない、あるいはGPUの占有時間を減らしたいなら、faster-whisperのバッチ推論に移すべきです。READMEのベンチマークでは、openai/whisperとの差がfp16同士で約2.3倍、バッチ推論との比較で約8.4倍あり、処理する音声が増えるほどGPU時間の差が積み上がります。Transformersは、話者分離や要約など他のHugging Faceモデルと同じパイプラインで組む場合と、ファインチューニングをする場合に選びます。
避けるべきなのは、MFCCとRNNやTransformerを組んでWhisper相当のモデルをゼロから学習する構成です。公式モデルはlarge-v3で数百万時間規模の音声を使っており、同等の学習データの収集とGPU時間を自前で用意するのは現実的ではありません。専門用語が多い領域でも、まず initial_prompt を試し、足りなければ学習済みWhisperのファインチューニングに進むのが順当です。
ローカル実行が合わない場面もあります。GPUを用意できない、話者分離や長時間の同時通訳まで必要、といった要件では、クラウドの文字起こしAPIの方が早く安く済むことがあります。各社APIの料金と日本語対応は文字起こしAPIの比較と選び方|主要7サービスの料金・日本語対応・使い方【2026年最新】で比較しています。Whisperより軽いオンデバイス向けモデルを探しているなら、Moonshine Voiceとは?STT・TTSとWhisper比較、日本語モデルと導入手順【v0.1.5】も候補です。業務システムに音声認識を組み込む設計から任せたい場合は、AI音声認識システム開発の支援内容も参考にしてください。
よくある質問
WhisperはPyTorchが必要ですか?
openai-whisperとTransformers実装はPyTorch上で動くため必要です。GPUを使うならCUDA版のPyTorchを先に入れてください。faster-whisperはCTranslate2で動き、PyTorchには依存しません。
torchaudioでMFCCを計算してWhisperに渡す必要はありますか?
必要ありません。メルスペクトログラムへの変換はWhisperが内部で行うので、渡すのは16kHzの波形かファイルパスだけです。torchaudio 2.9以降で読み込むにはtorchcodecが要るため、TorchCodecの AudioDecoder を直接使う方が手数が少なく済みます。
openai-whisperとfaster-whisperの違いは何ですか?
同じWhisperの重みを使い、推論エンジンが違います。faster-whisperはREADMEで同じ精度のまま最大4倍速いとされ、int8量子化とバッチ推論に対応する一方、GPU実行にはCUDA 12向けのcuBLASとcuDNN 9が別途必要です。
Whisperの日本語文字起こしにはどのモデルが良いですか?
速度と精度の両立ならturbo(VRAM約6GB)、精度を最優先するならlarge-v3(約10GB)です。日本語を英語に訳す用途では、翻訳に対応していないturboではなくmediumかlargeを選びます。
GPUがなくてもWhisperは動きますか?
CPUでも動きます。faster-whisperのREADMEでは、Core i7-12700Kの8スレッドで13分の音声をsmallモデルで処理すると、openai-whisperの6分58秒に対してfaster-whisperのint8は1分42秒でした。CPUならfaster-whisperの compute_type="int8" が現実的です。