Vai al contenuto principale

Sintesi vocale di base

Il seguente talk.php è un esempio che sintetizza audio dal testo e lo scrive in un file WAV.
PHP FFI è normalmente disabilitato negli ambienti server Web (come FPM). Esegui questo script da CLI, ad esempio con 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;

// Modifica il percorso in base a dove hai installato 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';

// Testo da sintetizzare e ID di stile
$text    = 'この音声は、ボイスボックスを使用して、出力されています。';
$styleId = 0;
$outPath = './output.wav';

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

// Carica il modello vocale
$model = VoiceModelFile::open($vvmPath);
$synthesizer->loadVoiceModel($model);

// Sintesi
$audioQuery = $synthesizer->createAudioQuery($text, $styleId);
$wav        = $synthesizer->synthesis($audioQuery, $styleId);

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

Sintesi in un solo passo (metodo tts)

Se vuoi evitare i due passaggi createAudioQuery + synthesis, puoi usare il metodo tts():
$wav = $synthesizer->tts($text, $styleId);
file_put_contents('./output.wav', $wav);

Sintesi da notazione katakana

È possibile sintetizzare anche partendo da una notazione katakana in stile AquesTalk:
// Usando ttsFromKana
$wav = $synthesizer->ttsFromKana("コノオンセイワ'、ボイスボックスオ'/シヨーシテ'、シュツリョクサレテイマ'ス。", $styleId);
file_put_contents('./output.wav', $wav);

Usare il dizionario utente

Per registrare la lettura di parole personalizzate, usa 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,
);

// Salva il dizionario
$userDict->save('./mydict.json');

// Applica il dizionario a OpenJTalk
$openJtalk->useUserDict($userDict);

Regolare l’AudioQuery

Regolando il JSON ottenuto con createAudioQuery prima di sintetizzare, puoi controllare finemente intonazione, ritmo, ecc.:
$audioQueryJson = $synthesizer->createAudioQuery($text, $styleId);

// Decodifica il JSON e regolalo
$audioQuery = json_decode($audioQueryJson, true);
$audioQuery['speedScale'] = 1.2;   // velocità 1,2x
$audioQuery['pitchScale'] = 0.05;  // pitch leggermente più alto

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

Ottenere le frasi accentate

Puoi ottenere le informazioni sulle frasi accentate del testo per verificarle o modificarle:
$accentPhrasesJson = $synthesizer->createAccentPhrases($text, $styleId);
$accentPhrases = json_decode($accentPhrasesJson, true);

// Sovrascrivi pitch delle mora e durata dei fonemi con un altro stile
$updatedJson = $synthesizer->replaceMoraData($accentPhrasesJson, $styleId);

Usare la modalità GPU

Negli ambienti in cui è disponibile una GPU, specificare AccelerationMode::Gpu velocizza l’esecuzione:
use Revolution\Voicevox\Core\Enums\AccelerationMode;

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

// Verifica se la modalità GPU è attiva
if ($synthesizer->isGpuMode()) {
    echo 'In esecuzione in modalità GPU' . PHP_EOL;
}

Usare più modelli vocali

Caricando più file .vvm e cambiando l’ID di stile puoi utilizzare più voci di personaggi diversi:
$model0 = VoiceModelFile::open($voicevoxCoreDir . '/models/vvms/0.vvm');
$model1 = VoiceModelFile::open($voicevoxCoreDir . '/models/vvms/1.vvm');

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

// Verifica le informazioni sugli speaker inclusi nel modello
$metas = json_decode($synthesizer->metas(), true);

// Scarica il modello (quando non serve più)
$synthesizer->unloadVoiceModel($model0->id());
Ultima modifica il 13 luglio 2026