Grundlegende Sprachsynthese
Die folgende talk.php ist ein Beispiel, das aus Text Audio synthetisiert und in eine WAV-Datei schreibt.
PHP-FFI ist in Webserver-Umgebungen (wie FPM) normalerweise deaktiviert. Führen Sie dieses Skript wie php talk.php über die CLI aus.
<?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;
// Passen Sie die Pfade an den Installationsort von voicevox_core an
$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';
// Zu synthetisierender Text und Style-ID
$text = 'この音声は、ボイスボックスを使用して、出力されています。';
$styleId = 0;
$outPath = './output.wav';
// Initialisierung
$onnxruntime = Onnxruntime::loadOnce($onnxruntimeFilename);
$openJtalk = new OpenJtalk($dictDir);
$synthesizer = new Synthesizer($onnxruntime, $openJtalk, AccelerationMode::Auto);
// Audiomodell laden
$model = VoiceModelFile::open($vvmPath);
$synthesizer->loadVoiceModel($model);
// Sprachsynthese
$audioQuery = $synthesizer->createAudioQuery($text, $styleId);
$wav = $synthesizer->synthesis($audioQuery, $styleId);
file_put_contents($outPath, $wav);
echo 'Wrote ' . $outPath . PHP_EOL;
Ausführen:
Sprachsynthese in einem Schritt (tts-Methode)
Wenn Sie die zwei Schritte createAudioQuery + synthesis überspringen möchten, können Sie die tts()-Methode verwenden:
$wav = $synthesizer->tts($text, $styleId);
file_put_contents('./output.wav', $wav);
Sprachsynthese mit Katakana-Notation
Sie können auch aus Katakana in AquesTalk-ähnlicher Notation synthetisieren:
// Wenn ttsFromKana verwendet wird
$wav = $synthesizer->ttsFromKana("コノオンセイワ'、ボイスボックスオ'/シヨーシテ'、シュツリョクサレテイマ'ス。", $styleId);
file_put_contents('./output.wav', $wav);
Benutzerwörterbuch verwenden
Um die Aussprache benutzerdefinierter Wörter zu registrieren, verwenden Sie 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,
);
// Wörterbuch speichern
$userDict->save('./mydict.json');
// Wörterbuch auf OpenJTalk anwenden
$openJtalk->useUserDict($userDict);
Anpassung der AudioQuery
Wenn Sie das mit createAudioQuery gewonnene JSON vor der Synthese anpassen, können Sie Intonation und Tempo fein steuern:
$audioQueryJson = $synthesizer->createAudioQuery($text, $styleId);
// JSON dekodieren und anpassen
$audioQuery = json_decode($audioQueryJson, true);
$audioQuery['speedScale'] = 1.2; // Geschwindigkeit 1,2×
$audioQuery['pitchScale'] = 0.05; // Pitch leicht anheben
$wav = $synthesizer->synthesis(json_encode($audioQuery), $styleId);
file_put_contents('./output.wav', $wav);
Akzentphrasen abrufen
Sie können die Akzentphrasen-Informationen eines Textes abrufen und prüfen bzw. bearbeiten:
$accentPhrasesJson = $synthesizer->createAccentPhrases($text, $styleId);
$accentPhrases = json_decode($accentPhrasesJson, true);
// Mora-Pitch und Phonemlänge mit einem anderen Style überschreiben
$updatedJson = $synthesizer->replaceMoraData($accentPhrasesJson, $styleId);
GPU-Modus verwenden
In Umgebungen mit GPU können Sie durch Angabe von AccelerationMode::Gpu die Geschwindigkeit erhöhen:
use Revolution\Voicevox\Core\Enums\AccelerationMode;
$synthesizer = new Synthesizer($onnxruntime, $openJtalk, AccelerationMode::Gpu);
// Prüfen, ob der GPU-Modus aktiv ist
if ($synthesizer->isGpuMode()) {
echo 'Läuft im GPU-Modus' . PHP_EOL;
}
Mehrere Audiomodelle verwenden
Sie können mehrere .vvm-Dateien laden und durch Wechseln der Style-ID mehrere Charakterstimmen verwenden:
$model0 = VoiceModelFile::open($voicevoxCoreDir . '/models/vvms/0.vvm');
$model1 = VoiceModelFile::open($voicevoxCoreDir . '/models/vvms/1.vvm');
$synthesizer->loadVoiceModel($model0);
$synthesizer->loadVoiceModel($model1);
// Informationen zu den im Modell enthaltenen Speakern prüfen
$metas = json_decode($synthesizer->metas(), true);
// Modell entladen (falls nicht mehr benötigt)
$synthesizer->unloadVoiceModel($model0->id());
Zuletzt geändert am 13. Juli 2026