
MoviePy と Whisper で動画を文字起こしする方法
- 文字 実(メンター)
皆さん、こんにちは!Alamoa メンターの文字です。
今回は、動画から自動で文字起こしをする Python スクリプトを紹介します。 もちろん、音声データから文字起こしすることもできます。
動画コンテンツを扱う方にぜひ知っていただきたい、非常に便利なツールとテクニックです。 最近は動画コンテンツが主流になりつつありますが、動画の内容をテキスト化したいというニーズも増えていますよね。例えば、
- 動画の内容をブログ記事にしたい
- 会議の議事録を作成したい
- 動画の字幕ファイルを作りたい
- 音声データから特定のキーワードを検索したい
といった場合に、手作業で文字起こしをするのは大変な労力が必要です。 そこで今回は、Python ライブラリの「MoviePy」と「Whisper」を組み合わせることで、動画から自動で文字起こしを行う方法を解説します。 コードを使って実際に試せるので、ぜひ最後までご覧ください。 今回は、MacOS での操作の紹介となりますが、Windows でもできます。
MoviePy とは?
MoviePy は、Python で動画編集を行うためのライブラリです。 動画のカット、結合、テキストや画像の挿入、音声の抽出など、さまざまな操作をコードで行うことができます。 プログラミングの知識があれば、直感的に動画を編集できるのが魅力です。 今回の文字起こしでは、動画から音声ファイルを取り出すために MoviePy を使います。
Whisper とは?
Whisper は、OpenAI が開発した高精度な音声認識モデルです。 多言語に対応しており、非常に高い精度で音声をテキストに変換してくれます。 ノイズが多い環境での音声や、複数の話者がいる場合でも、比較的正確に文字起こしができると評判です。 今回は、MoviePy で抽出した音声ファイルを、Whisper を使って文字起こしします。
MoviePy と Whisper を使った文字起こし手順
では、実際に動画を文字起こしする手順を説明します。大まかな流れは以下の通りです。
- 必要なライブラリのインストール
- 動画から音声を抽出
- 抽出した音声ファイルを文字起こし
- 今回は、sample.mp4 という動画ファイルがあることを前提に進めます
1.必要なライブラリのインストール
pip install moviepy==2.2.1 pip install pydub==0.25.1 pip install openai-whisper==20240930
fmpeg とは?
ffmpeg は、音声や動画を処理するための非常に強力なオープンソースソフトウェアです。 MoviePy も Whisper も、内部的に ffmpeg を利用しています。 通常、MoviePy をインストールすると自動的に関連する ffmpeg の機能が設定されますが、もしエラーが出る場合は別途 ffmpeg をシステムにインストールする必要があります。
Whisper の動作には ffmpeg も必要です。未インストールの場合は以下も実行してください。
brew install ffmpeg
brew をインストールしてない場合は、別途インストールして下さい。
2.動画から音声を抽出
次に、MoviePy を使って動画ファイルから音声(MP3 ファイル)を抽出します。
from moviepy.video.io.VideoFileClip import VideoFileClip def extract_audio_from_video(video_path, audio_output_path): with VideoFileClip(video_path) as video_clip: with video_clip.audio as audio_clip: audio_clip.write_audiofile(audio_output_path) print(f"Audio extracted: {audio_output_path}")
このコードを実行すると、MP4 の動画ファイルから音声が抽出され、MP3 の音声ファイルができます。
3.抽出した音声ファイルを文字起こし
最後に、抽出した extracted_audio.mp3 を Whisper を使って文字起こしします。
import whisper def transcribe_audio(audio_output_path, transcribed_text_file_path, model_size="base"): model = whisper.load_model(model_size) result = model.transcribe(audio_output_path, verbose=False, fp16=False) transcribed_text = result["text"] with open(transcribed_text_file_path, "w", encoding="utf-8") as f: f.write(transcribed_text) print(f"Transcription result saved to '{transcribed_text_file_path}'.")
model_size は、使用する Whisper モデルのサイズを指定します。 tiny が最も軽量で高速ですが精度は低く、large が最も高精度ですが処理に時間がかかります。 ご自身の環境や目的に合わせて選択してください。
まとめ
例えば、全体のコードは以下のようになります。
import os import ssl import warnings from moviepy.video.io.VideoFileClip import VideoFileClip import whisper ssl._create_default_https_context = ssl._create_unverified_context warnings.filterwarnings( "ignore", message="FP16 is not supported on CPU; using FP32 instead" ) def extract_audio_from_video(video_path, audio_output_path): with VideoFileClip(video_path) as video_clip: with video_clip.audio as audio_clip: audio_clip.write_audiofile(audio_output_path) print(f"Audio extracted: {audio_output_path}") def transcribe_audio(audio_output_path, transcribed_text_file_path, model_size="base"): model = whisper.load_model(model_size) result = model.transcribe(audio_output_path, verbose=False, fp16=False) transcribed_text = result["text"] with open(transcribed_text_file_path, "w", encoding="utf-8") as f: f.write(transcribed_text) print(f"Transcription result saved to '{transcribed_text_file_path}'.") if __name__ == "__main__": script_dir = os.path.dirname(os.path.abspath(__file__)) sample_video_file_path = os.path.join(script_dir, "sample.mp4") extracted_audio_file_path = os.path.join(script_dir, "extracted_audio.mp3") transcrived_video_text_path = os.path.join(script_dir, "video_transcription.txt") extract_audio_from_video(sample_video_file_path, extracted_audio_file_path) transcribe_audio(extracted_audio_file_path, transcrived_video_text_path)
補足
ssl._create_default_https_context = ssl._create_unverified_context
これは、Python が HTTPS(セキュアなウェブ通信)を行う際のセキュリティ検証を無効にするための設定です。 本番環境や機密データを扱う用途では使用すべきではありませんが、開発やテストの目的で、一時的にエラーを回避するために使用することがあります。
warnings.filterwarnings( "ignore", message="FP16 is not supported on CPU; using FP32 instead" )
この行は、「Python スクリプトの実行中に、"FP16 is not supported on CPU; using FP32 instead" という警告メッセージがもし発生したら、それを無視してコンソールに表示しないようにする」という指示を与えています。
Whisper モデルは通常、GPU を使用する際に高速化のために FP16(半精度浮動小数点数)を利用しますが、CPU で実行する場合は FP16 をサポートしないため、自動的に FP32(単精度浮動小数点数)に切り替わります。この切り替えは問題なく行われるため、ユーザーにとって重要な情報ではなく、毎回表示されると煩わしいと感じることがあるため非表示にしています。
まとめ
今回は、MoviePy と Whisper を組み合わせることで、Python を使って動画から手軽に文字起こしを行う方法をご紹介しました。
これらのツールを活用することで、動画コンテンツの活用範囲がぐっと広がるのではないでしょうか。
プログラミング初心者の方でも、今回のサンプルコードを参考にぜひ試してみてください。 でき上がった文章は、句読点がなかったり、一部誤字・脱字があるので、それを ChatGPT や Gemini に修正してもらと良いです。
Python を使えるようになれば、業務を効率化したり、作業を自動化できます。 興味のある方は、Alamoa(アラモア)のウェブサイトもぜひご覧ください。