ImageMagickを使って字幕ファイルと9slice画像からフキダシ画像を作成する

プログラミング

このようなフキダシ画像を、字幕ファイルのセリフの数ぶん作る話。

フキダシとblogの背景が白なので、blog用にフキダシ画像の透明色を青で塗りつぶしている。Pythonなどのプログラミング言語が少しわかることを前提とする。

動機

以前、VOICEVOXから字幕ファイルを作成した。

動画に四国めたんのボイスを使っているので

『見た目も四国めたんが喋っているかのようにキャラ絵とフキダシ画像を入れるぞ』

という話。コマンド一発で字幕ファイルからフキダシ画像を出力できるようにする。

ざっくり流れ

  1. テキストと9slice画像からフキダシ画像を1枚作成する。
  2. 字幕ファイル(SRTファイル)と9slice画像からフキダシ画像を大量に作成する。
  3. (おまけ)フキダシ画像とキャラ絵をiMovieで使えるように加工する。

以上。

最後のおまけはiMovieで複数の画像を表示するときに行う加工についてなので、ほとんどの人は不要だろう。凝ったことをiMovieでやると破綻するので、そのための処理だ。

詳細

テキストと9slice画像からフキダシ画像を1枚作成する。

1の工程。

テキスト

ここで言うテキストは、『今日の動画は、千葉県の房総半島』などのセリフを指している。

9slice画像

9slice画像はこういうやつ。

9sliceについて詳しくは検索してほしい。9分割して四隅以外を引き伸ばして自由なサイズのウィンドウ画像として使う仕組み。

引き伸ばされても破綻しないようなデザインにするのだ。

Pythonスクリプト

テキストと9sliceとImageMagickを使って、フキダシ画像が作成できるPythonスクリプトを用意する。

GitHubのリンク:https://github.com/m-szk/speech_bubble/blob/master/speech_bubble.py

解説

ほぼImageMagickのコマンドをPythonから呼び出しているだけなので、Pythonを使わなくてもいいのだけど便利なので。

  1. _create_text_image
    • テキストだけの画像ファイル(.temp.text.png)を出力する。テキスト画像の縦横サイズを取るのが目的でこの画像は使わない
  2. _create_outline_text_image
    • 縁取り付きのテキスト画像を出力する。
  3. _create_background_image
    • テキスト画像の縦横サイズから、フキダシ画像の引き伸ばしサイズを決めてフキダシ画像を出力する。9分割して引き伸ばしてくっつける処理を書くときに、結構ImageMagickと格闘したけど理解すれば容易かった。cmd_1のところ。
  4. _create_speech_bubble_image
    • フキダシ画像とテキスト画像を重ね合わせる。
使い方
$ python speech_bubble.py サンプル ヒラギノ角ゴシック-W5 55 "#FFFFFF" 0.1 "#000000" speech_bubble.png 48 32 96 96 output_sample.png  

引数の説明を簡単にする。テキスト(サンプル)、フォント名、フォントサイズ、フォント色、縁取りサイズ(1=100%)、縁取り色、9slice画像(speech_bubble.png)、9分割左上X座標(48)、左上Y座標(32)、右下X座標(96)、右下Y座標(96)、出力画像(output_sample.png)

これでテキストからフキダシ画像を作成できる。

字幕ファイル(SRTファイル)と9slice画像からフキダシ画像を大量に作成する。

2の工程。

Pythonスクリプト

テキストからフキダシ画像が作成できるようになったので、字幕ファイルからフキダシ画像を作成できるようにする。

GitHubのリンク:https://github.com/m-szk/speech_bubble/blob/master/srt_speech_bubble.py

字幕ファイルからテキストのリストを作成して、1の工程のスクリプトを呼ぶだけ。

使い方
python srt_speech_bubble.py sample.srt ヒラギノ角ゴシック-W5 55 "#000000" 0.03 "#C0C0C0" speech_bubble_c.png 48 32 96 96 output -b 2

ほぼさっきと同じ。sample.srtは字幕ファイル。outputはディレクトリ。outputの下にセリフの画像が出力される。-bは縁取りぼかし。2は縁取りぼかしの強さ。オプションなので書かなくてもいい。

これで字幕ファイルからフキダシ画像がセリフの数ぶん作成される。

おそらく普通の動画ソフトを使うならば、ここまででOKだろう。あとは音声のタイミングでフキダシ画像を表示させればいい。

フキダシ画像をiMovieで使えるように加工する。

3の工程。iMovieを使わないなら不要。

Mac版のiMovieでできないこと

キャラ絵とフキダシ画像を同時に表示したいのだけど、iMovieは複数の画像を同時に表示することができない

これ大体どの動画ソフトでも対応できそうなのだが、iMovieはできないのだった。iMovieは写真をポンポン入れるだけでいい感じのスライドショーを作ってくれるのだが、ちょっとキャラ絵入れてフキダシを出すみたいな凝ったことやると、途端に拒否られてしまうのだ。

フキダシとキャラ絵を1枚の画像にしてしまう

iMovieは1枚なら表示できるのであらかじめ2枚を1枚にしてしまおう。画像サイズも16:9にしてピッタリ動画の上に乗せるだけにしよう。

それを行うPythonスクリプトを用意する。

GitHubのリンク:https://github.com/m-szk/speech_bubble/blob/master/fhd_speech_bubble.py

任意の画像(キャラの立ち絵など)と、フキダシ画像を出力したディレクトリを指定して、1920×1080の画像を作成するスクリプト

使い方
python fhd_speech_bubble.py metan.png 100 50 output 400 150 output2

引数の説明をする。キャラ絵(metan.png)、左下からのキャラ絵X座標(100)、Y座標(50)、さっき出力したフキダシ画像ディレクトリ(output)、左下からのフキダシX座標(400)、Y座標(150)、出力ディレクトリ(output2)

切り取っているが、実際は1920×1080で出力される。

フキダシ画像の数ぶん出力される。

画像が出力できたらiMovieで入力していくだけ。ピクチャ・イン・ピクチャにしてサイズをリセットして、クロップをフィットにして……という感じだけど、ここではiMovieに関して詳しく説明しない。

補足

ImageMagickと、PythonパッケージのPillowとpysrtが必要。環境はMacだけどWindowsでも動かせると思う。

$ brew install imagemagick
$ pip install Pillow
$ pip install pysrt

作った動画

まとめ

iMovieでモトブログしてる人あんまりいないよね。

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