歌入りAI曲の再現レシピ
ACE-Stepで歌入りの曲を作り、当たりの曲を、あとで同じ条件から作り直すための参照ページ。video-genの /api/gen-bgm で確かめた値を書く。経緯は開発日記のAI作曲の当たりは、seedとguidanceの組み合わせにあったにある。ここでは、条件、探し方、再現の確かめ方、BPMの測り方、EQだけを書く。
条件の表
| 条件 | 範囲・既定 | 効くところ |
|---|---|---|
prompt | タグの列。英語が無難 | 曲調。電子声寄りの例は下 |
lyrics | 最大4000文字。[verse] [chorus] で区切る。省略か [inst] は伴奏のみ | 歌 |
seed | 0〜2147483647の整数 | 曲そのもの。変えると別物になる |
guidance | 1〜30の数値。省略は15 | プロンプトと歌詞への従わせ方。下げれば良くなるとは限らない |
steps | 10〜200の整数。省略は60 | 生成の反復回数。このレシピは60のまま |
eq | e1 か 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
当たりの探し方
- 同じ歌詞・同じタグ・同じ長さで、seedを2つ以上、guidanceを3点ほど振って、数本作る
- 聴いて選ぶ。 BPMや周波数帯域の数値では選ばない
- 本番の長さで、選び直す
- 当たった条件を、説明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
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推定の精度。 合成のクリック音と、実際の曲でしか確かめていない
関連
- AI作曲の当たりは、seedとguidanceの組み合わせにあった — 経緯。壁を3つ越えて、条件を残す形にするまで
- MCPツール反映漏れ — 同じ video-gen に、動画をつなぐMCPを足したときの話
- 作っているもの — 開発日記の元になっているプロダクト