動画編集ができないので、宣伝動画を Python で作ることにした
2026-10-03 ・ @apkderete
個人でアプリを作っていると、宣伝用の短い動画がほしくなる時期が来ます。ただ自分は動画編集ソフトをまともに触ったことがなくて、1本作るだけで日が暮れそうでした。しかもアプリは毎日のように画面が変わるので、作ったそばから古くなる。
それならコードで作ってしまおう、というのがこの記事の話です。結果として、縦長のショート動画を19本作りました。せりふを1行直したら、コマンド1回で全部作り直せます。
ざっくりした流れはこうです。
アプリ(開発サーバー) ─ Playwright + CDP screencast ─→ 画面のコマ(jpg) + 各コマの時刻
│
VOICEVOX エンジン(ローカル) ─ 文ごとに wav ─────────────┤
▼
Pillow で 1 コマずつ描く(背景・スマホ枠・字幕・クレジット)
│ rawvideo を標準入力へ
▼
ffmpeg(libx264) → 効果音と声を adelay + amix → loudnorm
画面は CDP の screencast で録る
最初は Playwright の動画録画を使っていたんですが、画質が思ったより粗くて、スマホの画面だと文字がつぶれました。そこで Chrome DevTools Protocol の Page.startScreencast に切り替えて、コマを1枚ずつ受け取るようにしています。受け取った時刻も一緒に残しておくと、あとで「何秒目の画面」を取り出すのが楽です。
ここで2回つまずきました。
1回目は解像度です。device_scale_factor=3 を指定しても、screencast のコマは等倍のままでした。Chrome の起動引数に --force-device-scale-factor=3 を付けたら、390×844 の画面がちゃんと 1170×2532 で撮れました。
2回目は日付です。アプリの見本データが「今月」を基準に作られていたので、撮る日によって画面の中身が変わってしまう。page.clock.install() で時計を固定したら直りました。
声は VOICEVOX のエンジンにお願いする
VOICEVOX はエンジンを立ち上げておくと、127.0.0.1:50021 で HTTP の API が使えます。/audio_query で読み上げの設定を作って、話す速さなどを少しいじってから /synthesis に渡すと、wav が返ってきます。同じ文を何度も作ることが多いので、文のハッシュでキャッシュしておくと作り直しがかなり速くなりました。
声が場面より長くなったときは、場面のほうを伸ばして、録った画面をゆっくり流しています。字幕と声がずれないので、これが一番手間がかかりませんでした。
VOICEVOX のキャラクターを使うときは、規約どおり「VOICEVOX:ずんだもん」のようなクレジットを画面に入れています。
1コマずつ描いて ffmpeg に流す
画面のコマ、スマホの枠、字幕を Pillow で1コマずつ重ねて、tobytes() をそのまま ffmpeg の標準入力に流しています(-f rawvideo -pix_fmt rgb24)。途中で画像ファイルを書き出さないので、思ったより速いです。
音は、効果音と声それぞれに adelay で始まる時刻を付けて amix で混ぜ、最後に loudnorm で大きさをそろえました。
ここでもはまったところがあって、ffmpeg を subprocess から呼ぶと、たまに終わらずに止まります。標準入力が開いたままになっていたのが原因で、stdin=subprocess.DEVNULL と timeout を付けてからは止まらなくなりました。あとは、音が映像より短いと最後がぶつっと切れるので、apad=whole_dur= で映像の長さまで無音を足しています。
途中から掛け合いにした
途中から、2人のキャラクターが掛け合う形に変えています。せりふを (話者, 文) の並びで書いておくと、話している人の名札と字幕と声が勝手につながるようにしました。
これで一度やらかしています。せりふで「設定6の確率は17%」と言っているのに、画面のほうはまだその数字が出る前で、言い終わってから数字が映る。録画を時間どおりに流していたせいでした。せりふが画面の数字を指すところだけは、その数字が映った瞬間で画面を止めるようにしています。
作れるようになったけど、見られるかは別だった
作るのは本当に楽になりました。せりふを直してコマンドを1回打つだけです。
ただ、作れることと見てもらえることは、まったく別の話でした。パチンコや競馬の動画は TikTok だとほぼ再生されず、X でも伸びませんでした。題材と出す場所の相性は、作り始める前に確かめておくべきでした。そこは次のアプリで気をつけます。
作っているアプリ
- カチマケ(パチンコ・競馬の収支管理): https://kame6493-del.github.io/kachimake-site/
- DIAMOND NINE(野球シミュレーション、Android でテスト中): https://groups.google.com/g/diamond-nine-testers
- X: https://x.com/apkderete