Saltar al contenido principal

Cantar en modo cliente

En la síntesis de voz cantada del modo cliente se usan las APIs sing_frame_audio_query y frame_synthesis del motor oficial de VOICEVOX. A diferencia de Talk, hay que construir primero un Score y sus Note.

Preparación

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

Crear Score y 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),
]);
ParámetroTipoDescripción
lengthintLongitud en frames
lyricstringLetra. Cadena vacía u omitida indica silencio
keyint|nullNúmero de nota MIDI
Con Note::len($ticks, $bpm) puedes calcular la longitud en frames a partir de los ticks MIDI y el BPM. Es fácil si tratas la negra como 480 ticks.

Uso básico

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 que se pasa a sing_frame_audio_query. Actualmente solo existe el 6000, así que 6000 es el valor por defecto.
  • generate(id:): style ID que se pasa a frame_synthesis.
Puedes obtener la lista de speakers de voz cantada disponibles con singers().
use Revolution\Voicevox\Voicevox;

$singers = Voicevox::singers();

Ajustar F0 y volumen con tap()

En Song el uso de tap() es especialmente claro: puedes ajustar el SongAudioQuery antes de pasarlo 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);
Para actualizar F0 y volumen por separado, hazlo en el orden F0 → volumen.
->tap(function (SongAudioQuery $song) {
    $song->updateF0();
    $song->updateVolume();
})
tap() también es útil cuando quieres modificar el Score y volver a sincronizar.
->tap(function (SongAudioQuery $song) {
    $song->score->notes[2] = Note::make(length: Note::len(480, 120), lyric: 'ファ', key: 65);
    $song->sync();
})
El planteamiento de tap() está recogido en Helper tap() y trait Tappable. VOICEVOX for Laravel es un ejemplo típico de «quiero ajustar solo el objeto intermedio sin cambiar el valor de retorno».

Siguientes páginas

Detalle de Score y Note

Consulta el cálculo de longitudes de frame y el patrón de gestión en JSON.

Song nativo

Usa el mismo Score en modo nativo vía FFI.

Uso de VOICEVOX Core for PHP

Consulta el flujo de síntesis con la biblioteca central por sí sola.
Última modificación el 13 de julio de 2026