Utilizzando il dizionario utente puoi registrare nel motore ufficiale VOICEVOX la pronuncia di nomi propri e termini tecnici. In modalità client il dizionario non viene salvato lato Laravel: viene utilizzata direttamente l’API del dizionario utente gestita dal motore ufficiale a cui ti connetti.
Panoramica
Il dizionario utente in modalità client si manipola tramite la Facade Voicevox. Internamente, invia richieste HTTP a /user_dict, /user_dict_word e /import_user_dict del motore ufficiale VOICEVOX.
I dati del dizionario del motore ufficiale sono salvati nell’area utente specifica per ciascun sistema operativo. Nella build macOS dell’app VOICEVOX (versione stabile) sono normalmente salvati nel seguente percorso.
~/Library/Application Support/voicevox-engine/user_dict.json
Anche se avvii il motore ufficiale con Docker, sono salvati nell’area utente all’interno del container. Finché continui a utilizzare lo stesso container, i dati vengono mantenuti anche dopo il riavvio. Tuttavia, se crei ogni volta un container temporaneo, ad esempio con docker run --rm, il dizionario viene perso al termine del container. Per rendere persistente il dizionario in modo affidabile, monta l’area utente all’interno del container tramite un volume Docker.
Questa è una gestione separata da storage/voicevox/user_dict.json della modalità nativa. Il config('voicevox.core.user_dict') lato Laravel non viene utilizzato in modalità client.
Prerequisiti
Avvia il motore ufficiale VOICEVOX.
docker pull voicevox/voicevox_engine:cpu-latest
docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-latest
Puoi modificare la destinazione con VOICEVOX_URL.
VOICEVOX_URL=http://127.0.0.1:50021
Utilizzo di base
Aggiunta di una parola
Puoi registrare parole con Voicevox::addWord().
use Revolution\Voicevox\Voicevox;
$uuid = Voicevox::addWord(
surface: 'Laravel',
pronunciation: 'ララベル',
accentType: 0,
);
// In modalità client viene restituito un UUID con "-"
// Es: "a1b2c3d4-0000-0000-0000-000000000000"
Parametri
| Parametro | Tipo | Descrizione |
|---|
surface | string | Rappresentazione (la stringa effettiva della parola) |
pronunciation | string | Pronuncia (solo katakana) |
accentType | int | Tipo di accento (0 = piatto, 1 o superiore = posizione dell’accento) |
wordType | string|null | Parte del discorso (COMMON_NOUN, PROPER_NOUN, VERB, ADJECTIVE, SUFFIX) |
priority | int|null | Priorità |
Recupero di tutte le parole
Puoi recuperare tutte le parole registrate.
use Revolution\Voicevox\Voicevox;
$words = Voicevox::userDict();
/*
[
"a1b2c3d4-0000-0000-0000-000000000000" => [
"surface" => "Laravel",
"pronunciation" => "ララベル",
"accent_type" => 0,
"word_type" => "COMMON_NOUN",
"priority" => 5,
],
...
]
*/
Aggiornamento di una parola
Aggiorna specificando l’UUID restituito al momento dell’aggiunta.
use Revolution\Voicevox\Voicevox;
Voicevox::updateWord(
wordUuid: 'a1b2c3d4-0000-0000-0000-000000000000',
surface: 'Laravel',
pronunciation: 'ラレベル',
accentType: 1,
);
Eliminazione di una parola
use Revolution\Voicevox\Voicevox;
Voicevox::deleteWord('a1b2c3d4-0000-0000-0000-000000000000');
Importazione del dizionario
Puoi importare un array nel formato del dizionario utente del motore ufficiale. Con override: false (impostazione predefinita), le parole esistenti sono mantenute e le parole importate vengono aggiunte.
use Revolution\Voicevox\Voicevox;
$words = json_decode(file_get_contents('other_user_dict.json'), true);
Voicevox::importUserDict($words, override: false);
// Con override: true il dizionario esistente viene sostituito
Voicevox::importUserDict($words, override: true);
Se vuoi esportare il dizionario, salva in JSON il risultato di Voicevox::userDict().
$json = json_encode(Voicevox::userDict(), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
file_put_contents('exported_user_dict.json', $json);
Sintesi vocale dopo la registrazione nel dizionario
Le parole registrate nel dizionario utente vengono automaticamente utilizzate quando il motore ufficiale esegue la sintesi vocale.
use Revolution\Voicevox\Voicevox;
Voicevox::addWord(
surface: 'Laravel',
pronunciation: 'ララベル',
accentType: 0,
);
$response = Voicevox::talk('Laravelで開発するのは楽しいです', id: 1)->generate(id: 1);
$response->storeAs('client', 'laravel.wav');
Corrispondenza con l’Engine API
Ogni metodo della Facade Voicevox corrisponde all’API del motore ufficiale.
| Laravel | API del motore ufficiale |
|---|
Voicevox::userDict() | GET /user_dict |
Voicevox::addWord() | POST /user_dict_word |
Voicevox::updateWord() | PUT /user_dict_word/{word_uuid} |
Voicevox::deleteWord() | DELETE /user_dict_word/{word_uuid} |
Voicevox::importUserDict() | POST /import_user_dict |
Differenze con la modalità nativa
| Elemento | Modalità client | Modalità nativa |
|---|
| Modalità d’uso | Facade Voicevox | Helper dict() |
| Destinazione di salvataggio | Area utente del motore ufficiale | storage/voicevox/user_dict.json di Laravel |
| Esempio su macOS | ~/Library/Application Support/voicevox-engine/user_dict.json | storage/voicevox/user_dict.json |
| UUID in fase di aggiunta | Con - | Da Core senza - |
| Processo del motore | Necessario | Non necessario (richiede FFI) |
Avvertenze
Specifica pronunciation in katakana. Non è possibile usare hiragana o kanji.
- In modalità client viene aggiornato il dizionario lato motore ufficiale. Non viene salvato nella
storage del progetto Laravel.
- Se crei ogni volta un container temporaneo con
docker run --rm, il dizionario viene perso al termine del container.
- L’UUID restituito in fase di aggiunta ha il formato con trattini, come
a1b2c3d4-0000-0000-0000-000000000000.
Risoluzione dei problemi
Le parole non vengono applicate
- Verifica che il motore ufficiale VOICEVOX sia in esecuzione.
- Verifica che
VOICEVOX_URL punti alla destinazione corretta.
- Verifica che la pronuncia sia in katakana.
- Verifica di non aver riavviato un container Docker differente.
Non trovi il file del dizionario
Nella build macOS controlla il seguente percorso.
~/Library/Application Support/voicevox-engine/user_dict.json
Con Docker viene salvato nell’area utente (all’interno del container) del motore ufficiale. Se serve persistenza, monta l’area utente all’interno del container su un volume Docker.