語学学習に最適! Whisper で動画に字幕をつけてみよう!
はじめに
「試験のための英語」ではなく「生きた英語」を身につけたいと考え、
昔見ていた海外コメディドラマシリーズを字幕付きで視聴しようとしました。
しかし、サブスクリプションサービスでは配信されておらず、
YouTube に動画があるのを知りました。
視聴してみると、YouTube の字幕(Closed Caption: CC)が、
有効な動画とそうでない動画が混在していることがわかりました。
そこで、字幕が有効でない動画を字幕付きで視聴するために、
文字起こしの方法を探すことにしました。
OpenAI Whisper を使えば高精度な文字起こしが可能になるとの情報を得て、
実際に試してみることにしました。
本記事では、この Whisper を用いた文字起こしの全手順を詳しく説明します。
目的
字幕のついていない動画から、音声を抽出し、OpenAI Whisperを用いて文字起こしを行い、
高精度な字幕付きで視聴できるようにすること。
対象読者
- 海外ドラマや映画など、字幕のない動画を字幕付きで視聴・鑑賞したい方
- 高精度な文字起こし技術である OpenAI Whisper の利用方法を知りたい方
環境
- yt-dlp YouTube 動画の Downloader
- Python
- openai-whisper
- ffmpeg openai-whisper 利用時に必要
- VLC Media Player 字幕を確認するための動画再生ソフト
事前準備
まず、字幕を付けたい対象の動画をダウンロードしてください。
本記事では、例として以下の動画ファイルを使用します。
CC のボタンを押すと、closed caption unavaialbe と表示し、
字幕付きの動画でないことがわかります。

