Passer au contenu principal

Synthèse vocale de base

Le fichier talk.php ci-dessous synthétise la voix à partir d’un texte et l’écrit dans un fichier WAV.
PHP FFI est en général désactivé dans les environnements serveur web (FPM, etc.). Exécutez ce script en CLI, par exemple avec php talk.php.
<?php

require __DIR__ . '/vendor/autoload.php';

use Revolution\Voicevox\Core\Enums\AccelerationMode;
use Revolution\Voicevox\Core\Onnxruntime;
use Revolution\Voicevox\Core\OpenJtalk;
use Revolution\Voicevox\Core\Synthesizer;
use Revolution\Voicevox\Core\VoiceModelFile;

// Modifiez les chemins selon l'emplacement d'installation de voicevox_core
$voicevoxCoreDir = getenv('HOME') . '/.local/voicevox_core';
$onnxruntimeFilename = $voicevoxCoreDir . '/onnxruntime/lib/' . Onnxruntime::libVersionedFilename();
$dictDir = $voicevoxCoreDir . '/dict/open_jtalk_dic_utf_8-1.11';
$vvmPath  = $voicevoxCoreDir . '/models/vvms/0.vvm';

// Texte à synthétiser et ID de style
$text    = 'この音声は、ボイスボックスを使用して、出力されています。';
$styleId = 0;
$outPath = './output.wav';

// Initialisation
$onnxruntime = Onnxruntime::loadOnce($onnxruntimeFilename);
$openJtalk   = new OpenJtalk($dictDir);
$synthesizer = new Synthesizer($onnxruntime, $openJtalk, AccelerationMode::Auto);

// Charger le modèle vocal
$model = VoiceModelFile::open($vvmPath);
$synthesizer->loadVoiceModel($model);

// Synthèse vocale
$audioQuery = $synthesizer->createAudioQuery($text, $styleId);
$wav        = $synthesizer->synthesis($audioQuery, $styleId);

file_put_contents($outPath, $wav);
echo 'Wrote ' . $outPath . PHP_EOL;
Exécution :
php talk.php

Synthèse en une seule étape (méthode tts)

Pour éviter les deux étapes createAudioQuery + synthesis, utilisez la méthode tts() :
$wav = $synthesizer->tts($text, $styleId);
file_put_contents('./output.wav', $wav);

Synthèse à partir de notation katakana

Vous pouvez également synthétiser à partir de la notation katakana de style AquesTalk :
// Avec ttsFromKana
$wav = $synthesizer->ttsFromKana("コノオンセイワ'、ボイスボックスオ'/シヨーシテ'、シュツリョクサレテイマ'ス。", $styleId);
file_put_contents('./output.wav', $wav);

Utiliser un dictionnaire utilisateur

Pour enregistrer la prononciation de mots personnalisés, utilisez UserDict :
use Revolution\Voicevox\Core\UserDict;
use Revolution\Voicevox\Core\Enums\UserDictWordType;

$userDict = new UserDict();
$uuid = $userDict->addWord(
    surface: 'ボイボ',
    pronunciation: 'ボイボ',
    accentType: 0,
    wordType: UserDictWordType::ProperNoun,
    priority: 10,
);

// Sauvegarder le dictionnaire
$userDict->save('./mydict.json');

// Appliquer le dictionnaire à OpenJTalk
$openJtalk->useUserDict($userDict);

Ajuster l’AudioQuery

En ajustant le JSON obtenu via createAudioQuery avant la synthèse, vous pouvez contrôler finement l’intonation, le tempo, etc. :
$audioQueryJson = $synthesizer->createAudioQuery($text, $styleId);

// Décoder le JSON puis ajuster
$audioQuery = json_decode($audioQueryJson, true);
$audioQuery['speedScale'] = 1.2;   // Vitesse 1,2x
$audioQuery['pitchScale'] = 0.05;  // Légère élévation de la hauteur

$wav = $synthesizer->synthesis(json_encode($audioQuery), $styleId);
file_put_contents('./output.wav', $wav);

Récupérer les accent phrases

Vous pouvez récupérer les informations d’accent phrases d’un texte pour vérification ou édition :
$accentPhrasesJson = $synthesizer->createAccentPhrases($text, $styleId);
$accentPhrases = json_decode($accentPhrasesJson, true);

// Écraser la hauteur et la durée des mores avec un autre style
$updatedJson = $synthesizer->replaceMoraData($accentPhrasesJson, $styleId);

Utiliser le mode GPU

Sur un environnement où le GPU est disponible, spécifier AccelerationMode::Gpu accélère la synthèse :
use Revolution\Voicevox\Core\Enums\AccelerationMode;

$synthesizer = new Synthesizer($onnxruntime, $openJtalk, AccelerationMode::Gpu);

// Vérifier que le mode GPU est actif
if ($synthesizer->isGpuMode()) {
    echo 'En mode GPU' . PHP_EOL;
}

Utiliser plusieurs modèles vocaux

En chargeant plusieurs fichiers .vvm, vous pouvez utiliser plusieurs voix de personnages en changeant d’ID de style :
$model0 = VoiceModelFile::open($voicevoxCoreDir . '/models/vvms/0.vvm');
$model1 = VoiceModelFile::open($voicevoxCoreDir . '/models/vvms/1.vvm');

$synthesizer->loadVoiceModel($model0);
$synthesizer->loadVoiceModel($model1);

// Vérifier les informations sur les locuteurs contenus dans le modèle
$metas = json_decode($synthesizer->metas(), true);

// Décharger un modèle (lorsqu'il n'est plus nécessaire)
$synthesizer->unloadVoiceModel($model0->id());
Dernière modification le 13 juillet 2026