Objetivo
Aprovechar tal cual el.vvproj del editor VOICEVOX para poder regenerar talk y canciones desde Laravel.
Estructura del nivel superior
.vvproj es JSON en UTF-8. Talk y song se guardan en el mismo archivo.
| Clave | Contenido |
|---|---|
appVersion | Versión del editor al guardar |
talk | Datos de talk (audioKeys + audioItems) |
song | Datos de canción (tempo, compás, pistas) |
Sección talk
talk.audioKeys es un array ordenado y talk.audioItems es un Record indexado por ID.
TalkAudioItem
| Clave | Contenido |
|---|---|
text | Texto de entrada |
voice.engineId | ID del motor (corresponde a /engine_manifest) |
voice.speakerId | UUID del speaker |
voice.styleId | ID de estilo. Se pasa tal cual a /synthesis?speaker={styleId} |
query | Equivalente a AudioQuery |
presetKey | ID de preset del editor. Para los presets del lado Laravel, consulta Presets |
.vvproj ya tiene query guardada, puedes saltarte /audio_query y sintetizar directamente.
accentPhrases
| Clave | Contenido |
|---|---|
moras | Array de moras (a veces se omiten los relativos a consonant) |
accent | Posición del acento (empieza en 1) |
pauseMora | Puede aparecer para introducir silencios en puntuación, etc. |
isInterrogative | Marca de frase interrogativa |
Sección song
| Clave | Contenido |
|---|---|
tpqn | Ticks Per Quarter Note. El estándar es 480 |
tempos | Mapa de tempo (position en ticks) |
timeSignatures | Mapa de compás (measureNumber empieza en 1) |
tracks | Record indexado por Track ID |
trackOrder | Orden de visualización y reproducción. Debe coincidir con el conjunto de claves de tracks |
Track
| Clave | Contenido |
|---|---|
singer.styleId | ID final que se pasa a /frame_synthesis?speaker={styleId} |
notes | Array de notas |
keyRangeAdjustment | Ajuste de tono por semitonos |
volumeRangeAdjustment | Ajuste de volumen |
pitchEditData / volumeEditData | Datos de edición por frame |
phonemeTimingEditData | Edición de timing de fonemas por Note ID |
solo / mute | Se usan para decidir qué pistas se reproducen |
Note
| Clave | Contenido |
|---|---|
id | ID de nota (único) |
position | Tick de inicio de la nota |
duration | Longitud de la nota en ticks |
noteNumber | Número de nota MIDI |
lyric | Letra |
Conversión tick / segundo / frame
Con un tempo único, se convierte así:tempos en orden ascendente de position.
Note::len(), consulta Detalle de Score y Note.
Flujo de generación de audio de canción
Precauciones al editar directamente
- El conjunto de claves de
tracksytrackOrderdeben coincidir siempre - Sincroniza también
talk.audioKeyscontalk.audioItems - Mantén
position >= 0,duration >= 1ynoteNumberen0..127 tempos[0].positionsuele ser0ytimeSignatures[0].measureNumbersuele ser1- Si es posible, conserva las claves desconocidas al volver a guardar, para no romper la compatibilidad con versiones futuras
Ejemplo de código Laravel
Ejemplo mínimo que lee un.vvproj y genera talk y canción.