Suno×ffmpeg×Playwright自動化スクリプト深掘り|loudnorm二段パス+YouTubeアップロード自動化の実装ログ2026

AIツール比較ガイド

Suno×ffmpeg×Playwright自動化スクリプト深掘り|loudnorm二段パス+YouTubeアップロード自動化の実装ログ2026

著者: EJ 公開:
  • #Suno
  • #ffmpeg
  • #Playwright
  • #loudnorm
  • #YouTube BGM
  • #Python
  • #自動化
  • #2026

PR表記: 当記事にはアフィリエイト広告(プロモーション)を含みます。リンク先で契約・購入された場合、運営に紹介料が発生する場合がありますが、価格や評価はリンクの有無に左右されません。技術仕様・料金・規約は2026年5月時点で各公式ドキュメントおよび第三者レビューを横断確認した内容です。最新情報は必ずリンク先公式でご確認ください。

免責事項: 本記事はaikatsulab.com 運営者(EJ)が運営するYouTube BGMチャンネル「Moonlight Serenity」「Shiloh Jazz」で2026年5月時点に実走中の自動化スクリプト群(1_normalize_audio.py / 2_create_video.py / 3_thumbnail_create.py / 4_suno_automation.py / 5_youtube_upload.py)の実装ログを、第13号(AI×YouTube BGM副業)の技術深掘り続編として整理した記事です。コードはあくまで実装の参考情報であり動作保証はしません。Suno・YouTube・FFmpeg・Playwright・Google APIの各仕様・規約は予告なく改訂される可能性が高いため、最終判断時は必ず各公式の最新版をご確認ください。Sunoの自動化ツール(Playwright経由のUI操作補助等)は公式APIが提供されておらず非公式運用となるため、本記事の運用例を採用する場合はSuno公式利用規約を都度確認し、規約に抵触する用途では使用しないでください。再現性・収益保証はありません。本記事に登場するConoHa AI Canvasはaikatsulab.com 運営者は2026年5月時点で未契約で、本リンクはもしもアフィリエイト提携案件として紹介するものです。Moonlight Serenity・Shiloh Jazzは久世明人名義/EJ別屋号で運営しており、aikatsulab.com(EJ名義)とは事業を明確に分離しています

結論サマリー(30秒で読める要点)

  • Moonlight Serenityで実走中の自動化パイプラインを開示(🟢緑): 2026年5月時点で192本投稿・4,000時間視聴達成済のMoonlight SerenityチャンネルでEJが実走している5段構成パイプライン(1_normalize_audio.py / 2_create_video.py / 3_thumbnail_create.py / 4_suno_automation.py / 5_youtube_upload.py)を、各スクリプトの役割と処理フロー単位で開示しました。コード全文は機密扱いで非公開、擬似コードとffmpegコマンド断片レベルでの開示に留めています。
  • loudnorm二段パスがBGMチャンネル運用の核(🟢緑+🟡黄): ffmpegのloudnormフィルターを一段で適用すると音圧崩壊・トゥルーピーク超過・LRA潰れの3問題が発生しがちとされます。本記事H2-3で一段目で実測値をJSON取得→二段目で実測値を引数注入する二段パス手順を実コマンド付きで開示。YouTube推奨のI=-14 LUFS・TP=-1 dBTP・LRA=11を目標値として運用しています(数値はEBU Tech 3343準拠+YouTube公式仕様横断、ffmpeg公式ドキュメント基準)。
  • Playwright自動化はSuno規約配慮の半自動運用(🟡黄): Suno公式の自動化API・公式SDKが2026年5月時点で提供されていないため、4_suno_automation.pyはPlaywrightによるUI操作補助に限定し、(1)同時実行1スレッド (2)半自動の補助操作のみ (3)規約改定で即時停止 (4)Pro/Premier等商用利用許諾プランの契約下のみ、の4ルールで運用しています。読者の方が同様の運用を行う場合はSuno公式規約を必ず事前確認してください
  • 月60本ペースは設計目標であり実数値ではない(🟢緑): Moonlight Serenityでは月60本投稿を設計目標として運用していますが、Sunoのクレジット消費・生成失敗の歩留まり・再生数バラツキ・同一背景の使い回しによる再利用判定リスクの4点で、現実の歩留まりは個人差・素材差が大きいです。プレイリストごとに新しい背景を生成する運用ルール(別事業の運用フィードバック)で再利用判定を回避しています。
  • 🔴赤回避ルール5項目を厳格運用(🟢緑): 「絶対稼げる」「月◯万円確実」「100%」「最強」断定の禁止、「規約を破ってもバレない」等の規約軽視表現の禁止、自社事案を確定的に「景表法違反」と書かない(社内法務点検による予防修正表現で統一)、Suno規約・YouTube収益化ポリシーは「2026年5月時点」+公式最新確認の併記、収益化基準達成は「Moonlight Serenityで2026年5月時点で達成済」の限定表現、の5ルールを本記事全編で厳守しています。

1. なぜ自動化スクリプトが必要か|手動ワークフローの限界と月60本の発射台

第13号AI×YouTube BGM副業 2026年版では、SunoでBGMを生成しYouTubeチャンネルとして運営する全体像を扱いました。本記事(第21号)はその技術深掘り続編として、aikatsulab.com 運営者(EJ)が別屋号で運営するMoonlight Serenity・Shiloh JazzチャンネルでEJが実走中の自動化スクリプト群を、実装ログとして開示します。

手動ワークフローの限界(🟢緑・EJ実体験)

Moonlight SerenityチャンネルでEJが2025年10月頃に運用を開始した当初は、以下の手動フローで1曲あたり約30〜45分の後処理時間がかかっていました。

