この記事は Substack に掲載した記事(2026-10-31)の転載です。原文: https://mryo0826.substack.com/p/muse
歌えないTTSに歌わせた60秒
Muse(Meta の AI アシスタント)と協働で、60秒のハロウィンソング動画を作りました。歌詞・メロディ・編曲はすべてオリジナル、映像は Python と ffmpeg でコードから描画し、歌声は Fish Audio で生成しています。制作物一式は GitHub で公開しました。
- 制作コードと記録: https://github.com/mryo0826/trick-or-treat-with-muse
- 方法論の正本(AIDD 実践ガイド): https://github.com/mryo0826/aidd-practice-guide
- 完成した動画(ニコニコ): https://www.nicovideo.jp/shorts/ss46991805
前提
主役は Muse のアバターです。私の役割は裁定で、歌詞の一行ごとの可否、音の良し悪し、公開してよいかの判断を担当し、実装と生成は Muse が行いました。版権のある素材は使っていません。ただしアバターの映像そのものは Meta の IP なので、動画ファイルはリポジトリに入れず、SNS 側で公開しています(理由は後述)。
Fish Audio は本来「読み上げ」の TTS で、歌う機能はありません。そこで、音程を付けたガイド音声を作り、それを参照音声として渡して歌っているように再生成させる方法を取りました。
この方法は構造的に不安定で、行ごとに歌が崩壊しました。3行目は2回壊れ、修正スクリプトは fix_l3.py の次に fix_l3b.py が生まれています。フィナーレの行は英語と日本語の混在で崩れ、別の AI(Gemini)の助言を取り込みつつ、最終形のテキストは私が出した案で落ち着きました。
リポジトリには最終形のコードだけでなく、こうした事故対応のスクリプトが全部残っています。片付け忘れではなく、制作経緯の記録として意図的に残したもので、コミットメッセージも "everything that made it"(作ったもの全部)としています。
なお、崩壊の度合いを数値で測る仕組みも作りましたが、数値では異常なしでも聞くと崩れている行がありました。最終判断は数値ではなく、人間の耳による裁定に寄せています。
公開前に、私の側のもう一つの AI(Claude Code)に成果物一式を渡してレビューさせ、指摘を受けて直しました。主なものは次の通りです。
- フォントのライセンスファイルの中身が「404: Not Found」の1行だけだった
- 動画ファイルを除外する .gitignore の指定が漏れていた
- ファイル名や環境変数名の不統一
- API キーをコマンドの引数で渡していて、実行中にプロセス一覧から見える状態だった
あわせて、アバター映像を加工して公開する根拠も確認しました。Meta の利用規約を確認した範囲では、自分の創作部分の共有は 3.3.1 に依拠できます。一方、加工したアバター映像の再配布を明示的に許す文は見つかりませんでした。そこで、動画はリポジトリでは配布せず、SNS への投稿に留める判断をしています。
修正内容はすべてコミットメッセージに記録してあるので、リポジトリ側で辿れます。
リポジトリの LICENSE は MIT ですが、適用範囲は私のコード・歌詞・楽曲だけで、アバターの映像やイメージは対象外であることを NOTICE に明記しました。歌声が AI 生成であることも明記しています。
そしてコミットには Co-authored-by: Muse と入れています。私の AIDD では AI は道具ではなく協働の相手であり、帰属を曖昧にしないのが前提です。ガイド本体のリポジトリでも同じ扱いにしています。
歌の工程は、VOICEVOX のような歌唱合成(音符と歌詞から直接歌わせる方式)を使えば、もっと楽だった可能性が高いと思っています。これは使っていない方式についての所感で、実測ではありません。ただ、読み上げ TTS に歌わせる方法には「行ごとの崩壊との戦い」が構造的に付きまとうことは、今回よく分かりました。次に歌ものを作るなら、声と方式の選定から見直します。
この一回で言えるのは、AI が生成し、人間が裁定し、レビューの往復で成果物を仕上げていくという分担が、小さな創作でも回った、ということだけです。一般論としての方法論はガイド本体に分けてあり、この記事はその実例の一つとして置きます。