Obiettivo
Sfruttare direttamente i file.vvproj dell’editor VOICEVOX per rigenerare talk e song in Laravel.
Struttura di primo livello
.vvproj è JSON in UTF-8. Talk e song sono salvati nello stesso file.
| Chiave | Contenuto |
|---|---|
appVersion | Versione dell’editor al momento del salvataggio |
talk | Dati per il talk (audioKeys + audioItems) |
song | Dati per il song (tempo, tempo in chiave, tracce) |
Sezione talk
talk.audioKeys è un array ordinato, talk.audioItems è un Record con l’ID come chiave.
TalkAudioItem
| Chiave | Contenuto |
|---|---|
text | Testo di input |
voice.engineId | ID engine (corrisponde a /engine_manifest) |
voice.speakerId | UUID del parlante |
voice.styleId | ID stile. Da passare così com’è a /synthesis?speaker={styleId} |
query | Equivalente ad AudioQuery |
presetKey | ID preset dell’editor. Per i preset lato Laravel consulta Preset |
.vvproj contiene già query, puoi passare direttamente alla sintesi senza rieseguire /audio_query.
accentPhrases
| Chiave | Contenuto |
|---|---|
moras | Array di mora (le consonant possono essere omesse) |
accent | Posizione dell’accento (partendo da 1) |
pauseMora | Può comparire quando si inseriscono silenzi in corrispondenza di punteggiatura ecc. |
isInterrogative | Flag di interrogativa |
Sezione song
| Chiave | Contenuto |
|---|---|
tpqn | Ticks Per Quarter Note. Il valore standard è 480 |
tempos | Mappa dei tempi (position in tick) |
timeSignatures | Mappa dei tempi in chiave (measureNumber parte da 1) |
tracks | Record con l’ID della traccia come chiave |
trackOrder | Ordine di visualizzazione/riproduzione. Deve coincidere con l’insieme delle chiavi di tracks |
Track
| Chiave | Contenuto |
|---|---|
singer.styleId | ID da passare infine a /frame_synthesis?speaker={styleId} |
notes | Array di note |
keyRangeAdjustment | Aggiustamento della tonalità in semitoni |
volumeRangeAdjustment | Aggiustamento del volume |
pitchEditData / volumeEditData | Dati di modifica a livello di frame |
phonemeTimingEditData | Modifiche di timing dei fonemi per ciascun Note ID |
solo / mute | Utilizzati per determinare le tracce oggetto di riproduzione |
Note
| Chiave | Contenuto |
|---|---|
id | ID della nota (univoco) |
position | Tick di inizio nota |
duration | Durata della nota in tick |
noteNumber | Numero di nota MIDI |
lyric | Testo |
Conversione tra tick, secondi e frame
Con tempo unico si converte così:tempos in ordine crescente di position.
Note::len(), consulta Dettagli di Score e Note.
Flusso di generazione audio per il song
Attenzioni nella modifica diretta
- L’insieme delle chiavi di
tracksdeve sempre coincidere contrackOrder - Analogamente sincronizza
talk.audioKeysetalk.audioItems - Mantieni
position >= 0,duration >= 1enoteNumberin0..127 - Di solito
tempos[0].positionè0etimeSignatures[0].measureNumberè1 - Se possibile, conserva le chiavi sconosciute nel risalvataggio per non rompere la compatibilità con versioni future
Esempio in codice Laravel
Esempio minimo per caricare un.vvproj e generare talk e song.