Vai al contenuto principale

Far cantare in modalità client

Nella sintesi vocale cantata in modalità client vengono utilizzate le API sing_frame_audio_query e frame_synthesis del motore ufficiale VOICEVOX. A differenza di Talk, è necessario costruire prima Score e Note.

Prerequisiti

docker pull voicevox/voicevox_engine:cpu-latest
docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-latest

Creazione di Score e Note

use Revolution\Voicevox\Song\Note;
use Revolution\Voicevox\Song\Score;

$score = Score::make([
    Note::make(length: 15),
    Note::make(length: Note::len(ticks: 480, bpm: 120), lyric: 'ド', key: 60),
    Note::make(length: Note::len(480, 120), lyric: 'レ', key: 62),
    Note::make(length: Note::len(960, 120), lyric: 'ミ', key: 64),
    Note::make(length: 2),
]);
ParametroTipoDescrizione
lengthintLunghezza in frame
lyricstringTesto. Se è una stringa vuota o omesso, indica una pausa
keyint|nullNumero di nota MIDI
Con Note::len($ticks, $bpm) puoi calcolare la lunghezza in frame dai ticks MIDI e dal BPM. È più chiaro considerare una nota da un quarto pari a 480 ticks.

Utilizzo di base

use Revolution\Voicevox\Song\Note;
use Revolution\Voicevox\Song\Score;
use Revolution\Voicevox\Voicevox;

$score = Score::make([
    Note::make(length: 15),
    Note::make(length: Note::len(480, 120), lyric: 'ド', key: 60),
    Note::make(length: Note::len(480, 120), lyric: 'レ', key: 62),
    Note::make(length: Note::len(960, 120), lyric: 'ミ', key: 64),
    Note::make(length: 2),
]);

$response = Voicevox::song($score, teacher: 6000)
    ->generate(id: 3001);

$response->storeAs('client', 'song.wav');

teacher e id

  • teacher: Style ID passato a sing_frame_audio_query. Attualmente esiste solo il 6000, quindi il valore predefinito è 6000.
  • generate(id:): Style ID passato a frame_synthesis
Puoi ottenere l’elenco degli speaker per il canto con singers().
use Revolution\Voicevox\Voicevox;

$singers = Voicevox::singers();

Regolazione di F0 e volume con tap()

In Song l’utilità di tap() è particolarmente evidente: puoi regolare la SongAudioQuery prima di passarla a generate().
use Revolution\Voicevox\Client\SongAudioQuery;
use Revolution\Voicevox\Voicevox;

$response = Voicevox::song($score, teacher: 6000)
    ->tap(function (SongAudioQuery $song) {
        $song->sync();
    })
    ->generate(id: 3001);
Quando aggiorni F0 e volume separatamente, esegui l’ordine F0 → volume.
->tap(function (SongAudioQuery $song) {
    $song->updateF0();
    $song->updateVolume();
})
Anche quando vuoi risincronizzare dopo aver modificato lo Score, tap() è comodo.
->tap(function (SongAudioQuery $song) {
    $song->score->notes[2] = Note::make(length: Note::len(480, 120), lyric: 'ファ', key: 65);
    $song->sync();
})
L’idea alla base di tap() è riassunta in helper tap() e trait Tappable. VOICEVOX for Laravel è un caso tipico di “voglio regolare solo l’oggetto intermedio senza cambiare il valore di ritorno”.

Pagine successive

Dettagli su Score e Note

Verifica il calcolo delle lunghezze in frame e i pattern di gestione JSON.

Song in modalità nativa

Usa lo stesso Score in modalità nativa tramite FFI.

Utilizzo di VOICEVOX Core for PHP

Verifica il flusso di sintesi vocale con la sola libreria core.
Ultima modifica il 13 luglio 2026