歌入りAI曲の再現レシピ

更新: 2026-10-28
ACE-StepAI作曲seedguidance再現性video-gen

ACE-Stepで歌入りの曲を作り、当たりの曲を、あとで同じ条件から作り直すための参照ページ。video-genの /api/gen-bgm で確かめた値を書く。経緯は開発日記のAI作曲の当たりは、seedとguidanceの組み合わせにあったにある。ここでは、条件、探し方、再現の確かめ方、BPMの測り方、EQだけを書く。

条件の表

条件範囲・既定効くところ
promptタグの列。英語が無難曲調。電子声寄りの例は下
lyrics最大4000文字。[verse] [chorus] で区切る。省略か [inst] は伴奏のみ歌
seed0〜2147483647の整数曲そのもの。変えると別物になる
guidance1〜30の数値。省略は15プロンプトと歌詞への従わせ方。下げれば良くなるとは限らない
steps10〜200の整数。省略は60生成の反復回数。このレシピは60のまま
eqe1 か none。省略は none生成のあとの仕上げ

範囲外は、生成を始める前に400で返す。電子声寄りのタグの例は次のとおり。

EDM, electro house, 128 bpm, female vocal, vocoder, synthetic voice, auto-tune, bright synth lead, driving bassline, energetic, club, japanese

歌詞は、コマンドラインに直接渡さず、UTF-8のファイルで渡す(--lyrics-file)。Windowsのコマンドラインの文字コードで日本語が壊れるのを避けるため。

gen_bgm_ace.py 30 out.wav "EDM, 128 bpm, female vocal" --seed 1 --guidance 5 --eq e1 --lyrics-file lyrics.txt

当たりの探し方

条件プロンプト歌詞seedguidancestepsACE-Step1つずつ直列20分で打ち切り仕上げのEQe1(任意)300Hz -2.5dB3kHz +3dB解析長さ・ピーク簡易BPM(RESULT行)ライブラリ曲のwav+ 説明JSON説明JSONの条件から、同じ曲を作り直せる(同じ条件なら同じwav)
条件を説明JSONに残せば、曲のファイルを消しても作り直せる。EQを掛ける前の曲は残さない。
  1. 同じ歌詞・同じタグ・同じ長さで、seedを2つ以上、guidanceを3点ほど振って、数本作る
  2. 聴いて選ぶ。 BPMや周波数帯域の数値では選ばない
  3. 本番の長さで、選び直す
  4. 当たった条件を、説明JSONに残す

2の根拠は、手元の30秒の6曲にある。seed 1は、guidance 3・5・8の簡易BPMが129.1・128.2・128.3とほぼ同じなのに、耳では5だけが当たりで、3と8は低音が不協和だった。seed 2は、guidance 5・8・15で劣化・「ホワンホワン」・普通で、曲そのものが別物になった。周波数帯域の数値も、声の変化でぶれる(40か所の抜き取りでは、2〜5kHzが3dBずれた)。

3の根拠は、seed 1・guidance 5の30秒版と60秒版の先頭29.91秒を比べた値。同じ値のサンプルは0.12%、相関係数は0.014で、別の曲になっている。

再現を確かめる

同じ条件で2回作り、できたwavのSHA-256を比べる。

shasum -a 256 a.wav b.wav

seed 1・guidance 5・steps 60で、Win機で2回作った曲は、先頭16桁が 646f54fbf99e5a41 で一致した。仕上げのEQを掛けたあとも決定的で、同じ入力に e1 を掛けると、Win機で掛けた曲とAirで掛けた曲が一致した(先頭16桁 b23e3449ed73ffd5)。

条件を説明JSONに残せば、EQを掛ける前の曲のファイルは要らない。

BPMは指定どおりに出ない

プロンプトの 128 bpm に対して、手元の15曲の簡易BPMは次のとおり。

  • 30秒・伴奏のみ: 119.6
  • 30秒・歌入り(電子声寄り・自然な声): 128.0・122.8
  • 30秒・seed 1(guidance 3・5・8): 129.1・128.2・128.3
  • 30秒・seed 2(guidance 5・8・15): 104.5・139.4・96.9
  • 60秒・guidance 5(seed 1〜6): 129.0・130.1・99.5・136.6・96.8・99.9

だから、生成してから測って、実測の拍でカットの長さを決める。測る道具は audio_analyze.py(標準ライブラリだけ)。

python audio_analyze.py out.wav

JSONが1行で返る(duration_sec peak bpm_measured bpm_confidence など)。測り方は、150Hz以下の低音の強さの変化から、強さが立ち上がる点の自己相関を取り、拍の1〜4倍の間隔の相関を足し合わせて、80〜180に畳む。librosaの beat_track は、Win機の自動実行の環境で、CPUを使い続けて終わらなかったので使っていない。

bpm_confidence は相関の強さで、15曲では0.019〜0.219だった。0.1未満は6曲で、そのBPMの値には頼らない。簡易推定は、聴いての確認の代わりにならない。

仕上げのEQ e1

+4+20-2-4100Hz1kHz10kHzdB300Hz -2.5dB3kHz +3.0dB
e1は、300Hzのこもりを約2.5dB引き、3kHzの声の抜けを約3.0dB足す。設定値は-2.5と+3.0だが、2段が重なるので計算値はわずかにずれる。

300Hzを-2.5dB(Q 1.0)、3kHzを+3dB(Q 0.8)のピーキングEQを2段。標準ライブラリだけで書いたバイクアッドで、30秒のステレオをAirで1.9秒で処理する(Win機の実測は約4秒)。

  • 掛けたあとのピークが0.98を超えたら、その分だけ全体の音量を下げる(音割れ防止。音量をそろえる処理ではない)。seed 1・guidance 5の曲は、ピークが0.87から0.97になり、下げる量は0dBだった
  • 何も掛けない版と、e1 に6kHz以上の+4dBを足した版より、e1 が一番よいと聴いて判断した(2026-10-27)
  • 掛からなかったときは、曲はEQなしで保存し、理由を note に残す

直列と打ち切り

ACE-StepはGPUメモリを約7.5GB使うので、同時に動かさず、1つずつ直列にする。20分で打ち切る。失敗したら、数式合成(synth)に切り替えて、失敗の理由(末尾の300文字)を note に残す。

確かめていないこと

  • 別のGPU、別のバージョンのACE-Stepで、同じ条件が一致するか。 Win機の同じ環境でしか確かめていない
  • 60秒の6曲の聴き比べ。 簡易BPMまでで、聴いての選別はまだ
  • 4分の長さでの当たり条件。 長さを変えると別の曲になるので、本番の長さで選び直す
  • 簡易BPM推定の精度。 合成のクリック音と、実際の曲でしか確かめていない

関連

WIKI一覧へ