> ## 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 - Dictionnaire utilisateur - VOICEVOX for Laravel

> Comment manipuler le dictionnaire utilisateur du moteur officiel en mode client de VOICEVOX for Laravel, pour enregistrer la prononciation de noms propres et de termes techniques.

Le dictionnaire utilisateur permet d'enregistrer dans le moteur officiel VOICEVOX la prononciation de noms propres et de termes techniques. En mode client, le dictionnaire n'est pas stocké côté Laravel : l'API de dictionnaire utilisateur du moteur officiel connecté est utilisée telle quelle.

## Vue d'ensemble

Le dictionnaire utilisateur en mode client se manipule via la Facade `Voicevox`. En interne, des requêtes HTTP sont envoyées à `/user_dict`, `/user_dict_word` et `/import_user_dict` du moteur officiel VOICEVOX.

Les données de dictionnaire du moteur officiel sont stockées dans la zone utilisateur propre à chaque OS. Sur la version macOS de l'application VOICEVOX (version produit), elles sont généralement stockées à cet emplacement :

```text theme={null}
~/Library/Application Support/voicevox-engine/user_dict.json
```

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`), le dictionnaire est perdu à 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/user_dict.json` du mode natif. `config('voicevox.core.user_dict')` 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
```

## Utilisation de base

### Ajouter un mot

`Voicevox::addWord()` permet d'enregistrer un mot.

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

$uuid = Voicevox::addWord(
    surface: 'Laravel',
    pronunciation: 'ララベル',
    accentType: 0,
);

// En mode client, un UUID avec tirets est retourné
// exemple : "a1b2c3d4-0000-0000-0000-000000000000"
```

#### Paramètres

| Paramètre       | Type         | Description                                                                       |
| --------------- | ------------ | --------------------------------------------------------------------------------- |
| `surface`       | string       | Forme écrite (la chaîne effective du mot)                                         |
| `pronunciation` | string       | Prononciation (katakana uniquement)                                               |
| `accentType`    | int          | Type d'accent (0 = plat, 1 ou plus = position de l'accent)                        |
| `wordType`      | string\|null | Nature grammaticale (`COMMON_NOUN`, `PROPER_NOUN`, `VERB`, `ADJECTIVE`, `SUFFIX`) |
| `priority`      | int\|null    | Priorité                                                                          |

### Récupérer tous les mots

Vous pouvez récupérer tous les mots enregistrés.

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

$words = Voicevox::userDict();

/*
[
    "a1b2c3d4-0000-0000-0000-000000000000" => [
        "surface" => "Laravel",
        "pronunciation" => "ララベル",
        "accent_type" => 0,
        "word_type" => "COMMON_NOUN",
        "priority" => 5,
    ],
    ...
]
*/
```

### Mettre à jour un mot

Mettez à jour en spécifiant l'UUID retourné lors de l'ajout.

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

Voicevox::updateWord(
    wordUuid: 'a1b2c3d4-0000-0000-0000-000000000000',
    surface: 'Laravel',
    pronunciation: 'ラレベル',
    accentType: 1,
);
```

### Supprimer un mot

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

Voicevox::deleteWord('a1b2c3d4-0000-0000-0000-000000000000');
```

### Importer un dictionnaire

Vous pouvez importer un tableau au format dictionnaire utilisateur du moteur officiel. Avec `override: false` (valeur par défaut), les mots existants sont conservés et les mots importés sont ajoutés.

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

$words = json_decode(file_get_contents('other_user_dict.json'), true);

Voicevox::importUserDict($words, override: false);

// Avec override: true, le dictionnaire existant est remplacé
Voicevox::importUserDict($words, override: true);
```

Pour exporter un dictionnaire, enregistrez le résultat de `Voicevox::userDict()` en JSON.

```php theme={null}
$json = json_encode(Voicevox::userDict(), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

file_put_contents('exported_user_dict.json', $json);
```

## Synthèse vocale après enregistrement au dictionnaire

Les mots enregistrés dans le dictionnaire utilisateur sont automatiquement pris en compte lors de la synthèse vocale par le moteur officiel.

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

## 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::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`             |

## Différences avec le mode natif

| Élément                 | Mode client                                                    | Mode natif                                   |
| ----------------------- | -------------------------------------------------------------- | -------------------------------------------- |
| Méthode d'utilisation   | Facade `Voicevox`                                              | Helper `dict()`                              |
| Emplacement de stockage | Zone utilisateur du moteur officiel                            | `storage/voicevox/user_dict.json` de Laravel |
| Exemple macOS           | `~/Library/Application Support/voicevox-engine/user_dict.json` | `storage/voicevox/user_dict.json`            |
| UUID lors de l'ajout    | Avec `-`                                                       | Sans `-` depuis Core                         |
| Processus du moteur     | Requis                                                         | Non requis (FFI requis)                      |

## Précautions

<Warning>
  `pronunciation` doit être en katakana. Les hiragana et les kanji ne sont pas acceptés.
</Warning>

* En mode client, c'est le dictionnaire 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`), le dictionnaire est perdu à l'arrêt du conteneur.
* L'UUID retourné à l'ajout est de la forme `a1b2c3d4-0000-0000-0000-000000000000` (avec tirets).

## Dépannage

### Les mots ne sont pas pris en compte

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 la prononciation est en katakana.
4. Vérifiez que vous n'avez pas relancé un autre conteneur Docker.

### L'emplacement du fichier de dictionnaire est inconnu

Sur la version build macOS, vérifiez cet emplacement :

```text theme={null}
~/Library/Application Support/voicevox-engine/user_dict.json
```

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.


## Related topics

- [Mode natif - Dictionnaire utilisateur - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/native-user-dict.md)
- [Mode client - Presets - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/client-presets.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)
- [Prise en main - VOICEVOX for Laravel](/fr/packages/laravel-voicevox/getting-started.md)
