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 :
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());