【副業実験記#9】Python+MoviePyで字幕付きの動画を自動生成してみた話

子育てSEパパのIT×AI×副業ラボ_副業実験記_9 副業実験記

つづき。


はじめに

引き続き、雑学動画自動生成ツールを自作できないか、検討してみているお話です。

今回は、前回の記事の続きで、動画を自動生成できるPythonライブラリ「MoviePy」で字幕付きの動画を生成できるか検証してみた話です。

検証準備

前回記事の「検証準備」に加えて、以下の準備をします。

ImageMagickのインストール

Noツール説明備考
1ImageMagick画像の変換・編集・合成などができる無料のコマンドラインツールです。・「MoviePy 1.0.3」では、動画生成時に字幕を付ける場合、「ImageMagick」が必要。

詳細については以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

ImageMagickをインストールせずに、字幕付きの動画を生成しようとしたところ、以下のエラーメッセージが出たので必要性に気がつきました。

Traceback (most recent call last):
  File "D:\PyCharmProjects\MoviePyTest\.venv\Lib\site-packages\moviepy\video\VideoClip.py", line 1137, in __init__
    subprocess_call(cmd, logger=None)
  File "D:\PyCharmProjects\MoviePyTest\.venv\Lib\site-packages\moviepy\tools.py", line 46, in subprocess_call
    proc = sp.Popen(cmd, **popen_params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\{ユーザー名}\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 1026, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\{ユーザー名}\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 1538, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\PyCharmProjects\MoviePyTest\image_and_audio_and_text_to_video.py", line 23, in <module>
    subtitle = TextClip(
               ^^^^^^^^^
  File "D:\PyCharmProjects\MoviePyTest\.venv\Lib\site-packages\moviepy\video\VideoClip.py", line 1146, in __init__
    raise IOError(error)
OSError: MoviePy Error: creation of None failed because of the following error:

[WinError 2] 指定されたファイルが見つかりません。.

.This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect

※最終行の「This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn’t specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect」です。

フォントファイルの準備

字幕のフォントを指定できるようなので、フォントファイルを準備します。

今回は、Googleフォントの「Noto Sans Japanese」を使います。

検証してみた

前回の記事の流れの中で、テキストをTextClipとして準備し、画像のImageClipに音声と音楽(BGM)のCompositeAudioClipを合わせるところで、そのテキストも含めてVideoClipを作成するだけです。

MoviePyを使ったPythonサンプルコード

from moviepy.editor import *

# ファイルパス
image_path = "output.png"
voice_path = "output.wav"
bgm_path = "escort.mp3"
output_path = "output_video.mp4"

# 音声クリップの読み込み
voice_clip = AudioFileClip(voice_path)
bgm_clip = AudioFileClip(bgm_path).volumex(0.3)  # BGMの音量を30%に調整(お好みで)

# BGMの長さをナレーション音声に合わせてトリミング or ループ
bgm_clip = bgm_clip.set_duration(voice_clip.duration)

# 音声とBGMをミックス
mixed_audio = CompositeAudioClip([bgm_clip, voice_clip])

# 画像を読み込み、音声の長さに合わせて表示時間を設定
image_clip = ImageClip(image_path).set_duration(voice_clip.duration)

# 字幕テキストの作成(1行表示、中央下)
subtitle = TextClip(
    "こんにちは、\n今日はいい天気ですね。",
    fontsize=24,
    color="white",
    stroke_color="black",
    stroke_width=1,
    font=r"NotoSansJP-Regular.ttf",
    method="label"
).set_position(("center", "bottom")).set_duration(voice_clip.duration)

# 動画の合成(画像+字幕)
video = CompositeVideoClip([image_clip, subtitle]).set_audio(mixed_audio)

# 出力(fps=24が一般的)
video.write_videofile(output_path, fps=24)

この中の以下の部分が前回のコードと変更した部分です。

# 字幕テキストの作成(1行表示、中央下)
subtitle = TextClip(
    "こんにちは、\n今日はいい天気ですね。",
    fontsize=24,
    color="white",
    stroke_color="black",
    stroke_width=1,
    font=r"NotoSansJP-Regular.ttf",
    method="label"
).set_position(("center", "bottom")).set_duration(voice_clip.duration)

# 動画の合成(画像+字幕)
video = CompositeVideoClip([image_clip, subtitle]).set_audio(mixed_audio)

Pythonサンプルコード実行結果

D:\PyCharmProjects\MoviePyTest\.venv\Scripts\python.exe D:\PyCharmProjects\MoviePyTest\image_and_audio_and_text_to_video.py 
Moviepy - Building video output_video.mp4.
MoviePy - Writing audio in output_videoTEMP_MPY_wvf_snd.mp3
t:   0%|          | 0/61 [00:00<?, ?it/s, now=None]MoviePy - Done.
Moviepy - Writing video output_video.mp4

Moviepy - Done !
Moviepy - video ready output_video.mp4

プロセスは終了コード 0 で終了しました

サンプルコードで生成された動画

補足ですが、TextClipを作成する際、method引数に「caption」を渡すと、テキストを自動で折り返してくれるという情報があったのですが、うまくいか
なかったです。

1文字ごとに改行されてしまい、縦書きになってしまいました・・・。

テキストは、渡す前に自分で改行し、method引数には「label」を指定した方が良さそうでした。

おわりに

「MoviePy」ですが、「ImageMagick」をインストールしておけば、字幕付きの動画を自動生成できることが分かりました。

ただ、字幕(白フチ文字)は付けられたものの、思ったようなデザインにならず・・・。

字幕は、この機能ではなく、画像テキストを背景画像に埋める方法を採用するかもしれません。

とりあえず、MoviePyで字幕を付けた場合のことが色々と分かったので、次の技術やツールの検証に移ろうと思います。

(今回も検証用のコードは、ChatGPT(GPT-4oモデル)に出力してもらったものを微修正したものです)


今回の記事も、同じように副業に悩んでいる人、手探りで取り組んでいる人にとって、何かの参考になれば嬉しいです。

これからも記録を続けていく予定なので、よければフォローしてもらえると嬉しいです。


つづき。

タイトルとURLをコピーしました