> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Mode client - Presets - VOICEVOX for Laravel

> Comment manipuler les presets du moteur officiel en mode client de VOICEVOX for Laravel, et sauvegarder/réutiliser des paramètres de synthèse vocale.

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 :

```text theme={null}
~/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.

```shell theme={null}
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`.

```env theme={null}
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.

```php theme={null}
[
    '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.

```php theme={null}
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

```php theme={null}
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

```php theme={null}
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

```php theme={null}
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é.

```php theme={null}
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()`.

```php theme={null}
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()`.

```php theme={null}
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

```php theme={null}
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

```php theme={null}
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

<Warning>
  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.
</Warning>

* 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

1. Vérifiez que le moteur officiel VOICEVOX est bien démarré.
2. Vérifiez que `VOICEVOX_URL` pointe vers la bonne cible.
3. 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 :

```text theme={null}
~/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.

```php theme={null}
use Revolution\Voicevox\Voicevox;

$speakers = Voicevox::speakers();

foreach ($speakers as $speaker) {
    echo $speaker['name'].': '.$speaker['speaker_uuid'].PHP_EOL;
}
```


## Related topics

- [Mode natif - Presets - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/native-presets.md)
- [Mode client - Dictionnaire utilisateur - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/client-user-dict.md)
- [Mode client : Song (synthèse vocale chantée) - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/client-song.md)
- [Mode client : Talk (synthèse vocale de texte) - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/client-talk.md)
- [Mode natif : Song (synthèse vocale chantée) - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/native-song.md)
