本文へスキップ
雑記

Claude Codeでブログをショート動画化

台本からMP4まで自動生成してみた

たくま13分で読了

Claude Code が動画そのものを作ったわけではありません。作ったのは、動画を作るプログラムのほうです。

ブログ記事1本を材料に、台本を書き、VOICEVOX でナレーションを合成し、Python で絵を1枚ずつ描き、ffmpeg で mp4 にまとめる。この流れを通しで回す shortgen という道具を、Claude Code に書かせました。動画編集ソフトは一度も開いていません。

この記事で分かること。

  • Claude Code に「動画を作る道具」を作らせるという考え方
  • ブログ記事がショート動画になるまでの流れ
  • 台本・ナレーション・映像をどうつなぐか
  • 実際に作ってみて分かった問題点
  • どこまで自動化できて、どこを人がやったか

完成したショート動画

先に実物です。YouTube で見る

ずんだもんが解説する縦型の動画で、長さは32.5秒。7つのカットに分かれています。題材は、昨日公開した Claude Coworkの使い方 という記事です。

1カット目と2カット目。左で問題を出し、右で12分・205行という結果を先に見せている
1カット目と2カット目。左で問題を出し、右で12分・205行という結果を先に見せている

1カット目で「旅行の下調べは面倒」と問題を出して、2カット目でいきなり結果を出します。結論を最初の5秒に置く、という決め方をしました。

技術詳細:書き出したファイル

  • 形式は H.264。YouTube にそのまま上げられる、いちばん普通の動画形式です
  • 解像度 1080×1920 の30fps。縦持ちのスマホで画面いっぱいになる比率です
  • 長さ32.518秒、976フレーム
  • ファイルサイズ 6,177,640バイト(約6.2MB)

Claude Codeに何を作らせたのか

人がやったことと、Claude Code がやったことを分けて書きます。

人がやったのは、何を作るかを決めること、素材を用意すること、出てきた絵と音を見て中身を直すことです。素材はスクリーンショット3枚と、ずんだもんの立ち絵。

Claude Code が書いたのは、道具そのものです。bin/ に7本、lib/ に3本、あわせて1,434行。台本の7カットも Claude が書きました。

道具ができると、あとは1本の流れになります。

ブログ記事 → 台本 → VOICEVOX(ナレーション)
→ Python(絵を1枚ずつ描く)→ ffmpeg(音とつないで mp4)

shortgen の CLAUDE.md には「資料を見せるのではなく、体験を見せる」という方針を書いてあります。この一文が、あとに出てくる決めごとの元になっています。

技術詳細:使っているもの

  • Python のライブラリは3つだけ。pillow(画像を描く)、numpy(数値計算。BGMの合成にも使う)、psd-tools(PSDから表情を取り出す)
  • 音と映像の変換は ffmpeg。長さを測るのは ffprobe
  • ナレーションは VOICEVOX、立ち絵は SOYA式ずんだもん立ち絵。どちらも無料です

44分の内訳

かかったのは44分でした。最初のコードファイルができた13:14から、mp4 ができた13:58までです。

何を含むかをはっきりさせておきます。含むのは、Claude Code への指示、コードを書く時間、中身の修正、書き出し。含まないのは素材の準備で、立ち絵のPSDを落としたのは午前11:44でした。

成果物のファイルの時刻から取れた実測はこうです。

時刻

やっていたこと

所要

13:14〜13:17

コード10本のうち9本ができる

3分

13:24〜13:26

CLAUDE.md・README・投稿メモ

2分

13:37:03〜13:37:17

ナレーション7本の合成

14秒

13:46:23〜13:46:26

PSDから表情5枚を書き出し

3秒

13:46:38〜13:46:40

プレビュー7枚

2秒

13:53:27

台本の最終調整

13:55:30〜13:57:32

フレーム976枚を描画

2分2秒

13:57:46〜13:58:03

mp4に書き出し

17秒

足すと、機械が動いていたのは合計およそ2分半です。44分のうち残りの約41分は、書いて、見て、直していた時間でした。

自動化したのに時間が減っていない、という話ではありません。減ったのは待ち時間のほうで、空いたぶんが中身を考える時間に回っただけです。

制作フロー:音が先、絵はあと

設計で効いたのは一点だけだと思っています。カットの長さを、先に決めないことです。

ふつうは絵コンテを描いて「このカットは4秒」と決めたくなります。この道具は逆で、先に VOICEVOX に喋らせます。出てきた音声の長さを測って、その秒数をカットの長さにする。フレームの枚数も、ズームの速さも、テロップが出るタイミングも、全部そこから計算されます。

副作用が気に入っています。ナレーションを差し替えれば、動画全体が自動で組み直る。裏を返せば、音声より先に絵を描いても意味がない。作業の順番が1つに固定されました。

台本のほうも簡単で、1カットにつき ID・シーン名・喋る内容の3つだけです。

