La fonctionnalité de presets permet d’enregistrer dans le moteur officiel VOICEVOX des combinaisons de paramètres de synthèse vocale fréquemment utilisées et de les réutiliser. En mode client, les presets ne sont pas stockés côté Laravel : l’API de presets du moteur officiel connecté est utilisée.
Vue d’ensemble
Les presets en mode client se manipulent via la Facade Voicevox. En interne, des requêtes HTTP sont envoyées à /presets, /add_preset, /update_preset, /delete_preset et /audio_query_from_preset du moteur officiel VOICEVOX.
Les presets du moteur officiel sont stockés dans la zone utilisateur propre à chaque OS sous forme de presets.yaml. Sur la version macOS de l’application VOICEVOX (version produit), ils sont généralement stockés à cet emplacement :
~/Library/Application Support/voicevox-engine/presets.yaml
Quand le moteur officiel est démarré via Docker, il stocke également dans la zone utilisateur du conteneur. Les données sont conservées tant que le même conteneur est réutilisé. Si en revanche vous créez un conteneur temporaire à chaque fois (docker run --rm), les presets sont perdus à l’arrêt du conteneur. Pour une persistance fiable, montez la zone utilisateur du conteneur via un volume Docker.
Ceci est distinct de storage/voicevox/presets.json du mode natif. config('voicevox.core.presets') côté Laravel n’est pas utilisé en mode client.
Prérequis
Démarrez le moteur officiel VOICEVOX.
docker pull voicevox/voicevox_engine:cpu-latest
docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-latest
La cible de connexion peut être changée via VOICEVOX_URL.
VOICEVOX_URL=http://127.0.0.1:50021
Structure d’un preset
Les presets envoyés et reçus en mode client sont des tableaux alignés sur le schéma de l’API du moteur officiel.
[
'id' => 1, // ID du preset (entier)
'name' => 'ゆっくり', // Nom du preset
'speaker_uuid' => 'uuid', // UUID du locuteur (chaîne)
'style_id' => 1, // ID de style (entier)
'speedScale' => 0.8, // Vitesse de parole
'pitchScale' => 0.0, // Hauteur
'intonationScale' => 1.0, // Intonation
'volumeScale' => 1.0, // Volume
'prePhonemeLength' => 0.1, // Silence de début
'postPhonemeLength' => 0.1, // Silence de fin
]
Utilisation de base
Créer un preset
Voicevox::addPreset() permet de créer un preset. Dans le moteur officiel, spécifier 0 comme id fait attribuer automatiquement un ID libre.
use Revolution\Voicevox\Voicevox;
$id = Voicevox::addPreset([
'id' => 0,
'name' => 'ゆっくり丁寧',
'speaker_uuid' => '7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff',
'style_id' => 1,
'speedScale' => 0.8,
'pitchScale' => 0.0,
'intonationScale' => 1.2,
'volumeScale' => 1.0,
'prePhonemeLength' => 0.1,
'postPhonemeLength' => 0.1,
]);
echo $id; // exemple : 1
Récupérer tous les presets
use Revolution\Voicevox\Voicevox;
$presets = Voicevox::presets();
/*
[
[
"id" => 1,
"name" => "ゆっくり丁寧",
"speaker_uuid" => "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
"style_id" => 1,
"speedScale" => 0.8,
...
],
...
]
*/
Mettre à jour un preset
use Revolution\Voicevox\Voicevox;
$id = Voicevox::updatePreset([
'id' => 1,
'name' => 'ゆっくりはっきり',
'speaker_uuid' => '7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff',
'style_id' => 1,
'speedScale' => 0.7,
'pitchScale' => 0.0,
'intonationScale' => 1.5,
'volumeScale' => 1.0,
'prePhonemeLength' => 0.1,
'postPhonemeLength' => 0.1,
]);
Supprimer un preset
use Revolution\Voicevox\Voicevox;
Voicevox::deletePreset(1);
Synthèse vocale à partir d’un preset
talkFromPreset()
Voicevox::talkFromPreset() utilise /audio_query_from_preset du moteur officiel pour créer un TalkAudioQuery avec le preset déjà appliqué.
use Revolution\Voicevox\Voicevox;
$response = Voicevox::talkFromPreset('プリセットを使うのだ', presetId: 1)
->generate(id: 1);
$response->storeAs('client', 'preset-talk.wav');
audioQueryFromPreset()
Pour ne récupérer que le tableau de la audio query avant synthèse, utilisez audioQueryFromPreset().
use Revolution\Voicevox\Voicevox;
$audioQuery = Voicevox::audioQueryFromPreset(
text: 'プリセットのクエリだけ作るのだ',
presetId: 1,
);
$audioQuery['speedScale'] = 1.1;
Ajustements complémentaires avec tap()
Le TalkAudioQuery créé depuis un preset peut être ajusté avec tap() comme n’importe quel Voicevox::talk().
use Revolution\Voicevox\Client\TalkAudioQuery;
use Revolution\Voicevox\Voicevox;
$response = Voicevox::talkFromPreset('少し速く読むのだ', presetId: 1)
->tap(function (TalkAudioQuery $talk) {
$talk->audioQuery['speedScale'] = 1.2;
})
->generate(id: 1);
Correspondance avec l’API du moteur
Chaque méthode de la Facade Voicevox correspond à une API du moteur officiel.
| Laravel | API du moteur officiel |
|---|
Voicevox::presets() | GET /presets |
Voicevox::addPreset() | POST /add_preset |
Voicevox::updatePreset() | POST /update_preset |
Voicevox::deletePreset() | POST /delete_preset |
Voicevox::audioQueryFromPreset() | POST /audio_query_from_preset |
Voicevox::talkFromPreset() | POST /audio_query_from_preset + POST /synthesis |
Différences avec le mode natif
| Élément | Mode client | Mode natif |
|---|
| Méthode d’utilisation | Facade Voicevox | Helpers preset() / talk() |
| Format de stockage | presets.yaml du moteur officiel | presets.json de Laravel |
| Exemple macOS | ~/Library/Application Support/voicevox-engine/presets.yaml | storage/voicevox/presets.json |
| Génération de la audio query | /audio_query_from_preset du moteur officiel | Implémentation native côté Laravel |
| Processus du moteur | Requis | Non requis (FFI requis) |
Exemples pratiques
Pour la narration
use Revolution\Voicevox\Voicevox;
Voicevox::addPreset([
'id' => 0,
'name' => 'ナレーション',
'speaker_uuid' => '7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff',
'style_id' => 1,
'speedScale' => 1.0,
'pitchScale' => -0.05,
'intonationScale' => 0.8,
'volumeScale' => 1.0,
'prePhonemeLength' => 0.15,
'postPhonemeLength' => 0.15,
]);
Pour la parole rapide
Voicevox::addPreset([
'id' => 0,
'name' => '早口',
'speaker_uuid' => '388f246b-8c41-4ac1-8e2d-5d79f3ff56d9',
'style_id' => 3,
'speedScale' => 1.5,
'pitchScale' => 0.05,
'intonationScale' => 1.3,
'volumeScale' => 1.0,
'prePhonemeLength' => 0.05,
'postPhonemeLength' => 0.05,
]);
Détails des paramètres
speedScale : 0.5 à 2.0 (vitesse)
pitchScale : -0.15 à 0.15 (hauteur)
intonationScale : 0.0 à 2.0 (intonation)
volumeScale : 0.0 à 2.0 (volume)
prePhonemeLength : 0.0 à 1.5 (silence de début, en secondes)
postPhonemeLength : 0.0 à 1.5 (silence de fin, en secondes)
Précautions
En mode client, c’est le presets.yaml du moteur officiel qui est mis à jour. Rien n’est stocké dans le storage du projet Laravel.
- Si vous créez à chaque fois un conteneur temporaire (par exemple
docker run --rm), les presets sont perdus à l’arrêt du conteneur.
- Incluez toujours à la fois
speaker_uuid et style_id.
- Pour
generate(id:) sur une query créée par talkFromPreset(), spécifiez normalement le même ID que le style_id du preset.
Dépannage
Les presets ne peuvent pas être récupérés
- Vérifiez que le moteur officiel VOICEVOX est bien démarré.
- Vérifiez que
VOICEVOX_URL pointe vers la bonne cible.
- Vérifiez que vous n’avez pas relancé un autre conteneur Docker.
L’emplacement du fichier de presets est inconnu
Sur la version build macOS, vérifiez cet emplacement :
~/Library/Application Support/voicevox-engine/presets.yaml
Sous Docker, le fichier est stocké dans la zone utilisateur du moteur officiel (dans le conteneur). Pour une persistance, montez cette zone utilisateur du conteneur dans un volume Docker.
Le speaker_uuid est inconnu
Vous pouvez récupérer l’UUID depuis la liste des locuteurs.
use Revolution\Voicevox\Voicevox;
$speakers = Voicevox::speakers();
foreach ($speakers as $speaker) {
echo $speaker['name'].': '.$speaker['speaker_uuid'].PHP_EOL;
}