目的
VOICEVOXエディターの.vvproj をそのまま活用して、Laravel でトーク・ソングを再生成できるようにします。
トップレベル構造
.vvproj は UTF-8 JSON です。トークとソングを同じファイルに保存します。
| キー | 内容 |
|---|---|
appVersion | 保存時のエディターバージョン |
talk | トーク用データ (audioKeys + audioItems) |
song | ソング用データ (テンポ・拍子・トラック群) |
talk セクション
talk.audioKeys は順序配列、talk.audioItems は ID をキーにした Record です。
TalkAudioItem
| キー | 内容 |
|---|---|
text | 入力テキスト |
voice.engineId | エンジン ID (/engine_manifest と対応) |
voice.speakerId | 話者 UUID |
voice.styleId | スタイル ID。/synthesis?speaker={styleId} にそのまま渡す |
query | AudioQuery 相当 |
presetKey | エディターのプリセット ID。Laravel 側プリセットは プリセット を参照 |
.vvproj に query が保存済みなら、/audio_query を再実行せずにそのまま合成へ進めます。
accentPhrases
| キー | 内容 |
|---|---|
moras | モーラ配列 (consonant 系は省略される場合あり) |
accent | アクセント位置 (1始まり) |
pauseMora | 句読点などで無音を入れるときに付くことがある |
isInterrogative | 疑問文フラグ |
song セクション
| キー | 内容 |
|---|---|
tpqn | Ticks Per Quarter Note。標準は 480 |
tempos | テンポマップ (position は tick) |
timeSignatures | 拍子マップ (measureNumber は 1 始まり) |
tracks | Track ID をキーにした Record |
trackOrder | 表示・再生順。tracks のキー集合と一致させる |
Track
| キー | 内容 |
|---|---|
singer.styleId | 最終的に /frame_synthesis?speaker={styleId} へ渡す ID |
notes | ノート配列 |
keyRangeAdjustment | 半音単位のキー調整 |
volumeRangeAdjustment | 音量調整 |
pitchEditData / volumeEditData | フレーム単位の編集データ |
phonemeTimingEditData | Note ID ごとの音素タイミング編集 |
solo / mute | 再生対象トラック判定に使う |
Note
| キー | 内容 |
|---|---|
id | ノート ID (一意) |
position | ノート開始 tick |
duration | ノート長 tick |
noteNumber | MIDI ノート番号 |
lyric | 歌詞 |
tick・秒・フレーム変換
単一テンポでは次で変換します。tempos を position 昇順で区間積算します。
Note::len() ヘルパーで tick からフレーム長へ変換する実装は Score と Note 詳細 を参照してください。
ソング音声生成の流れ
直接編集時の注意点
tracksのキー集合とtrackOrderを必ず一致させるtalk.audioKeysとtalk.audioItemsも同様に同期するposition >= 0、duration >= 1、noteNumberは0..127を維持するtempos[0].positionは通常0、timeSignatures[0].measureNumberは通常1- 未知キーは可能なら保持して再保存し、将来バージョンとの互換性を壊さない
Laravel コード例
.vvproj を読み込み、トークとソングを生成する最小例です。