dict(id="c2", scene="payoff",
     say="AIに12分やらせたら、205行のメモができたのだ。"),

これを7つ並べた14行が台本の全部です。決まりが2つあります。1つは、各カットに句読点を必ず入れること。VOICEVOX のアプリから手で書き出した音声を使う場合に、無音の数と句読点の数を突き合わせて分割位置を決めるからです(今回はエンジンを直接叩いたので、この経路は使っていません)。もう1つは、数字とアルファベットをカタカナで書くこと。URL は「ユーアールエル」と書かないと読みが安定しません。

技術詳細:カットごとの実測

カット

ナレーション

前後の無音を足した尺

c1

3.381秒

3.801秒

c2

4.405秒

4.825秒

c3

5.216秒

5.636秒

c4

3.104秒

3.524秒

c5

3.883秒

4.303秒

c6

4.469秒

4.889秒

c7

5.120秒

5.540秒

前に0.12秒、後ろに0.30秒の無音を足したものが、そのカットの尺です。合計32.518秒。書き出した mp4 を ffprobe で測った値と、小数点以下まで同じでした。台本を書く段階の当たりは「モーラ数 ÷ 6.0秒」で付けています。

紙芝居にしないためにやったこと

スライドを順に映すだけの動画にはしたくありませんでした。方針は「資料を見せるのではなく、体験を見せる」です。

やったことは4つ。実際のアプリ画面を全画面で敷いてゆっくりズームする。注目してほしいところに赤枠を描く。ずんだもんのリアクションを重ねる。テロップを出す。画面に占める割合は、操作画面40%・キャラのリアクション25%・テロップ35%を目安にしました。

手順パートの3カット。アプリ画面を全画面で敷き、注目箇所に赤枠を描いてテロップを重ねている
手順パートの3カット。アプリ画面を全画面で敷き、注目箇所に赤枠を描いてテロップを重ねている

赤枠の位置は、画面の座標ではなく、元のスクリーンショットに対する割合で持たせています。ズームやパンで位置が動いても、枠は同じ場所に付いてくる。代わりに、スクリーンショットを差し替えたら数値も直すことになります。

構成は、掴み → 結論 → 手順 → 注意 → CTA。結論は最初の5秒に置きます。

最初は3Dで作ろうとした

立ち絵を2Dにするか3Dにするかは、最初から決まっていたわけではありません。

公式のVRMモデルをレンダリングする経路を作りました。読み込みは素直で、絵も出ました。そこまでやって、使わないことにしました。

静止画で2Dの立ち絵と並べたら、2Dのほうが明確に良かったからです。理由は3つ。3Dは頭身が高い。枝豆の尻尾が正面から見えない。表情の差が、ショートのサイズでは読み取れない。

ただ、これは「3Dはダメ」という話ではありません。3Dに意味が出るのは、動かす場合だけです。首を傾げる、体を揺らす。1フレーム約10秒なので、2秒のループなら10分で作れます。今回は動かしていないので、捨てました。

技術的に「できる」ことと、動画として「良い」ことは別でした。作れたから使う、にならなくてよかったと思います。

技術詳細:3Dの読み込みと見た目

  • 公式VRMは、拡張子を .glb に変えれば Blender 標準の glTF インポータでそのまま開きます
  • MToon(アニメ調の塗りを再現するシェーダ)は再現できないので、ベースカラーを Emission に繋いでフラット塗りにしました
  • 輪郭線は、法線を反転させた Solidify で足しています
  • この経路は bin/vrm_render.py の144行。残してはいますが、使っていません

音とBGMは自動で調整させた

BGMは既存の曲を使わず、その場で合成しています。マリンバ、ベル、ベース、キック、クラップ、ハットを numpy で作って重ねる。

理由は Content ID です。既存の音源を使うと、YouTube で権利者の申し立てが付くことがあります。自分で作った波形なら、その心配がありません。

実際に良かったのは別のところでした。小節ごとに、どの楽器を鳴らすかを表で持たせてあります。12〜13小節目でリズムを抜いて「注意点」のパートに合わせ、14小節目から戻して結論に向かう。既存曲を貼るだけでは、こういう合わせ方はできません。

ナレーションとBGMの音量も自動です。喋っている間はBGMが下がり、カットの切れ目では持ち上がって間を埋めます。

この効き方も、12〜13小節目でリズムが抜けるところも、文字では伝わりません。実際の音はこれです

技術詳細:音量の設定

  • BGMは118BPM、16小節。コード進行は4536(F - G - Em - Am)を4周
  • ナレーションを -16 LUFS、BGMを -24.5 LUFS に整えたうえで、ナレーションをキーにしてBGMを下げます(サイドチェイン)
  • LUFS は人の耳が感じる音の大きさの単位です。喋っている間は声がBGMより12〜19dB上になります
  • 書き出した mp4 の実測は -14.4 LUFS、True Peak(瞬間的な最大値)-1.4 dBTP