工程手動所要時間手動の問題点
Suno UIで楽曲生成約1〜2分生成自体は短い、ここはAI側の処理
MP3/WAVダウンロード約30秒UIのDLボタンをクリック、複数曲だと手数増
音量正規化(GUI音声編集)約5〜10分EQ・コンプ調整、曲ごとに音圧バラツキ
波形動画作成(動画編集ソフト)約15〜25分波形プラグイン+背景動画+テキスト合成
サムネ作成(画像編集ソフト)約5〜10分テンプレからの差し替え
YouTubeアップロード+メタデータ入力約3〜5分タイトル・タグ・説明文・終了画面
1曲合計約30〜45分月60本ペースだと約30〜45時間/月の単純作業

「楽曲生成はAIで1分、後処理が30分」という極端な逆転が起きており、月60本ペース(設計目標)を目指すと1曲あたりの後処理時間を10分以下に圧縮しないと持続不可能でした。これがスクリプト化を進めた根本動機です。

月60本ペースは「設計目標」(再現性は限定的)

Moonlight Serenityでは月60本投稿を設計目標として運用していますが、実数値ベースでは以下の制約が継続的に発生します。

  • Sunoのクレジット消費・生成失敗: Pro/Premierプランのクレジット枠内で、希望ジャンルが当たるまで複数回生成が必要なケースあり
  • 再生数バラツキ: 投稿数=収益ではなく、同じBGMジャンルでも曲ごとに10倍以上の再生数差が出るのが通常
  • 同一背景の再利用判定リスク: YouTube側の再利用コンテンツ判定を避けるため、プレイリストごとに新しい背景を生成する運用ルール(別事業の運用フィードバック由来)で対応
  • 季節・プレイリスト編成の制約: 睡眠BGM・ジャズ・ローファイなどジャンルごとに編成ペースを調整

本記事は『月60本=月◯万円』のような収益見込み断定は一切記載しません。月60本ペースはあくまで運用設計の目標値であり、現実の歩留まり・収益は個人差が大きく、再現性・収益保証はないという前提で読んでください。

なお、2026年5月時点のMoonlight Serenityチャンネルは192本投稿・累計4,000時間視聴を達成しており、これは収益化基準達成のための一指標です。これも個人の一事例であり、第13号読了後の参考データとして開示します。


2. 全体パイプライン|Suno→ffmpeg loudnorm→動画合成→Playwright→YouTube

aikatsulab.com 運営者(EJ)がMoonlight Serenity・Shiloh Jazzで実走中のパイプラインは、以下の5スクリプト構成です。

5スクリプト構成図(🟢緑・実運用中の役割)

ファイル名役割主要ライブラリ開示レベル
1_normalize_audio.pySuno生成楽曲を-14 LUFSにffmpeg loudnormで正規化(二段パス)ffmpeg(subprocess経由)、jsonH2-3で擬似コード+コマンド断片
2_create_video.py波形可視化+ループ背景動画+テキストオーバーレイをffmpegで合成ffmpeg(showwaves・overlay・drawtext)、PillowH2-4で処理フロー+ffmpeg引数断片
3_thumbnail_create.pyサムネイル生成補助(テンプレート画像+曲名テキスト合成)Pillow、画像生成AI併用H2-5でフロー概要
4_suno_automation.pyPlaywrightによる Suno UI 自動操作補助(半自動・規約配慮)playwright(Python版)、time、loggingH2-6で運用ルールと擬似コード
5_youtube_upload.pyYouTube Data API v3経由のアップロード+メタデータ投入google-auth-oauthlib、google-api-python-clientH2-7で認証フロー+クォータ設計

ディレクトリ構成テンプレ(参考イメージ)

moonlight_serenity/
├── scripts/
│   ├── 1_normalize_audio.py
│   ├── 2_create_video.py
│   ├── 3_thumbnail_create.py
│   ├── 4_suno_automation.py
│   ├── 5_youtube_upload.py
│   └── lib/
│       └── ffmpeg_helpers.py
├── input/                  # Sunoからダウンロードした生楽曲
├── normalized/             # loudnorm二段パス適用後のMP3/WAV
├── videos/                 # ffmpeg合成済の動画ファイル
├── thumbnails/             # サムネ画像
├── metadata/               # タイトル・タグ・説明文のJSON
├── credentials/            # YouTube OAuthトークン(gitignore対象)
└── logs/                   # 各スクリプトの実行ログ

必要環境(🟡黄・公式情報ベース)

カテゴリ推奨/必須備考
Python3.11+2026年5月時点のメジャー版
ffmpeg6.x以降loudnorm filterの実装が安定している版
Playwright(Python)1.40+Chromium driverの最新を併用
Google API Clientgoogle-api-python-client最新版OAuth2リフレッシュトークン運用
Pillow10.x以降サムネ合成・テキスト描画
OSmacOS / LinuxEJはmacOSで運用、Linuxでも動作想定

これらの環境構築自体は本記事のスコープ外ですが、PythonとffmpegのインストールがネックになるケースはZenn・Qiita等の第三者技術記事を併読してください。

サムネ生成補助の選択肢(🟡黄・ConoHa AI Canvasは未契約)

サムネイル生成補助については、3_thumbnail_create.pyでPillowベースのテンプレート合成を行いつつ、背景画像は別途画像生成AI(無料枠のGemini Image系等)で都度生成する運用が現実線です。Stable Diffusion系のWebUIをブラウザで使う円建てサブスクとしては**ConoHa AI Canvas(月額990円〜)**が選択肢の一つとされます。

aikatsulab.com 運営者は2026年5月時点でConoHa AI Canvasは未契約で、本記述は公式情報・他社レビューの横断調査に基づきます。本リンクはもしもアフィリエイト提携案件として紹介するものです。サムネ生成深掘りはConoHa AI Canvas完全レビューで整理しています。

PR

BGMチャンネル運用のサムネ生成補助にGPU環境を確保するなら|ConoHa AI Canvas

