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

公開: 2026-10-28
開発日記ACE-StepAI作曲video-gen再現性

ミュージックビデオ用に、日本語の歌入り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を使い続けて終わりませんでした。そこで、標準ライブラリだけの簡易推定に置き換えました。

同時に「確からしさ」(相関の強さ)も返します。簡易推定なので、聴いての確認の代わりにはなりません。

壁2: 日本語の歌詞を渡す

歌詞を渡す口(lyrics)を足しました。歌詞はコマンドラインに直接渡さず、UTF-8の一時ファイルで渡します(--lyrics-file)。Windowsのコマンドラインの文字コードで、日本語が壊れるのを避けるためです。歌詞は [verse] [chorus] の区切りで書き、省略すると伴奏だけになります。

タグを2種類で試しました。

聴くと、自然な声のほうは、こもりとゴワゴワが強く、採用しませんでした。以降は電子声寄りのタグで進めます。

壁3: 当たり外れを探す

同じ歌詞・同じタグ・30秒・steps 60で、seed(乱数の種)と guidance(プロンプトと歌詞にどれだけ従わせるか)を振って、6本作りました。

30秒・同じ歌詞・同じタグ・steps 60。評価は耳、BPMは簡易推定seed 1seed 2guidance 3低音が不協和簡易BPM 129.1guidance 5当たり簡易BPM 128.2guidance 8低音が不協和簡易BPM 128.3guidance 5劣化簡易BPM 104.5guidance 8「ホワンホワン」簡易BPM 139.4guidance 15普通簡易BPM 96.9
同じseed 1でも、guidanceが3と8では低音が不協和で、当たりは5だけ。seed 1の3条件はBPMがほぼ同じなのに、耳の評価は分かれた。seed 2は曲そのものが別物になった。

同じ種から育てた3つの盆栽。左は水が足りずにしおれ、真ん中はちょうどよく伸びて小さな蕾をつけ、右は水が多すぎて葉が垂れている

分かったことは3つです。

同じ条件なら、同じ曲

当たった条件(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 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の散らばりは、次のとおりです。

90100110120130140簡易推定のBPMプロンプトの指定 12830秒 伴奏のみ30秒 歌入りタグ2種(電子声寄り・自然な声)30秒 seed 1guidance 3・5・830秒 seed 2guidance 5・8・1560秒 guidance 5seed 1〜6確からしさ0.1以上0.1未満
指定は128でも、実測は96.8から139.4まで散らばった。seed 1の30秒は128付近にそろったが、seedを変えると外れる。白抜きは確からしさ0.1未満で、参考程度に読む。

プロンプトの指定は128ですが、実測は96.8〜139.4に散らばりました。30秒で当たったseed 1は、60秒でも129.0と近い値でした。seed 2も130.1と近いのですが、確からしさが0.019と低く、信用できません。この6曲を聴いての選別は、まだです。

わかったこと

  1. seedとguidanceは、組み合わせで当たる。 片方ずつ最適化できないので、数本作って耳で選ぶ
  2. 条件を残せば、曲は再現する。 プロンプト・歌詞・seed・guidance・stepsを説明JSONに保存する
  3. BPMの指定は目安。 生成してから測り、確からしさの低い測定は参考程度に読む
  4. 数値では、当たり外れは決まらない。 BPMが同じ3本で、耳の評価は分かれた
  5. 長さを変えたら、選び直す。 30秒と60秒の曲は、別物になる

条件の表、再現の確かめ方、EQの定義は、WIKIの歌入りAI曲の再現レシピにまとめました。

関連する記事です。