本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
動画編集ソフトを開かずに、シェルスクリプトで対話動画を自 動生成してみた | UNIX Cafe

はじめに
今回作りたいのは、セリフに合わせて音声、字幕、背景、キャラクターを配置する動画です。
GUIソフトを使うと、立ち絵やセリフを増やすたびにタイムライン上でマウスを使った編集作業を繰り返すことになります。ソフトによっては、ちょっとした機能や素材を利用するために有料プランを契約する必要が出てきます。
その状況を見た時に、「たいした機能でもないのに、ここでお金取るの?」「じゃあ自分で作るわ。」と思って、ターミナルから使えるアプリとして作成したのがこのスクリプトです。
これは、テキストの台本を読み取り、VOICEVOX ENGINEで音声を生成し、画像や字幕を組み合わせて、ffmpegで対話動画にするシェルスクリプトです。画像の処理にはImageMagickも使います。
一度ツールと素材を用意すれば、台本や必要に応じて盤面のテキストを修正し、スクリプトを再実行して動画を作れます。作成したものはGitHubで公開しています。
この記事では、台本が動画になるまでの流れと、実行方法を紹介します。
公開したもの
公開したリポジトリはこちらです。
Dialogue Video Generator – GitHub
このリポジトリには、動画を組み立てるためのシェルスクリプトと、動作確認に使えるサンプル台本を入れています。
- 含めているもの:動画生成用のシェルスクリプト、README、サンプル台本、セットアップ手順です。
- 含めていないもの:キャラクター画像、背景画像、BGM、生成済み音声、生成済み動画です。
画像や音声などの素材には、それぞれ利用条件があります。そのため、素材を除いたスクリプト、手順、サンプル台本を公開しています。
何ができるスクリプトなのか
このスクリプトは、テキストで書いた台本をもとに、対話形式の動画を自動で作ります。
使い方の流れはシンプルです。台本と盤面テキストを用意し、背景画像とキャラクター画像を決まった場所に置きます。VOICEVOXで音声を作る場合はVOICEVOX ENGINEを起動してから、スクリプトを実行します。
- 台本:誰が、どのセリフを話すかを書きます。
- 音声:初期設定ではVOICEVOX ENGINEでセリフを読み上げます。用意済みのWAVファイルを使うこともできます。
- 映像:ImageMagickで字幕や盤面テキストの画像を作り、背景やキャラクター画像と組み合わせます。
- 出力:ffmpegで最終的な動画ファイルにします。
動画編集ソフトで1つずつ配置するのではなく、台本から動画を組み立てる考え方です。
必要なツール
macOSでは、Homebrewを使うと必要なコマンドをまとめて用意できます。
brew install ffmpeg ghostscript imagemagick jqスクリプトは盤面テキストの解析や字幕の生成に python3 も使います。字幕と盤面の文字には、macOS標準のヒラギノ角ゴシックを初期設定で指定しています。
VOICEVOXで音声を作る場合は、先にVOICEVOX ENGINEを起動しておきます。
curl http://127.0.0.1:50021/versionこのコマンドを実行してバージョン番号が表示されれば、VOICEVOX ENGINEに接続できています。
台本の書き方
台本では、話者名とセリフを | で区切って書きます。
GitHubのサンプルでは英語の例を載せていますが、日本語の台本でも同じ形式で使えます。
Speaker A|Hello.
Speaker B|Hi. Let's make a video.セリフは日本語でも書けます。初期設定で使える話者名は Speaker A と Speaker B です。
Speaker A|こんにちは。今日はシェルスクリプトで動画を作ります。
Speaker B|台本を書いてから、動画を生成してみましょう。台本に 【ミナちゃん】 と 【ユニ先生】 を話者名として書く場合は、実行時に SPEAKER_A_LABEL='【ミナちゃん】' SPEAKER_B_LABEL='【ユニ先生】' ./generate_video.sh のように指定します。
読み上げる文章と、画面に表示する字幕を分けたい場合は、3つ目の項目を追加します。
Speaker A|This text is sent to VOICEVOX.|This text appears in the subtitle.日本語で書く場合も同じです。
Speaker B|グレップは、とても役に立つんだ。|`grep` はとても役に立つんだ。この形式にしておくと、動画編集ソフトで字幕を1つずつ置く必要がありません。台本を直してもう一度実行すれば、動画も作り直せます。
素材の置き方
台本、盤面テキスト、画像やBGMは、次のようなフォルダ構成で置きます。
.
├── generate_video.sh
├── script.txt
├── board_script.txt
├── backgrounds/
│ └── background.png
├── images/
│ ├── speaker-a/
│ │ └── 001.png
│ └── speaker-b/
│ └── 001.png
└── mp4/
└── bgm.m4aboard_script.txt は画面に表示する盤面テキストです。初期設定ではファイルが必要で、セリフの行番号を範囲で指定します。
[1-2]
今日のテーマ
------------
シェルスクリプトで動画を作る盤面を表示しない場合は、BOARD_ENABLED=0 ./generate_video.sh で無効にできます。
BGMはなくても実行できます。使う場合は、次のようにBGMファイルを指定します。
BGM_AUDIO_FILE=mp4/bgm.m4a ./generate_video.sh実行方法
基本的な実行手順は次の通りです。サンプル台本をコピーしてから、スクリプトを実行します。
chmod +x generate_video.sh
cp examples/script.txt script.txt
cp examples/board_script.txt board_script.txt
./generate_video.sh出力する動画ファイルの名前を変えたい場合は、次のように指定します。
OUTPUT_FILE=lesson.mp4 ./generate_video.shすでにWAV形式の音声ファイルを用意している場合は、VOICEVOXを使わずに外部音声モードで作成できます。初期設定では audio/speaker-a/ と audio/speaker-b/ に話者別のWAVファイルを置きます。各フォルダのファイルは自然順で使われるため、話者ごとのセリフ数と順番に合わせて用意してください。
AUDIO_INPUT_MODE=external ./generate_video.shGUIではなくシェルスクリプトにした理由
今回減らしたかったのは、毎回同じ形式の動画を作るための繰り返し作業です。
台本をテキストにすると、セリフや字幕を直接編集できます。動画の組み立て方もスクリプトとして残るので、設定を変更したときはGitで差分を確認できます。
- 再現しやすい:同じ台本と素材を使えば、同じ手順で動画を作れます。
- 直しやすい:字幕やセリフをテキストファイルで修正できます。
- 共有しやすい:スクリプトとサンプルをGitHubで公開できます。
- 増やしやすい:素材を用意したあとは、台本や必要に応じて盤面テキストを変え、同じ形式の動画を作れます。
同じ台本と素材を使って再実行できることも、シリーズ動画では助かります。1本ずつ画面上で配置をやり直すより、内容の修正に集中しやすくなりました。
もちろん、細かい演出を画面で調整したい動画にはGUIの編集ソフトが向いています。私がこの仕組みを使っているのは、構成がある程度決まった対話動画です。
VOICEVOXや素材の扱いについて
VOICEVOX ENGINE、音声モデル、キャラクター画像、背景画像、BGMには、それぞれ利用条件があります。
そのため、GitHubには素材を含めていません。公開対象は、動画を作るための仕組みだけです。
作成した動画を公開する場合は、使った音声、キャラクター、画像、BGMのライセンスを確認してください。
実際に作った動画
この仕組みを使って、UNIXやターミナル操作を扱う動画を作成しています。
第1回では、viエディタのビジュアルモードを取り上げています。テキスト記事だけでは伝えにくい画面の動きや、範囲選択の流れを動画で確認できます。
YouTubeチャンネルのプロフィールページはこちらです。
まとめ
決まった形式の動画なら、台本、素材、設定をテキストで管理して、自動で組み立てられます。
今回公開したDialogue Video Generatorは、そのために作った小さな道具です。動画を作り直すたびに素材を並べる作業が減り、台本の修正から再生成までを同じ手順で進められるようになりました。