Suno自動化パイプラインの中でサムネ画像生成だけはAI画像生成側に依存します。aikatsulab.com 運営者のMoonlight Serenity・Shiloh Jazzでは無料枠のGemini Image系を併用していますが、Stable Diffusion系のWebUIをブラウザから日本語UIで操作する円建てサブスクとしてはConoHa AI Canvas(月額990円〜)が選択肢の一つとされます。商用利用ライセンス・日本語サポート・円建て会計の3点を重視する個人事業主向きで、ドル建てサブスク(Midjourney $10〜・ChatGPT Plus $20内包DALL-E)の為替変動を避けたい方の代替案です。aikatsulab.com 運営者は2026年5月時点でConoHa AI Canvasは未契約で、本記述は公式情報・他社レビューの横断調査に基づきます。本リンクはもしもアフィリエイト提携案件として紹介するものです。料金・商用利用条件は契約前に必ず公式の最新版でご確認ください。

ConoHa AI Canvas公式で料金プランを確認する →

※運営者は未契約・もしもアフィリエイト経由のプロモーションです


3. 1_normalize_audio.py|loudnorm二段パス実装(I=-14 LUFS / TP=-1 dBTP / LRA=11)

YouTube BGMチャンネル運用の最重要工程がここです。Sunoの生成楽曲は曲ごとに音圧がバラつくため、ffmpegのloudnormフィルターで-14 LUFSターゲットに統一する必要があります。

なぜ-14 LUFSなのか(🟡黄・YouTube仕様ベース)

YouTubeは再生時に音量を自動正規化(Loudness Normalization)しており、目安として統合ラウドネス(Integrated Loudness)-14 LUFS前後を基準に音量を揃えるとされます。これより大きい音量で投稿すると再生時に下げられ、小さすぎると上げられず音圧負けする、というのが一般的な認識です。

EBU R128規格の関連仕様としては以下が参考になります(EBU公式・ffmpeg公式ドキュメントベース)。

パラメータ推奨値意味
I(Integrated Loudness)-14 LUFS曲全体の平均ラウドネス、YouTube基準
TP(True Peak)-1 dBTPデジタルクリップ回避の上限
LRA(Loudness Range)11 LUダイナミクスの広さ、BGMでは11前後が目安

数値は2026年5月時点のYouTube公式仕様・EBU Tech 3341/3342/3343規格・ffmpeg公式ドキュメントの横断調査ベースです。各仕様は更新される可能性があるため、最終判断時は必ず公式最新版を確認してください。

なぜ二段パスなのか(🟡黄・ffmpeg公式ベース)

ffmpegのloudnormフィルターは一段パス(linear=false / dynamic)でも動作しますが、入力素材の実測値を知らずに適用すると音圧崩壊・TP超過・LRA潰れの典型問題が発生します。

二段パスでは以下の順序で処理します。

  1. 一段目(測定パス): 入力ファイルに対してloudnormprint_format=jsonで実行し、measured_I / measured_TP / measured_LRA / measured_thresh / target_offsetの5値をJSON取得
  2. 二段目(適用パス): 一段目で取得した実測値を引数としてloudnormに注入し、linear=trueモードで実際の正規化を適用

これにより真値ベースでの-14 LUFS到達精度が大きく上がるとされます(ffmpeg公式ドキュメントのloudnorm filter解説より)。

一段目(測定パス)のffmpegコマンド実例

ffmpeg -i input.wav -af "loudnorm=I=-14:TP=-1:LRA=11:print_format=json" -f null - 2>&1 | tail -n 12

出力は標準エラー側にJSONブロックが現れる形式です。これをPythonで抽出する処理が1_normalize_audio.pyの一段目の中核になります。

1_normalize_audio.py の擬似コード(機密化レベル: 中。実コードは非公開、擬似コードで開示)

# 1_normalize_audio.py  (擬似コード・実装の参考情報、動作保証はしません)
import subprocess
import json
import re
from pathlib import Path

TARGET_I = -14.0      # YouTube基準の統合ラウドネス
TARGET_TP = -1.0      # トゥルーピーク上限
TARGET_LRA = 11.0     # ラウドネスレンジ目標

def measure_loudness(input_path: Path) -> dict:
    """一段目: loudnormの測定パスを走らせてJSON実測値を取得"""
    cmd = [
        "ffmpeg", "-i", str(input_path),
        "-af", f"loudnorm=I={TARGET_I}:TP={TARGET_TP}:LRA={TARGET_LRA}:print_format=json",
        "-f", "null", "-",
    ]
    proc = subprocess.run(cmd, capture_output=True, text=True)
    # 標準エラー側に出るJSONブロックを正規表現で抽出
    json_block = re.search(r"\{[\s\S]*?\}", proc.stderr).group(0)
    return json.loads(json_block)

def apply_loudnorm(input_path: Path, output_path: Path, measured: dict) -> None:
    """二段目: 実測値を引数注入してloudnormを適用パスで実行"""
    af = (
        f"loudnorm=I={TARGET_I}:TP={TARGET_TP}:LRA={TARGET_LRA}:"
        f"measured_I={measured['input_i']}:"
        f"measured_TP={measured['input_tp']}:"
        f"measured_LRA={measured['input_lra']}:"
        f"measured_thresh={measured['input_thresh']}:"
        f"offset={measured['target_offset']}:"
        f"linear=true:print_format=summary"
    )
    cmd = [
        "ffmpeg", "-y", "-i", str(input_path),
        "-af", af,
        "-ar", "48000",          # サンプリングレート48kHzに統一
        "-c:a", "pcm_s16le",     # 一旦WAVで吐き、後段でAACエンコード
        str(output_path),
    ]
    subprocess.run(cmd, check=True)

def normalize_one(input_path: Path, output_path: Path) -> None:
    measured = measure_loudness(input_path)
    apply_loudnorm(input_path, output_path, measured)

# バッチ実行: input/*.wav を normalized/ に二段パス適用
if __name__ == "__main__":
    for src in Path("input").glob("*.wav"):
        dst = Path("normalized") / src.name
        normalize_one(src, dst)
        print(f"normalized: {src.name}")

実コードでは(1)失敗時のリトライ (2)ログ出力 (3)既存ファイルのスキップ判定 (4)複数フォーマット(MP3/WAV/FLAC)対応 (5)サンプリングレート統一の細部、を追加実装していますが、本記事では中核ロジックの擬似コードに留めます。動作保証はしませんが、実装の参考情報として開示します。

