AI作曲の当たりは、seedとguidanceの組み合わせにあった 歌入りの曲を再現できる形にする

ミュージックビデオ用に、日本語の歌入りEDMをAIで作っています。曲は音楽生成モデルのACE-Step(Apache 2.0)で、Windows機のGPUに置いた自作アプリ video-gen から呼びます。
30秒の曲を、seed と guidance を変えて作り、聴き比べました。当たりは seed 1・guidance 5 の1点だけでした。そして、同じ条件で作り直すと、できたwavのSHA-256が一致しました。当たりは運ではなく、条件を書き残せば再現できるものでした。
何を作っているか
video-gen は、動画と音楽をWindows機のGPUで作る自作アプリです。ここに曲を作る口(/api/gen-bgm)があり、ACE-Stepを専用のvenvから呼びます。最初は伴奏だけでした。
30秒を指定すると、できる曲は29.91秒です(60秒を指定すると59.91秒)。ぴったりにはなりません。ミュージックビデオでは、曲に合わせて映像のカットの長さを決めたいので、生成したあとで、実際の長さと拍の速さ(BPM)を測ることにしました。
壁1: BPMが指定どおりに出ない
プロンプトに 128 bpm と書いても、伴奏だけの30秒は、測ると119.6でした。
測る道具は、最初 librosa の beat_track を使いました。ところが、Win機の自動実行の環境で動かすと、CPUを使い続けて終わりませんでした。そこで、標準ライブラリだけの簡易推定に置き換えました。
- 150Hz以下の低音(キックの帯域)の強さの変化だけを取り出す
- 強さが立ち上がる点(オンセット)の自己相関を取る
- 拍の1〜4倍の間隔の相関を足し合わせて、いちばん強い間隔をBPMにする
- 80〜180の範囲に畳む(2倍と半分の取り違えを減らす)
同時に「確からしさ」(相関の強さ)も返します。簡易推定なので、聴いての確認の代わりにはなりません。
壁2: 日本語の歌詞を渡す
歌詞を渡す口(lyrics)を足しました。歌詞はコマンドラインに直接渡さず、UTF-8の一時ファイルで渡します(--lyrics-file)。Windowsのコマンドラインの文字コードで、日本語が壊れるのを避けるためです。歌詞は [verse] [chorus] の区切りで書き、省略すると伴奏だけになります。
タグを2種類で試しました。
- 電子声寄り:
EDM, electro house, 128 bpm, female vocal, vocoder, synthetic voice, auto-tune, bright synth lead, driving bassline, energetic, club, japanese(簡易BPM 128.0) - 自然な声:
clear natural voiceを使ったタグ(同 122.8)
聴くと、自然な声のほうは、こもりとゴワゴワが強く、採用しませんでした。以降は電子声寄りのタグで進めます。
壁3: 当たり外れを探す
同じ歌詞・同じタグ・30秒・steps 60で、seed(乱数の種)と guidance(プロンプトと歌詞にどれだけ従わせるか)を振って、6本作りました。

分かったことは3つです。
- seed 1 は、guidance 3・5・8 で、簡易BPMがほぼ同じです(129.1・128.2・128.3)。ところが耳では、3と8は低音が不協和で、5だけが当たりでした。
- seed 2 は、曲そのものが別物になりました。 guidance 5は劣化、8は「ホワンホワン」、15は普通。seed 1では当たりだった5が、seed 2では劣化です。guidanceを下げれば良くなる、という話ではありません。
- つまり、BPMの数値では、当たり外れは分かりません。 聴いて選ぶしかありません。
同じ条件なら、同じ曲
当たった条件(seed 1・guidance 5)を、Win機でもう一度作り直し、できたwavのSHA-256を比べました。
shasum -a 256 trial3_g5_s1_30s.wav trial4_repro_g5_s1_30s.wav
どちらも先頭16桁が 646f54fbf99e5a41 で、一致しました(Airに持ち帰ったコピーで、今回も確かめました)。簡易BPMも、ピークも同じです。
ここから、2つのことを決めました。
- 曲のファイルだけでなく、条件(プロンプト・歌詞・seed・guidance・steps)と、実測のBPM・長さ・ピークを説明JSONにして、曲の隣に保存する。条件があれば作り直せます。
- 仕上げのEQを掛ける前の曲は、残さない。条件から作り直せるからです。
一方で、長さを変えると別の曲になります。 seed 1・guidance 5の、30秒版と60秒版の先頭29.91秒を比べると、同じ値のサンプルは0.12%、相関係数は0.014でした。30秒で選んだ当たりを、そのまま60秒に持ち込むことはできません。
仕上げのEQ
当たりの曲を聴くと、300Hz付近がこもって聞こえました。そこで、仕上げのEQ(e1)を足しました。300Hzを-2.5dB、3kHzを+3dBです。何も掛けない版と、e1 に6kHz以上の+4dBを足した版を並べて聴き、e1 が一番よいと判断しました。
EQは、標準ライブラリだけの2次フィルタ(バイクアッド)で、30秒のステレオをAirで1.9秒で処理します。掛けたあとのピークが0.98を超えたら、その分だけ全体の音量を下げます(音割れ防止)。seed 1・guidance 5の曲は、ピークが0.87から0.97になり、下げる量は0dBでした。
Win機で掛けた曲と、Airで掛けた曲は、SHA-256が一致しました(先頭16桁 b23e3449ed73ffd5)。EQも、同じ入力なら同じ結果になります。
本番の長さで振り直す
本番は30秒ではないので、guidance 5のまま、seed 1〜6で60秒の曲を作りました。簡易BPMの散らばりは、次のとおりです。
プロンプトの指定は128ですが、実測は96.8〜139.4に散らばりました。30秒で当たったseed 1は、60秒でも129.0と近い値でした。seed 2も130.1と近いのですが、確からしさが0.019と低く、信用できません。この6曲を聴いての選別は、まだです。
わかったこと
- seedとguidanceは、組み合わせで当たる。 片方ずつ最適化できないので、数本作って耳で選ぶ
- 条件を残せば、曲は再現する。 プロンプト・歌詞・seed・guidance・stepsを説明JSONに保存する
- BPMの指定は目安。 生成してから測り、確からしさの低い測定は参考程度に読む
- 数値では、当たり外れは決まらない。 BPMが同じ3本で、耳の評価は分かれた
- 長さを変えたら、選び直す。 30秒と60秒の曲は、別物になる
条件の表、再現の確かめ方、EQの定義は、WIKIの歌入りAI曲の再現レシピにまとめました。
関連する記事です。
- 歌入りAI曲の再現レシピ — 条件の表、SHA-256での再現の確かめ方、簡易BPMの読み方、EQ e1の定義
- 「連結しました」は嘘だった — 同じ video-gen に、動画をつなぐMCPを足したときの話
- 作っているもの — 開発日記の元になっているプロダクト