[nix-shell:/tmp/English]$ yt-dlp --version
2025.09.26
[nix-shell:/tmp/English]$ yt-dlp -f b[ext=mp4] --output '%(title)s.%(ext)s' https://youtu.be/OYSinG2DxN4?si=LNx12XFqwSGDWdbP
[youtube] Extracting URL: https://youtu.be/OYSinG2DxN4?si=LNx12XFqwSGDWdbP
[youtube] OYSinG2DxN4: Downloading webpage
[youtube] OYSinG2DxN4: Downloading tv client config
[youtube] OYSinG2DxN4: Downloading tv player API JSON
[youtube] OYSinG2DxN4: Downloading web safari player API JSON
[youtube] OYSinG2DxN4: Downloading m3u8 information
[info] OYSinG2DxN4: Downloading 1 format(s): 95
[download] Sleeping 5.00 seconds as required by the site...
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 240
[download] Destination: Dharma & Greg 1x22 - "Much Ado During Nothing".mp4
[download] 100% of 190.69MiB in 00:01:30 at 2.12MiB/s
[FixupM3u8] Fixing MPEG-TS in MP4 container of "Dharma & Greg 1x22 - "Much Ado During Nothing".mp4"
次に、文字起こしの対象となる動画の音声ファイルをダウンロードします。
これは、後に実行する Whisper CLI が音声ファイルを処理対象とするためです。
[nix-shell:/tmp/English]$ yt-dlp -t mp3 --output '%(title)s.%(ext)s' https://youtu.be/OYSinG2DxN4?si=LNx12XFqwSGDWdbP
[youtube] Extracting URL: https://youtu.be/OYSinG2DxN4?si=LNx12XFqwSGDWdbP
[youtube] OYSinG2DxN4: Downloading webpage
[youtube] OYSinG2DxN4: Downloading tv client config
[youtube] OYSinG2DxN4: Downloading tv player API JSON
[youtube] OYSinG2DxN4: Downloading web safari player API JSON
[youtube] OYSinG2DxN4: Downloading m3u8 information
[info] OYSinG2DxN4: Downloading 1 format(s): 251
[download] Sleeping 4.00 seconds as required by the site...
[download] Destination: Dharma & Greg 1x22 - "Much Ado During Nothing".webm
[download] 100% of 16.15MiB in 00:00:05 at 3.00MiB/s
[ExtractAudio] Destination: Dharma & Greg 1x22 - "Much Ado During Nothing".mp3
Deleting original file Dharma & Greg 1x22 - "Much Ado During Nothing".webm (pass -k to keep)
これで、字幕を生成するための動画ファイルと音声ファイル、両方の準備が整いました。
[nix-shell:/tmp/English]$ ls -1
'Dharma & Greg 1x22 - "Much Ado During Nothing".mp3'
'Dharma & Greg 1x22 - "Much Ado During Nothing".mp4'
音声ファイルから文字起こし Whisper CLI コマンド利用
Whisper CLI コマンド whisper で音声ファイルを指定し、
オプション --output_format srt を追加することで、
SRT (SubRip Subtitle) 形式の字幕ファイルを簡単に作成できます。
whisper コマンドを初回実行すると、
指定された model (default は turbo ) のダウンロードが始まります。
使用可能な model には、tiny, base , small, medium, large, そしてデフォルトの turbo があります。
[nix-shell:/tmp/English]$ whisper --help
...
--model MODEL name of the Whisper model to use (default: turbo)
...
どのモデルがデフォルトなのかは、ご自身の環境で確認して下さい。
ダウンロードが完了すると、文字起こし処理がはじまります。
[nix-shell:/tmp/English]$ whisper --output_format srt 'Dharma & Greg 1x22 - "Much Ado During Nothing".mp3'
/nix/store/i2savsybm4fz0yi7abgbgirqimyl721h-python3.13-whisper-20250625/lib/python3.13/site-packages/whisper/transcribe.py:132: UserWarning: FP16 is not supported on CPU; using FP32 instead
warnings.warn("FP16 is not supported on CPU; using FP32 instead")
Detecting language using up to the first 30 seconds. Use `--language` to specify the language
Detected language: English
[00:00.000 --> 00:13.000] Oh God, Greg, wake up.
[00:13.000 --> 00:14.000] What?
[00:14.000 --> 00:15.000] You fell asleep.
[00:15.000 --> 00:18.000] I know, you were wonderful.
[00:18.000 --> 00:23.000] No, I wasn't. Neither were you. We fell asleep in the middle.
...
...
...
[20:24.860 --> 20:28.900] But Captain, my Captain, Goose does not rhyme.
[20:28.900 --> 20:53.280] It's four to six o'clock!
[20:53.280 --> 20:57.580] So you just ought to let me go.
[21:11.380 --> 21:12.060] Thank you, James.
[21:12.060 --> 21:12.920] Bye.
SRT 字幕ファイルが出力されました。
[nix-shell:/tmp/English]$ ls -1
'Dharma & Greg 1x22 - "Much Ado During Nothing".mp3'
'Dharma & Greg 1x22 - "Much Ado During Nothing".mp4'
'Dharma & Greg 1x22 - "Much Ado During Nothing".srt'
今回の文字起こしには、約21分の音声ファイルで、9分15秒の時間を要しました。
[nix-shell:/tmp/English]$ time whisper --output_format srt 'Dharma & Greg 1x22 - "Much Ado During Nothing".mp3'
...
real 9m15.405s
user 15m36.226s
sys 2m50.986s
出力メッセージ中の
UserWarning: FP16 is not supported on CPU; using FP32 instead
warnings.warn("FP16 is not supported on CPU; using FP32 instead")
Detecting language using up to the first 30 seconds. Use `--language` to specify the language
より、
UserWarning FP16 is not supported on CPU; ... を消すために
--fp16 False
音声ファイルの最初の30sを言語判定に使っているので、
言語が英語と分かっているので、
--language en
を
model を small に
--model small
して実行してみました。
[nix-shell:/tmp/English]$ time whisper --output_format srt 'Dharma & Greg 1x22 - "Much Ado During Nothing".mp3' --fp16 False --language en --model small
...
real 6m36.036s
user 11m10.562s
sys 2m55.995s
時間が短縮され、6分36秒になりました。
下記のMac BookAir M4の実行結果です。
[nix-shell:/tmp/English]$ sw_vers
ProductName: macOS
ProductVersion: 26.0.1
BuildVersion: 25A362
[nix-shell:/tmp/English]$ system_profiler SPDisplaysDataType
Graphics/Displays:
Apple M4:
Chipset Model: Apple M4
Type: GPU
Bus: Built-In
Total Number of Cores: 10
Vendor: Apple (0x106b)
Metal Support: Metal 4
Displays:
...
音声ファイルから文字起こし Python openai-whisper package 利用
Python から openai-whisper package を利用した Python スクリプト
audio2txt.py
も用意してみました。
実行時間は、約1分38秒程度です。
より速く字幕ファイルを作成できます。
[nix-shell:/tmp/English]$ time python audio2txt.py 'Dharma & Greg 1x22 - "Much Ado During Nothing".mp3'
1
00:00:01,000 --> 00:00:03,000
What?
...
real 1m38.285s
user 2m36.469s
sys 0m10.702s
[nix-shell:/tmp/English]$ head 'Dharma & Greg 1x22 - "Much Ado During Nothing".srt'
1
00:00:01,000 --> 00:00:03,000
What?
2
00:00:11,000 --> 00:00:13,000
Good. Good. Greg, wake up.
3
00:00:13,000 --> 00:00:14,000
[nix-shell:/tmp/English]$ cat audio2txt.py
# audio2txt.py
import sys
import whisper
from datetime import timedelta
import os
def format_timestamp(seconds: float) -> str:
td = timedelta(seconds=seconds)
# timedelta を h:m:s に変換
total_seconds = int(td.total_seconds())
hours = total_seconds // 3600
minutes = (total_seconds % 3600) // 60
secs = total_seconds % 60
millis = int((seconds - int(seconds)) * 1000)
return f"{hours:02}:{minutes:02}:{secs:02},{millis:03}"
def main():
if len(sys.argv) < 2:
print("Usage: python audio2txt.py <audiofile>")
sys.exit(1)
audio_path = sys.argv[1]
# モデルを読み込み("small", "medium", "large"などに変更可能)
model = whisper.load_model("small")
# 音声を文字起こし(日本語なら language="ja" を指定)
# language 引数 ISO 639-1 の言語コード
# ja , en , zh (中国語), fr, de, ...
result = model.transcribe(
audio_path,
language="en",
fp16=False # CPU環境ではFP16を使わずに警告を抑制
)
# SRT 出力ファイル名を作成
base, _ = os.path.splitext(audio_path)
srt_path = base + ".srt"
with open(srt_path, "w", encoding="utf-8") as f:
for i, seg in enumerate(result["segments"], start=1):
start = format_timestamp(seg["start"])
end = format_timestamp(seg["end"])
text = seg['text'].strip()
block = f"{i}\n{start} --> {end}\n{text}\n\n"
f.write(block)
print(block, end='')
if __name__ == "__main__":
main()
字幕付きで動画再生
VLC media player を用いて、字幕付きで動画再生をします。
ダウンロードした動画ファイル 'Dharma & Greg 1x22 - "Much Ado During Nothing".mp4'
を VLC で開くと、
Whisper CLI あるいは Python スクリプトで出力した
SRT字幕ファイルが自動的に読み込まれます。
画面には、
whisper --output_format srt 音声ファイル の出力結果の
[00:15.000 --> 00:18.000] I know, you were wonderful.
テキストが字幕として表示されています。

まとめ
本記事では、yt-dlp を用いて動画と音声ファイルを準備し、
OpenAI Whisper CLI によって、SRT字幕ファイルを生成する
一連の手順を解説しました。
これにより、字幕が用意されていない動画であっても、
字幕を付与し「生きた英語」を学ぶための環境を容易に構築できます。
この一連の手順は、字幕付きで動画を鑑賞するに留まらず、
議事録作成、インタビューの文字起こしといった実務的なタスクにも活用できます。
Discussion