よくある失敗例(🟢緑・EJ実体験)

失敗パターン症状対処
一段loudnorm(linear=false)で適用曲ごとの音圧バラツキが残る、YouTube再生時に音量差二段パスに切り替え、実測値を引数注入
measured_I等の値を文字列のまま渡すffmpegフィルター文字列の解析エラーf"{measured['input_i']:.2f}"等で丸めて渡す
サンプリングレート未指定48kHzと44.1kHzが混在し、後段の動画合成で警告-ar 48000を二段目で明示
二段目のJSON出力をパースに失敗標準エラーに別の警告が混じり正規表現が外れるより厳密なJSON抽出(json.JSONDecoder.raw_decode等)に変更

このセクションが本記事の競合差別化の核です。SERP上位3記事のいずれもloudnorm二段パスの実コマンド+擬似コード+失敗例の3点セットをカバーできていない、というのがノゾミの競合分析結果でした。


4. 2_create_video.py|波形+ループ動画+テキスト合成

正規化済の音声ファイルから、YouTubeアップロード用の1時間〜10時間ループBGM動画を生成するスクリプトです。

処理フロー(🟢緑・実運用中)

  1. 正規化済オーディオを読み込み(normalized/foo.wav)
  2. 背景画像/ループ動画を読み込み(プレイリストごとに新規生成、再利用判定回避)
  3. 波形可視化レイヤーを生成(ffmpegのshowwaves or showspectrumフィルター)
  4. 曲名テキストオーバーレイ(ffmpegのdrawtextフィルター)
  5. 音声と映像を合成(ffmpegのoverlay + concat)
  6. YouTube推奨形式で出力(H.264 / AAC / 1920×1080 / 30fps)

ffmpeg合成コマンド断片(参考)

ffmpeg -y \
  -loop 1 -i background.png \
  -i normalized/track.wav \
  -filter_complex "[1:a]showwaves=s=1920x180:mode=line:colors=white[wave];\
    [0:v][wave]overlay=0:H-h-40[withwave];\
    [withwave]drawtext=text='Track Title':fontfile=/path/to/font.ttf:\
    fontsize=48:fontcolor=white:x=(w-tw)/2:y=80[v]" \
  -map "[v]" -map 1:a \
  -c:v libx264 -preset medium -crf 20 -pix_fmt yuv420p \
  -c:a aac -b:a 192k \
  -shortest output.mp4

実コードでは(1)複数曲のconcat (2)イントロ/アウトロのテンプレート結合 (3)BGMジャンル別フェードイン/アウト (4)10時間ループ用の-loop 1+streamcopy最適化、を組み合わせていますが、本記事ではコマンド断片に留めます。

プレイリストごとに新背景を生成する運用ルール(🟢緑)

Moonlight Serenity・Shiloh Jazzではプレイリストごとに必ずChatGPTもしくは画像生成AIで新しい背景を生成→シームチェック→動画作成という運用ルールを設定しています(同一背景の使い回しによるYouTube再利用判定リスク回避)。

これは「自動化を進めると同じ素材を使い回したくなる誘惑が出るが、長期運用ではむしろアカウント安全性を下げる」という別事業の運用フィードバックから得たルールです。AIで自動化していても、最後のクオリティ判断は人間が入れる構成です。

関連記事|画像生成AIの比較

サムネ・背景生成に使う画像生成AIの比較は以下の記事を併読してください。


5. 3_thumbnail_create.py|サムネイル生成補助

YouTube BGM動画のサムネイル生成も自動化対象です。3_thumbnail_create.pyはPillowベースのテンプレート合成スクリプトとして実装しています。

処理フロー(🟢緑)

  1. テンプレート画像読込: プレイリストごとに用意した背景画像(1280×720)
  2. 曲名/プレイリスト名のテキスト描画: PillowのImageDrawで日本語フォント+影付き
  3. チャンネルロゴ重ね: 透過PNGで右下に配置
  4. JPEG出力: YouTubeサムネ推奨の1280×720・2MB以内

擬似コード(参考)

# 3_thumbnail_create.py  (擬似コード)
from PIL import Image, ImageDraw, ImageFont
from pathlib import Path

TEMPLATE = Path("templates/playlist_jazz_bg.png")
FONT_PATH = "/path/to/NotoSansJP-Bold.ttf"

def create_thumbnail(track_title: str, output_path: Path) -> None:
    bg = Image.open(TEMPLATE).convert("RGB")
    draw = ImageDraw.Draw(bg)
    font_title = ImageFont.truetype(FONT_PATH, 72)
    # 影付きで日本語タイトル描画
    draw.text((40, 540), track_title, font=font_title,
              fill=(0, 0, 0), stroke_width=4, stroke_fill=(0, 0, 0))
    draw.text((40, 540), track_title, font=font_title, fill=(255, 255, 255))
    bg.save(output_path, "JPEG", quality=90, optimize=True)

背景画像自体は画像生成AI(Gemini Image無料枠+ConoHa AI Canvas等のStable Diffusion系)で別途生成します。サムネ生成深掘りはAI画像生成5社徹底比較 2026年版ConoHa AI Canvas完全レビューで整理しています。


6. 4_suno_automation.py|Playwright UI 自動操作(規約配慮の運用ルール)

ここが本記事の最もデリケートな部分です。Sunoは2026年5月時点で公式の自動化API・公式SDKを提供していないため、UI操作のサポートはPlaywrightで実装するしかありません。これは規約遵守の観点で慎重な運用が必要です。

Sunoの規約状況(🟡黄・2026年5月時点の公式確認ベース)

  • Suno公式利用規約は2026年に入って更新が続いており、本記事執筆時点では**「公式APIが提供されておらず非公式の自動化は自己責任」**とされる位置付け
  • 商用利用についてはPro/Premier等の有償プランで許諾されている範囲がある(プラン詳細はSuno公式の最新を確認)
  • AI生成楽曲のYouTube投稿は**YouTubeの『AI生成コンテンツ開示義務』(2024年〜運用)**に従う必要あり

