字幕手打ちがしんどすぎて調べた
副業でちょっとした動画編集を受けるようになって半年。字幕を手で打ち込む作業が想像以上にしんどい。10分の動画でも字幕を入れると2時間とか平気でかかる。ナレーションの書き起こしだけならまだしも、タイムコードの調整が地獄で、「これ何かツール使ったほうがいいのでは」と思って調べたところ、OpenAIが出しているWhisperという音声認識AIにたどり着いた。
Whisperは2022年に公開されたオープンソースの音声認識モデルで、日本語を含む99言語に対応している。MITライセンスだから商用利用も問題ない。市販の字幕生成ツールは月額数千円〜数万円するものが多い中、これが無料というのは正直バグってると思う。
実際のインストールと使い方
自分が試したのはローカルインストールの方法だ。Python 3.8以上が必要になる。
pip install openai-whisper
# ffmpegも必要(動画ファイルの処理に使う)
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg
インストールしたら、コマンド一発で字幕ファイルが出る。
whisper video.mp4 --language Japanese --output_format srt
これだけ。SRTファイルが生成されて、YouTubeにそのままアップロードできる。自分は最初「嘘だろ」と思ったけど、本当にこれだけで動く。
モデルサイズは tiny / base / small / medium / large の5段階がある。日本語だとsmallかmediumがバランスいい。tinyは速いけど日本語の精度がかなり落ちるし、largeは1.5GBあってダウンロードだけで時間食う。自分のマシン(メモリ16GB、GPU無し)ではmediumでも動くが、10分の動画に20分くらいかかる。
faster-whisperの方が実用的だった
通常のWhisperが遅すぎて困っていたところ、faster-whisperという高速版を見つけた。公式より4倍以上速いらしく、GPU無しでもそこそこ快適に動く。
pip install faster-whisper
from faster_whisper import WhisperModel
model = WhisperModel("medium", device="cpu", compute_type="int8")
segments, info = model.transcribe("video.mp4", language="ja", beam_size=5)
with open("output.srt", "w", encoding="utf-8") as f:
for i, segment in enumerate(segments, 1):
h = int(segment.start // 3600)
m = int((segment.start % 3600) // 60)
s = int(segment.start % 60)
ms = int((segment.start - int(segment.start)) * 1000)
start = f"{h:02}:{m:02}:{s:02},{ms:03}"
h = int(segment.end // 3600)
m = int((segment.end % 3600) // 60)
s = int(segment.end % 60)
ms = int((segment.end - int(segment.end)) * 1000)
end = f"{h:02}:{m:02}:{s:02},{ms:03}"
f.write(f"{i}\n{start} --> {end}\n{segment.text.strip()}\n\n")
実際に使ってみると体感で倍以上速い。CPU環境の自分にはこっち一択だった。
ブラウザで試したい人向け
Pythonの環境構築が面倒な人はHugging Faceの「whisper-web」でブラウザからWhisperを動かせる。ファイルをアップロードして言語をJapaneseにしてTranscribeを押すだけ。ただ、処理が遅いのとファイルサイズに制限があるので、ちゃんと使うならローカルインストールの方がいい。自分は最初これで試して「お、いけるじゃん」となってからローカルに移行した。
精度を上げるためにやったこと
Whisperの精度は元の音声品質にかなり左右される。BGMがガンガン入っている動画は認識がガタガタになる。自分が受ける案件で一番困ったのがセミナー録画で、会場のエコーと参加者のノイズで認識精度が落ちまくった。
音声を前処理してからWhisperに食わせると結果が良くなる。
ffmpeg -i input.mp4 -af "highpass=f=200,lowpass=f=3000,dynaudnorm" cleaned.mp4
あと、Whisperには初期プロンプト機能があって、専門用語を事前に教えられる。
whisper lecture.mp4 --language Japanese \
--initial_prompt "この動画はPythonプログラミングについての講義です。Claude、ChatGPT、Whisperなどのキーワードが頻出します。"
これを入れるだけで固有名詞の認識がだいぶマシになる。逆にプロンプト無しだと「クロード」が「黒おど」とかになったりする。
生成した字幕を動画に焼き込む
YouTubeに上げるだけならSRTファイルをアップロードすれば終わりだが、納品物として字幕を焼き込みたい場合はFFmpegを使う。
ffmpeg -i input.mp4 -vf "subtitles=output.srt:force_style='FontName=Hiragino Sans,FontSize=24'" output_with_subtitle.mp4
DaVinci Resolve(無料版)やCapCutでもSRTインポートに対応しているから、動画編集ソフトの中で字幕の位置やスタイルを調整したいならそっちのほうが楽かもしれない。自分はFFmpeg派だけど、これは好みの問題だ。
副業としてどうなのか
正直、まだ字幕制作単体で安定して稼げているわけではない。副業始めて半年、字幕系の案件はまだ数件しか受けていない。ただ、Whisperのおかげで作業時間が劇的に短くなったのは間違いない。手打ちで2時間かかっていたものが、Whisper+手直しで30分〜1時間くらいになった。
クラウドソーシングで「字幕」「文字起こし」で検索するとそれなりに案件はある。1本数千円〜が相場で、Whisperで効率化すれば時給は悪くない。多言語対応(英語動画→日本語字幕)はまだ試してないけど、WhisperでSRT生成→DeepLで翻訳という流れは理屈上いけるはずだ。そのうち試す。
Whisperは無料で、精度もそこそこ高くて、コマンド一発で字幕が出る。字幕作業に時間を取られている人は、まずfaster-whisperをインストールして手元の動画で試してみてほしい。手打ちに戻れなくなる。