はじめに
生成AIの検証では、完成物だけを保存しても、後から条件を比較できないことがある。AI音楽生成も同様で、歌詞が同じでも出力尺や構成が変わる可能性があるため、入力値と実測値を一緒に残す必要がある。
今回はオリジナルの日本語歌詞1件を使い、同じタスクから返された2曲を記録した。この記事の主題は特定サービスの評価ではなく、歌詞から曲を生成する実験で何をログとして残すべきかを、実データから整理することである。
検証対象と前提
実験には、歌詞を入力して曲に変換する lyrics into song 画面を使用した。
検証日は2026年8月26日。生成ボタンを押す前に入力画面を保存し、押した時刻、結果が表示された時刻、クレジット残高、2曲の表示時間を記録した。
今回は音源ファイルの波形解析やブラインド評価は行っていない。したがって、音質や発音の良し悪しではなく、画面と計測から確認できる値だけを対象にする。
最小限残しておきたい実験ログ
今回の入力を、後から比較しやすい形にすると次のようになる。
{
"experiment_date": "2026-08-26",
"task_id": "f80d8ec141f6bc952888a24fc665622e",
"mode": "Lyric to Music",
"model": "V4.5+",
"title": "朝焼けの輪郭",
"lyrics": {
"language": "ja",
"characters": 403,
"lines": 41,
"section_tags": [
"Verse 1",
"Pre-Chorus",
"Chorus",
"Verse 2",
"Pre-Chorus",
"Chorus",
"Bridge",
"Final Chorus"
]
},
"style": {
"prompt": "Japanese city pop, female vocal, warm analog synths, clean electric guitar, melodic bass, steady 104 BPM, bittersweet but hopeful, clear Japanese pronunciation, memorable chorus",
"instrumental": false,
"vocal_gender_preference": "Female",
"style_influence_percent": 65,
"excluded": [
"heavy metal",
"trap",
"aggressive vocals",
"fast rap"
]
},
"measurement": {
"generation_seconds": 174,
"credits_before": 21898,
"credits_after": 21886,
"outputs": [
{ "version": "A", "duration_seconds": 223 },
{ "version": "B", "duration_seconds": 265 }
]
}
}
Vocal Gender は画面上でも希望値であり、結果を保証する設定ではない。そのため、ログ上も vocal_gender ではなく vocal_gender_preference とした。設定値と保証された結果を同じフィールドとして扱わないためである。
入力した日本語歌詞
セクション名は独立した行に置き、サビには共通する2行を残した。入力は次のとおり。
[Verse 1]
まだ眠る街のすみで
自動販売機の灯りが揺れる
ポケットの中の小さなメモ
昨日の夢をそっと開いた
[Pre-Chorus]
遠回りした時間さえ
今のわたしを作ってる
[Chorus]
朝焼けの輪郭をなぞって
新しい今日へ歩き出そう
うまく言えない願いも全部
この歌にして空へ放つよ
[Verse 2]
駅へ向かう足音の中
昨日と違うリズムを探す
閉じたままだった心の窓に
やわらかな風が入り込んだ
[Pre-Chorus]
迷った夜の静けさも
次の一歩を照らしてる
[Chorus]
朝焼けの輪郭をなぞって
新しい今日へ歩き出そう
ほどけかけてた希望を結び
この歌にして空へ放つよ
[Bridge]
もしも未来が見えなくても
今ここにある声を信じたい
[Final Chorus]
朝焼けの輪郭をなぞって
新しい今日へ歩き出そう
小さな光を胸に集めて
この歌にして空へ放つよ
日本語は空白で単語を区切らないため、長文を1行にまとめず、1行をおおむね10〜18文字に収めた。これは歌唱結果を保証する方法ではないが、少なくとも人間が入力と出力を照合するときの単位を揃えやすくなる。
実測結果
1回の生成タスクから2曲が返された。
| 項目 | 実測値 |
|---|---|
| 生成完了まで | 174秒 |
| 消費クレジット | 12 |
| Version A | 223秒(3:43) |
| Version B | 265秒(4:25) |
| 尺の差 | 42秒 |
比率は次の式で計算できる。
const versionA = 3 * 60 + 43; // 223秒
const versionB = 4 * 60 + 25; // 265秒
const difference = versionB - versionA;
const increaseRate = (difference / versionA) * 100;
console.log({ difference, increaseRate: increaseRate.toFixed(1) });
// { difference: 42, increaseRate: '18.8' }
Version B は Version A より42秒、約18.8%長かった。歌詞、モデル、スタイル設定は同じなので、今回の1サンプルから少なくとも次のことが分かる。
入力条件を固定しても、同じ生成タスク内の複数候補で出力尺は一致しない場合がある。
一方で、42秒の差がどのセクションの反復や間奏によって生じたかは、画面上の時間だけでは特定できない。そこまで判断するには、音源のタイムラインを区間ごとにアノテーションする必要がある。
再現性を高めるための記録項目
同様の検証を継続するなら、次の4種類に分けて記録すると扱いやすい。
1. 入力そのもの
- 歌詞全文
- 文字数と行数
- セクションタグの順序
- スタイル指示と除外指示
歌詞のハッシュも残しておけば、空白や改行を含めて本当に同じ入力か確認できる。
import { createHash } from "node:crypto";
const lyricsHash = createHash("sha256")
.update(lyrics, "utf8")
.digest("hex");
2. モデルとパラメータ
- モデル名・バージョン
- モード
- Instrumental のON/OFF
- ボーカル希望値
- Style Influence
モデルが更新されるサービスでは、同じ画面名でも内部の挙動が変わる可能性がある。少なくとも画面に表示されたモデル名と実施日はセットで残したい。
3. コストと待ち時間
- 開始時刻と完了時刻
- 実測した生成秒数
- 実行前後のクレジット
- エラーや再試行の有無
ボタンに表示された消費量だけでなく、実行前後の残高差を残すと二重に確認できる。今回は 21,898 - 21,886 = 12 で一致した。
4. 出力ごとの情報
- 出力数
- 各バージョンの長さ
- ファイル形式
- サンプルレート、チャンネル数、ラウドネスなどの客観指標
- Verse、Chorus、Bridge の開始時刻
今回は最初の2項目まで記録した。後半の指標は音源ファイルを取得して解析できた場合に追加する。
次回の比較実験
次に行うなら、歌詞とモデルを固定し、Style Influence だけを変える。
| 条件 | Style Influence | それ以外 |
|---|---|---|
| Low | 30% | 固定 |
| Middle | 65% | 固定 |
| High | 90% | 固定 |
各条件を1回だけ比較すると生成時の偶然と設定差を分離できないため、可能なら各条件を複数回実行する。出力尺、セクションの反復回数、サビ開始時刻を集計すれば、Style Influence と構成の変化に関係があるかを見やすくなる。
まとめ
日本語歌詞1件、同一モデル、同一パラメータで生成したところ、同じタスクから3分43秒と4分25秒の2曲が返された。出力尺の差は42秒だった。
生成AIの検証では、結果だけでなく、入力全文、モデル、パラメータ、コスト、所要時間、各出力のメタデータを一緒に保存することが重要である。今回は小さな1サンプルだが、JSON形式で実験ログを残すことで、次に変更する変数と、まだ計測できていない項目を明確にできた。
検証手順の整理と草稿作成には生成AIを使用した。掲載したパラメータ、数値、画面は実際の生成結果と照合済みである。