EJの4ルール運用方針(🟢緑・本サイト運営者の運用例)

aikatsulab.com 運営者が別屋号(Moonlight Serenity / Shiloh Jazz)で4_suno_automation.pyを運用する際の方針は以下の4ルールです。

  1. 同時実行数を1に絞る: 並列リクエストでサーバー負荷を上げない、Playwrightインスタンスは常に1
  2. 半自動の補助操作に限定: 完全無人運転ではなく、人間が画面を確認しながらの補助、生成結果の人間目視チェックを必須化
  3. 規約改定があれば即時停止: Suno公式の規約改定をRSS/X等で監視、改定時はスクリプトを即時停止して手動運用に戻す
  4. Pro/Premier等の有償プラン契約下のみで運用: 無料プランでの自動化は商用利用範囲が不明確なため対象外

読者の方が同様の運用を行う場合は、Suno公式の最新規約を必ず事前確認し、規約に抵触する用途では使用しないでください

4_suno_automation.py の擬似コード(機密化レベル: 高。実コードは非公開、概念のみ開示)

# 4_suno_automation.py  (擬似コード・概念のみ開示)
# 注意: 本擬似コードは実装の参考情報であり、Sunoの利用規約に従って自己責任で運用してください
from playwright.sync_api import sync_playwright
import time

def launch_browser():
    """Playwrightを同期APIで起動、headfulモード(人間が画面確認できる)"""
    p = sync_playwright().start()
    browser = p.chromium.launch(headless=False, slow_mo=200)
    context = browser.new_context()
    page = context.new_page()
    return p, browser, page

def login_with_session_storage(page):
    """既存セッション(ログイン済Cookie)を読み込み、ログイン手動操作を最小化"""
    # ログイン状態のCookieはpre-saveしておく(認証は手動でブラウザに残しておく)
    page.goto("https://suno.com/")
    # 必要に応じてストレージ状態の読み込み・適用
    # 認証情報はgitignore対象のローカルストアから取得

def trigger_generation(page, prompt_text: str):
    """生成プロンプトを入力して生成ボタンをクリック(UI要素は変動するため定期メンテ前提)"""
    # 公式UIは予告なく変更されるため、本擬似コードでは具体的なセレクタは省略
    # 実コードではAria-Label/data-testid等の安定セレクタを優先しつつ、変動時は手動更新
    pass

def wait_and_verify(page):
    """生成完了を待ち、人間目視でクオリティチェック(半自動運用の核)"""
    # 一定時間待機後、生成済楽曲のサムネを取得して人間に通知
    # 自動でDLボタンを押すのではなく、人間が承認した曲のみダウンロードする運用
    pass

# メインフロー(半自動・人間チェック必須)
if __name__ == "__main__":
    p, browser, page = launch_browser()
    try:
        login_with_session_storage(page)
        prompt = "lo-fi jazz piano with gentle rain, midnight cafe atmosphere"
        trigger_generation(page, prompt)
        wait_and_verify(page)
        # ダウンロード操作はここで人間が手動承認
        input("生成結果を確認し、DLしたい場合はEnterを押してください...")
    finally:
        browser.close()
        p.stop()

実コードはより多くの分岐(エラーハンドリング、リトライ、ログ出力、UI変更時の警告等)を含みますが、本記事では中核となる『同時実行1』『半自動』『人間目視チェック必須』の3点が分かる擬似コードに留めます。Sunoのセレクタ・DOM構造はUI改修で変動するため、実コードを公開しても短期で陳腐化するという運用判断もあります。

Playwrightで自動化を組む際の補足

  • headlessモードは避ける: headfulで人間が画面確認できる構成が安全
  • slow_mo指定: slow_mo=200等で操作速度を落とし、人間の手作業速度に近づける
  • 同時実行は1: 並列での負荷集中を避ける
  • ログ全件保存: いつ何の操作を行ったか追跡できるようにする

Playwrightの基本的な使い方は公式ドキュメント(playwright.dev)の最新版を参照してください。


7. 5_youtube_upload.py|YouTube Data API v3 連携設計

最終工程です。動画ファイル・サムネ・メタデータ(タイトル・タグ・説明文)が揃ったら、YouTube Data API v3経由でアップロードします。

YouTube Data API v3の基本(🟡黄・Google公式ベース)

項目備考
認証方式OAuth 2.0初回手動同意→リフレッシュトークンで継続
必要スコープhttps://www.googleapis.com/auth/youtube.uploadアップロード専用
クォータ単価動画アップロード約1,600ユニット/本1日のデフォルト割当は10,000ユニット
1日アップロード目安約6本前後クォータ申請で拡張可能
メタデータ仕様タイトル100文字以内 / 説明5,000文字以内 / タグ500文字以内YouTube Studio準拠

クォータ拡張申請はGoogle Cloud Console経由で、用途・規模を申告して審査を受ける流れです。月60本ペースを目指す場合は申請が現実的な選択肢になります。

OAuth2セットアップ(初回手動・1度きり)

  1. Google Cloud Console で新規プロジェクト作成
  2. APIライブラリで「YouTube Data API v3」を有効化
  3. OAuth同意画面の設定(テストユーザーに自分のGoogleアカウントを追加)
  4. OAuthクライアントID(デスクトップアプリ種別)を作成、client_secret.jsonをダウンロード
  5. 初回スクリプト実行時にブラウザで同意画面が開く→同意後にリフレッシュトークンを取得して保存

5_youtube_upload.py の擬似コード(機密化レベル: 中。実コードは非公開、概念のみ)

# 5_youtube_upload.py  (擬似コード・実装の参考情報)
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
from google.oauth2.credentials import Credentials
from pathlib import Path
import json

SCOPES = ["https://www.googleapis.com/auth/youtube.upload"]
TOKEN_FILE = "credentials/token.json"  # リフレッシュトークン保存先(gitignore)

