コマンド1行で、台本が生成されて、ナレーション音声が作られて、スライドができて、動画が完成して、そのままYouTubeにアップロードされました。それが77秒で終わりました。「動くものをつくる」を信条にしてきた私ですら、正直、唸りました。専門学校生向けのIT教育コンテンツを量産するために始めたこの実験が、予想をはるかに超えた結果になったので、その全工程を公開します。
何を作ったのか
専門学校生向けのIT教育動画を自動で量産するパイプラインです。テーマを1行渡すだけで、台本生成から動画エンコード・YouTube投稿まですべてが自動で完結します。
全工程の流れ: テーマ入力 → Claude Sonnet 4.6が台本とプロンプトをJSON生成 → gTTSが日本語ナレーション音声を生成 → DALL-E 3がAI背景画像を生成(Shorts時) → Pillowでスライド画像を合成 → ffmpegで動画エンコード → YouTube Data API v3でアップロード完了
通常の横型動画だけでなく、YouTube Shorts(縦型)にも対応しています。--shortsフラグを付けるだけで、解像度・レイアウト・動画尺がShortsの仕様に切り替わります。AI背景画像を使うかどうかも、コマンドライン引数で制御できる設計にしました。
個人開発の観点で言うと、この仕組みは「コンテンツ制作そのものをAPI呼び出しに変換した」ものです。動画制作のノウハウがなくても、テーマさえ決まれば動画が出てきます。非エンジニアでも使えるものを目指して構築しました。
使ったAPIと役割
4つのAPIを組み合わせて動かしています。それぞれの役割と費用をまとめます。
Claudeが返すJSONの中に、セクションごとのテキスト・ナレーション文・画像プロンプトがすべて入っています。後続の処理はこのJSONを読むだけでよく、AIが「設計書」を自動生成する構造です。コーディングの難易度が下がり、バグが入り込む余地も減ります。
環境構築の手順
macOSでの構築手順です。Homebrewとpip3が入っていれば、30分程度で完了します。
1. ffmpegのインストール
brew install ffmpeg
2. Pythonライブラリのインストール
pip install anthropic openai gTTS Pillow \
google-api-python-client google-auth-oauthlib python-dotenv
3. Google Cloud ConsoleでYouTube APIを有効化
- Google Cloud Console でプロジェクトを新規作成する
- 「APIとサービス」から YouTube Data API v3 を検索して有効化する
- 「認証情報」から OAuth 2.0 クライアントID(アプリの種類:デスクトップアプリ)を作成する
- ダウンロードした JSON ファイルを
credentials/client_secret.jsonとして配置する - OAuth 同意画面のテストユーザーに自分のGoogleアカウントを追加する
OAuth同意画面の注意点: 同意画面が「テストモード」のままだと、登録済みのテストユーザー以外はアップロードできません。自分のアカウントをテストユーザーに追加してから実行してください。
4. APIキーの設定
プロジェクトルートに .env ファイルを作成して、以下を記述します。
ANTHROPIC_API_KEY=sk-ant-xxxxx
OPENAI_API_KEY=sk-xxxxx
初回実行時はブラウザでのOAuth認証が求められます。認証後は token.pickle が生成されて、以降は自動認証です。このファイルには有効期限があるため、認証エラーが出たら削除して再実行すると解消します。
コマンド1行で動かす
基本的な使い方は3パターンです。すべて pipeline.py に引数を渡すだけで動きます。
通常動画(横型・16:9)
python3 pipeline.py --topic "Pythonとは何か?初心者向け3分解説" --privacy private
YouTube Shorts(縦型・1080×1920 + AI背景画像)
python3 pipeline.py --shorts --with-images --image-style anime \
--topic "Claude Code で変わるコーディング!専門学校生必見" --privacy private
ローカルテスト(アップロードなし)
python3 pipeline.py --topic "テーマ名" --skip-upload
--privacy private を付けると非公開でアップロードされます。内容を確認してから公開に変更できるので、最初はこの設定で動かすのがおすすめです。--skip-upload はAPIキーなしで全工程のローカルテストができるため、動作確認に使います。
検証結果
2種類の動画で検証した結果を報告します。
通常動画(横型)——77秒で完結
テーマ「Pythonとは何か?初心者向け3分解説」で実行。台本はClaude Sonnet 4.6が7セクション構成で生成し、最終的な動画尺は2分50秒、ファイルサイズは3.3 MBで収まりました。台本入力からYouTubeアップロード完了まで76.7秒——コマンドを実行してからYouTubeのダッシュボードに動画が出現するまで、1分17秒です。
YouTube Shorts(縦型 + AI背景画像)——約2分で完結
テーマ「Claude Code で変わるコーディング!専門学校生必見」でShortsを生成。解像度1080×1920、動画尺は約37秒。DALL-E 3のアニメ風画像を4枚生成してスライドに合成し、最終ファイルサイズ1.3 MB。所要時間は約2分で完了。画像生成の分だけ時間がかかりますが、それでも人手で作れば数時間かかる作業が2分で終わります。
実際にかかったコストと時間
1本あたりのAPIコストを整理しました。
| API | 用途 | コスト(通常動画) | コスト(Shorts+画像) |
|---|---|---|---|
| Anthropic API | 台本・プロンプト生成 | 数円程度 | 数円程度 |
| OpenAI(DALL-E 3) | AI背景画像生成 | なし | 約$0.16(4枚×$0.04) |
| YouTube Data API v3 | 動画アップロード | 無料 | 無料 |
| gTTS | 音声合成 | 無料 | 無料 |
コスト的に最も大きいのはDALL-E 3の画像生成です。--with-images を省略すると、代わりにPillowでシンプルな背景を生成するため、AI画像なしのShortsであれば追加コストはほぼゼロです。
YouTube APIには1日あたりのアップロード上限が6本あります。大量テストは --skip-upload で動画ファイルだけをローカルに生成して、上限を温存することをおすすめします。
ハマりポイントと対策
実際に構築する中で詰まったポイントを共有します。同じところで止まらないよう、先にまとめておきます。
認証エラー:token.pickleの期限切れ
token.pickle はOAuth認証のトークンを保存したファイルです。有効期限が過ぎるとアップロード時にエラーになります。token.pickle を削除して再実行すると、ブラウザが開いて再認証できます。
テストモードのOAuth同意画面
Google Cloud Consoleで作成したOAuthクライアントは、デフォルトで「テストモード」です。この状態では、OAuth同意画面に登録したテストユーザー以外のアカウントではアップロードできません。自分のGoogleアカウントをテストユーザーとして追加してください。
セキュリティ:.envのGitコミット禁止
.env にはAPIキーが入っています。絶対にGitにコミットしてはいけません。.gitignore に .env と credentials/ と token.pickle を、最初に必ず追加してください。これを忘れると、公開リポジトリにAPIキーが露出します。
音声品質:gTTSは機械的
gTTSは無料で使えますが、読み上げが機械的です。教育コンテンツとして実用できるレベルですが、もっと自然な音声が必要な場合はVOICEVOX(無料・オープンソース)への切り替えを検討してください。コードの差し替え箇所は音声生成の1関数だけで済みます。
動画品質の調整
動画の速度・画質(CRF値)・fps は config.yaml で設定できます。コードを変更せずにパラメータを調整できるので、クオリティを上げたい場合はまずここを触ってください。
全部まとめると: .env と credentials/ と token.pickle を .gitignore に入れる。OAuth同意画面にテストユーザーを追加する。認証エラーは token.pickle 削除で解消。この3点を最初に押さえれば、あとはスムーズに動きます。
まとめ——動くものをつくることの意味
台本の入力からYouTube投稿まで、完全自動化に成功しました。通常動画は77秒、Shortsは約2分。コストは1本あたり数円から、AI背景画像ありでも$0.16程度です。なお、このパイプライン自体はClaude Codeを使って設計・実装しました。
私が「動くものにしか、人は興味を持たない」と言うとき、その意味は「完璧でなくていい、まず動かせ」ということです。このパイプラインも、最初から完璧な動画が出てくるわけではありません。gTTSの音声は機械的だし、スライドのデザインもシンプルです。でも、動いた。テーマを渡したら動画になった。YouTubeに上がった。 この事実が、次の改善のモチベーションになります。
高速開発と個人開発の本質は、「完成させてから考える」ではなく、「動かしてから磨く」です。Claude Codeを使ったAI開発でも、このパイプラインでも、同じ考え方で進めています。エンジニアじゃなくても、コマンド1行で動画をYouTubeに上げられる時代になりました。ぜひ一度、試してみてください。