목적
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를 읽어 들여 토크와 송을 생성하는 최소 예입니다.