def get_authenticated_service():
    """保存済リフレッシュトークンから認証サービスを取得"""
    creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
    return build("youtube", "v3", credentials=creds)

def upload_video(youtube, video_path: Path, metadata: dict, thumbnail_path: Path) -> str:
    """YouTube Data API v3で動画アップロード"""
    body = {
        "snippet": {
            "title": metadata["title"],
            "description": metadata["description"],
            "tags": metadata["tags"],
            "categoryId": "10",  # Music
        },
        "status": {
            "privacyStatus": "private",     # 初期はprivate、人間レビュー後にpublic
            "selfDeclaredMadeForKids": False,
            # 2024年〜運用のAI生成コンテンツ開示フラグ
            # 詳細はYouTube公式の最新を確認
        },
    }
    media = MediaFileUpload(str(video_path), chunksize=-1, resumable=True,
                            mimetype="video/mp4")
    request = youtube.videos().insert(
        part="snippet,status",
        body=body,
        media_body=media,
    )
    response = request.execute()
    video_id = response["id"]
    # サムネ設定
    youtube.thumbnails().set(
        videoId=video_id,
        media_body=MediaFileUpload(str(thumbnail_path)),
    ).execute()
    return video_id

# メインフロー: metadata/*.json を順次アップロード
if __name__ == "__main__":
    youtube = get_authenticated_service()
    for meta_path in Path("metadata").glob("*.json"):
        meta = json.loads(meta_path.read_text(encoding="utf-8"))
        video_id = upload_video(
            youtube,
            Path(f"videos/{meta['video_file']}"),
            meta,
            Path(f"thumbnails/{meta['thumbnail_file']}"),
        )
        print(f"uploaded: {meta['title']} -> https://youtu.be/{video_id}")

実コードでは(1)失敗時のresumable再開 (2)クォータ枯渇時の待機 (3)アップロード後の終了画面・カード設定 (4)プレイリスト自動追加 (5)スケジュール公開のpublishAt指定、を実装していますが、本記事では中核ロジックに留めます。

AI生成コンテンツ開示義務(2024年〜運用)

YouTubeは2024年からAI生成コンテンツの開示を求めており、status.containsSyntheticMedia等のフラグが順次運用されています。Sunoで生成したBGMをアップロードする場合は、開示義務に従う形でメタデータを設定する必要があります。詳細はYouTube公式ヘルプの最新版を必ず確認してください

cron / systemd timerでのスケジュール実行

  • macOSならlaunchd、Linuxならsystemd timerまたはcronで定時実行
  • 推奨は1日1〜数回の起動、5分間隔等の頻回実行は不要(クォータ消費を抑える)
  • 失敗時はSlack/メール通知を組み込むと運用が安定
# crontab例: 毎日9時にアップロードバッチ実行
0 9 * * * cd /Users/foo/moonlight_serenity && /usr/bin/python3 scripts/5_youtube_upload.py >> logs/upload.log 2>&1

8. 規約・法務面の注意点|🔴赤回避ルール5項目

本セクションが本記事の法務的な核です。第19号公開直後の社内法務点検による予防修正事案を踏まえ、本記事では以下の🔴赤回避ルール5項目を厳格運用しています。

🔴赤回避ルール5項目(タクミ厳守・本記事全編に適用)

  1. 「絶対稼げる」「月◯万円確実」「100%」「最強」断定の禁止

    • 景表法5条1号(優良誤認)に抵触し得るため、収益見込みの断定表現は本記事全編で使用しない
    • 「2026年5月時点で達成済」等の事実限定表現で代替
  2. 「規約を破ってもバレない」等の規約軽視表現の禁止

    • Suno・YouTube・FFmpeg・Playwright・Google APIの各規約は遵守前提で記述
    • グレー運用を推奨する表現は一切記載しない
  3. 自社事案を確定的に「景表法違反」「ステマ規制違反」と書かない

    • 過去事案への言及は「社内法務点検による予防修正」「論点に抵触し得る表現」表現で統一
    • 第三者からの指摘や行政処分を受けたものではなく、社内点検による予防対応であることを明示
  4. Suno規約・YouTube収益化ポリシー・JASRACは「2026年5月時点」+公式最新確認を併記

    • 各規約は予告なく改定される可能性があるため、本記事の記述を最終判断の根拠にしない
    • 必ず公式の最新版でユーザー自身が確認する旨を本文・FAQで繰り返し明記
  5. 「収益化基準達成」は「Moonlight Serenityで2026年5月時点で達成済」と限定

    • 個人の一事例である旨を明示し、再現性・収益保証はないと併記
    • 「誰でも収益化できる」等の一般化表現は使用しない

Suno規約(2026年5月時点・🟡黄)

  • 商用利用範囲: Pro/Premier等の有償プランで許諾されている範囲。詳細はSuno公式の最新利用規約を確認
  • 自動化ポリシー: 公式APIは提供されておらず、非公式の自動化(Playwright等)は自己責任運用
  • AI生成楽曲のクレジット: YouTube側の開示義務と組み合わせて適切に表示

YouTube収益化ポリシー(2026年5月時点・🟡黄)

  • YouTubeパートナープログラム基準: 4,000時間視聴+1,000登録者等(基準値は変動あり、公式の最新確認必須)
  • AI生成コンテンツ開示: 2024年〜運用の開示義務に従う
  • 繰り返しコンテンツ判定: 同一背景・同一構成の量産は判定リスクあり、プレイリストごとに新背景生成のルール推奨

JASRAC等の著作権論点(🟡黄・第16号Pillar参照)

AI生成楽曲の著作権論点はAI生成物の商用利用・著作権ガイド 2026年版で網羅的に整理しています。Sunoが生成した楽曲の著作権所属・JASRAC登録の可否・他人の楽曲を模倣するプロンプトの是非、等の論点は同記事を併読してください。