YouTubeとInstagramで出し分ける

同じコードから、YouTube ショート版と Instagram リール版の2つを書き出せます。切り替えるのは環境変数1つです。

違うのは、画面のどこを空けるかと、BGMを入れるかどうか。YouTube は右端のいいね・コメント・共有のボタン列と、下の情報エリアを避けます。Instagram は下35%を空けます。リールはアプリ側でトレンド音源を足す前提なので、BGMは入れません。

安全域の確認は、数値ではなく目でやります。安全域を色で重ねたコンタクトシートを作って、文字が隠れていないかを見る。テロップを中央揃えにせず左に寄せているのも、立ち絵の裏に文字が入るのを避けるためです。

今回書き出したのは YouTube 版だけです。

技術詳細:出し分けの中身

YouTube ショート

Instagram リール

避ける領域

右端のボタン列と下の情報エリア

下35%

レイアウトのずらし

左に95px・上に75px

なし

BGM

あり

なし

音量

-14 LUFS

-16 LUFS

CTAの文言

概要欄のリンクから

プロフィールのリンクから

クレジットは飾りではない

立ち絵の表情は、PSDから5種類だけ書き出しています。困った顔、驚いた顔、話している顔、むっとした顔、得意げな顔。

ここで規約の話をしておきます。ずんだもんの音源利用ガイドラインによると、利用の際にはクレジット表記が必要です。クレジット表記をしない商用利用は、1キャラクターあたり40万円(+消費税)の契約になります。だから毎フレームの左上に「音声合成:VOICEVOX:ずんだもん」を描く処理を入れてあります。忘れようがない場所に置く、というのが答えでした。概要欄にも同じクレジットを残しています。

同じガイドラインで、情報商材での利用と、情報商材を宣伝する目的での利用は禁止されています。この動画から有料教材に誘導する導線は作れません。立ち絵のPSDは、配布元のBOOTHページで再配布が断られています。素材が紛れ込まないよう、PSDとVRMは .gitignore で除外してあります。

実際にやって分かったこと

  • 44分で1本できた。ただし素材の準備は別で、立ち絵は午前中に用意していました
  • 機械が動いていたのは2分半。時間を食ったのは中身の調整のほうです
  • 数字の多い記事は、動画にしやすい
  • 技術的に「できる」ことと、動画として「良い」ことは別だった

いちばん意外だったのは2つ目です。自動化した部分は驚くほど速く、遅いのは人が見て決めるところでした。速くしたければ、コードではなく判断のほうを速くする必要があります。

動画化を前提にブログを書く

作ってみて、いちばん持ち帰れたのはここでした。

元記事にあった数字が、そのまま動画の見せ場になっています。12分で205行が2カット目、参照18本・7ドメインが5カット目、公式サイトと一致17件・確認できず3件が6カット目。台本を考えたのではなく、記事から拾っただけです。

6カット目と7カット目。元記事の検算結果が、そのまま6カット目の数字になっている
6カット目と7カット目。元記事の検算結果が、そのまま6カット目の数字になっている

逆に言うと、数字の入っていない記事は動画にしにくい。記事を書く段階で、○分・○件・○円・○個・○%・比較の結果を残しておくと、あとで台本の骨になります。ブログ記事からショート動画、そこからSNS投稿へと使い回すつもりなら、いちばん手前でやっておくことです。

この仕組みを自分でも作るなら

必要なものは多くありません。

  • Claude Code
  • Python と ffmpeg
  • VOICEVOX(無料)
  • キャラクターの立ち絵などの素材
  • 元になるブログ記事と、記事中の画面のスクリーンショット

流れはこうです。

  1. 元になるブログ記事を用意する
  2. Claude Code に、記事から台本を書かせる
  3. 台本からナレーションを合成する
  4. ナレーションの長さから、カットの尺を決める
  5. Python で1枚ずつフレームを描く
  6. ffmpeg で音とつないで mp4 にする

このうち3から6は、コマンド1つで通しで走ります。人が手を動かすのは1と2、それと出てきたものを見て直すところです。

まとめ

できた動画は YouTube に上げました。公開は14:12、mp4 ができてから14分後です。タイトルは投稿メモに並べた3案から「旅行の下調べって面倒くさくない?AIに全部やらせてみた」を選びました。

ブログ記事は、そのままショート動画に作り直せます。そしてこの場合、Claude Code にやってもらうのは動画を出すことではなく、動画を出す道具を用意することのほうです。次は、ほかのAI関連の記事も同じ形で動画にしていきます。

この記事をシェア

この記事を書いた人

たくま

ITエンジニア

受託・自社サービスの開発を仕事にしているITエンジニア。AIコーディングツールや生成AIを日々の業務でどう使うか、実際に試した結果を記事にしています。

もっと記事を読んでみませんか?

AI・ガジェットから動画編集・グルメ・旅行まで、夫婦それぞれの実体験を随時更新しています。