ステマ規制(2023年10月施行)対応

  • 本記事のCTAリンクは「PR」表記+「広告」明示+「もしも提携案件」明示を併記
  • 未契約ツール(ConoHa AI Canvas)については「運営者は未契約」「公式情報・他社レビュー横断調査」を必ず明示

関連記事|法令コンプラの全体像


9. 月60本運用の現実|失敗パターン・再生数バラツキ・収益化までの期間

最後に、Moonlight Serenity・Shiloh Jazzで月60本ペースを設計目標として運用してきた中での現実の制約を、誇張なしで開示します。

失敗パターン(🟢緑・EJ実体験)

パターン症状対処
Suno生成のジャンル外れプロンプトが意図どおり当たらず、クレジットを消費プロンプトテンプレを5〜10種ストックして使い回し
loudnorm二段パスの実測パース失敗ffmpeg出力に別の警告が混じり正規表現が外れるより厳密なJSON抽出に書き換え
Playwrightセレクタの陳腐化SunoのUI改修でセレクタが効かなくなる月1回の動作確認+変更検知時の手動メンテ
YouTube Data APIクォータ枯渇1日6本超でアップロード失敗クォータ拡張申請+1日のアップロード本数を分散
同一背景の使い回しYouTube側で再利用判定の可能性プレイリストごとに新背景を生成するルール徹底

再生数バラツキの現実(🟢緑・主観体感)

Moonlight Serenityでは2026年5月時点で192本投稿していますが、再生数の分布は以下のような典型パターンになります。

  • 大半の曲: 数十〜数百再生レベル
  • 中位の曲: 数千再生レベル
  • 稀に当たる曲: 数万再生〜数十万再生レベル

「投稿数=収益」ではなく、当たる曲がチャンネル全体の視聴時間を牽引するのがBGMチャンネルの構造です。月60本ペースは「数を打って当たり曲を探す」という設計目標であり、月60本投稿すれば必ず収益が出るというわけではありません。

収益化基準達成までの期間(🟢緑・個人の一事例)

Moonlight Serenityは2026年5月時点で4,000時間視聴+1,000登録者等のYouTubeパートナープログラム基準を達成済で、収益化が始まっています。ただし達成までの期間は数ヶ月〜半年単位の継続投稿が必要で、これは個人の一事例であり、再現性・収益保証はありません。

具体的な達成期間・収益額は本記事では非公開とし、「2026年5月時点で達成済」という事実の範囲のみ開示します。

屋号分離の徹底(🟢緑)

aikatsulab.com 運営者(EJ)は以下のように屋号を明確に分離して運用しています。

  • aikatsulab.com(EJ名義) — AIツールアフィリエイトブログ(本サイト)
  • 久世明人名義 — Kindle出版・クラフトサイト工房(別事業)
  • Moonlight Serenity / Shiloh Jazz — YouTube BGMチャンネル(本記事の対象、別屋号)

屋号分離の運用はClaude Code単独でブログを3週間運営して19記事公開した話個人事業主のためのAI活用ロードマップで詳述しています。

まとめ|本記事を読んだ後の3ステップ

  1. 第13号で全体像を再確認: AI×YouTube BGM副業 2026年版でBGMチャンネル運用の入口を押さえる
  2. 本記事で技術深掘り: loudnorm二段パス+Playwright半自動運用+YouTube Data API v3の3点をPoCで試す
  3. 法令コンプラを再確認: AI生成物の商用利用・著作権ガイド+AIサブスク棚卸し術で長期運用の土台を整える

本記事は『自動化スクリプトの完全コピペテンプレ』ではなく『個人が別屋号で実走中の実装ログ』として書きました。読者の方の状況に合わせて部分的に取り入れていただければ幸いです。

最後のCTA(技術記事として2本配置)

ConoHa AI Canvasと楽天市場の関連書籍を提示します。ConoHa AI Canvasはaikatsulab.com 運営者は未契約で、本リンクはもしも提携案件として紹介するものです

PR

Suno自動化パイプラインのサムネ生成補助に|ConoHa AI Canvas

Suno×ffmpeg×Playwrightの自動化パイプラインの中で唯一AI画像生成側に依存するのがサムネイル生成です。aikatsulab.com 運営者のMoonlight Serenity・Shiloh Jazzでは無料枠のGemini Image系を併用していますが、Stable Diffusion系のWebUIをブラウザから日本語UIで操作する円建てサブスクとしてはConoHa AI Canvas(月額990円〜)が選択肢の一つとされます。商用利用ライセンス・日本語サポート・円建て会計の3点を重視する個人事業主向きで、ドル建てサブスクの為替変動を避けたい方の代替案です。aikatsulab.com 運営者は2026年5月時点でConoHa AI Canvasは未契約で、本記述は公式情報・他社レビューの横断調査に基づきます。本リンクはもしもアフィリエイト提携案件として紹介するものです。料金・商用利用条件は契約前に必ず公式の最新版でご確認ください。詳細は[ConoHa AI Canvas完全レビュー](/blog/conoha-ai-canvas-review-2026/)で整理しています。

ConoHa AI Canvas公式で料金プランを確認する →

※運営者は未契約・もしもアフィリエイト経由のプロモーションです

PR

ffmpeg・Python・Playwright・AI音楽制作の関連書籍を楽天市場で確認

本記事で扱ったffmpeg loudnorm二段パス・Python自動化スクリプト・Playwright半自動運用・YouTube Data API v3+OAuth2の各論は、書籍ベースで体系的に学ぶと判断基準が固まりやすい領域です。楽天市場では2026年5月時点で「ffmpeg実践」「Pythonによる動画/音声処理」「Playwright Web自動化」「Google API活用」「AI音楽制作入門」関連の書籍が複数刊行されており、楽天ポイント還元・楽天Books経由でまとめ買いできるケースもあります。本記事の擬似コード公開と組み合わせて、書籍ベースの体系学習を進めるとPoC実装がスムーズになる構成です。在庫・価格・送料は購入前に必ず公式の最新を確認してください。

楽天市場でffmpeg・Python・Playwright・AI音楽制作の書籍を探す →

※もしもアフィリエイト経由のプロモーションです


関連記事|aikatsulab.com の自動化・副業・法令ハブ導線

本記事(第21号)は第13号(AI×YouTube BGM副業)の技術深掘り続編として、Pillar2本+業務効率化ハブ+節目総括ハブと内部リンクで束ねる位置付けです。

親記事(本記事の入口)

Pillar(全記事の上位)

横断ハブ(カテゴリ統括)

AIツール比較・選び方(本記事から派生)

副業実践(本記事の周辺)


出典・参考リンク(2026年5月時点で確認)

  • 公式ドキュメント: Suno公式(suno.com)、FFmpeg公式(ffmpeg.org/ffmpeg-filters.html#loudnorm)、Playwright公式(playwright.dev/python)、YouTube Data API v3公式(developers.google.com/youtube/v3)、Google Cloud Console
  • 規格書: EBU Tech 3341 / 3342 / 3343(ラウドネスメーター・ラウドネスレンジ・トゥルーピーク規格)、EBU R128
  • 公的調査: 消費者庁(景表法・ステマ規制関連)、文化庁(著作権Q&A 2024年改訂版)
  • 第三者レビュー: Zenn・Qiita・note上の個人開発者・YouTubeチャンネル運営者の公開レビュー(2026年4〜5月公開分を横断確認)
  • 個人事業主実体験: aikatsulab.com 運営者(EJ)が別屋号で運営するMoonlight Serenity・Shiloh Jazzチャンネルの2026年5月時点の実運用ログ(🟢緑)

各出典は2026年5月25日時点で内容を確認しています。技術仕様・料金・規約は予告なく改訂される可能性が高いため、最終判断時は必ず各公式サイトで最新版をご確認ください。


著者情報

EJ(aikatsulab.com 運営) — 個人ブロガー(32歳)・個人事業主。Claude Pro($20/月、Claude Code含む)を実課金中で、本サイトをClaude Code+Astro+Cloudflare Pages構成で運営しています。屋号は明確に分離して以下5本を並行運用中です:

  1. aikatsulab.com(EJ名義) — AIツールアフィリエイトブログ(本サイト)
  2. 久世明人名義 — Kindle出版(『60代からのやさしい世界史入門』執筆中、KDPアカウントは久世明人名義)
  3. Moonlight Serenity / Shiloh Jazz(YouTubeチャンネル/別屋号) — BGMチャンネル運営(2026年5月時点でMoonlight Serenityは192本投稿・4,000時間視聴達成済、収益化基準達成済)。本記事の自動化スクリプト群はこの屋号で実走中であり、aikatsulab.com(EJ名義)とは事業を明確に分離しています
  4. クラフトサイト工房(久世明人名義) — 外構業者向けホームページ制作受託(月5,500円ストック型・横須賀+三浦半島エリア)
  5. 別事業の業務委託 — 100名規模の交替制シフト勤務組織向けアプリ開発(Next.js+Supabase、2026年5月時点でβ版相当、発注元組織情報は守秘義務に基づき非公開)

実課金・実運用しているAIツールは2026年5月時点でClaude Pro($20/月、Claude Code含む)+Suno(Moonlight Serenity屋号で別契約)のみであり、本記事に登場するConoHa AI Canvasはaikatsulab.com 運営者は未契約で、記述は公式情報・第三者レビューの横断調査に基づきます。本記事は『aikatsulab.com EJの別屋号(Moonlight Serenity/Shiloh Jazz)でのSuno×ffmpeg×Playwright自動化スクリプト実装ログの一次情報』を擬似コード+ffmpegコマンド断片レベルで開示した技術深掘り続編(第21号)です。実コードは機密扱いで非公開、本記事は実装の参考情報であり動作保証はしません。再現性・収益保証はなく、個人差は大きく効果は業務内容・既存スキル・学習投下時間に大きく依存します。

改訂履歴

  • 2026-05-25: 初版公開。第21号(Suno×ffmpeg×Playwright自動化スクリプト深掘り)。第13号(AI×YouTube BGM副業)の技術深掘り続編として、aikatsulab.com 運営者(EJ)が別屋号(Moonlight Serenity / Shiloh Jazz)で2026年5月時点に実走中の5段構成スクリプトパイプライン(1_normalize_audio.py / 2_create_video.py / 3_thumbnail_create.py / 4_suno_automation.py / 5_youtube_upload.py)を、擬似コード+ffmpegコマンド断片レベルで開示。Moonlight Serenityチャンネル192本投稿・4,000時間視聴達成済(2026年5月時点)を実数値として開示、月60本ペースは設計目標として位置づけ。loudnorm二段パス(I=-14 LUFS / TP=-1 dBTP / LRA=11)の実コマンド+擬似コード+失敗例4種を本記事の競合差別化の核として記述。Playwright自動化は規約配慮の4ルール運用(同時実行1/半自動/規約改定で即時停止/Pro/Premier契約下のみ)で限定。YouTube Data API v3+OAuth2運用設計+クォータ管理+AI生成コンテンツ開示義務を整理。🔴赤回避ルール5項目(断定表現禁止・規約軽視禁止・自社事案を確定的に違反表現で書かない・2026年5月時点+公式最新確認併記・収益化はMoonlight Serenity個別事例と限定)をH2-8で明文化。CTA4本(本文中:ConoHa AI Canvas×1+楽天市場×1、末尾:ConoHa AI Canvas×1+楽天市場×1、ConoHa AI Canvas部分は全て「運営者は未契約・もしもアフィリエイト提携案件」明示を本文・CTAタイトル・本文末尾・CTAノートの4箇所で徹底)。内部リンク10本以上(第13号親記事+第15/16/17/19/20号ハブ+第7/9/14/18号関連)。屋号分離の徹底(aikatsulab.com EJ名義 vs Moonlight Serenity/Shiloh Jazz別屋号)を著者情報・改訂履歴・免責事項で明示。実コード全文は機密扱いで非公開、本記事は実装の参考情報であり動作保証はしません。