Zum Hauptinhalt springen

Singen lassen im Client-Modus

Bei der Gesangs-Sprachsynthese im Client-Modus werden die APIs sing_frame_audio_query und frame_synthesis der offiziellen VOICEVOX-Engine verwendet. Im Gegensatz zum Talk müssen Sie zuvor Score und Note zusammenbauen.

Vorbereitung

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

Score und Note erstellen

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),
]);
ParameterTypBeschreibung
lengthintFrame-Länge
lyricstringLiedtext. Leerer String oder weggelassen bedeutet Pause
keyint|nullMIDI-Notennummer
Mit Note::len($ticks, $bpm) können Sie aus MIDI-Ticks und BPM die Frame-Länge berechnen. Wenn Sie eine Viertelnote als 480 Ticks behandeln, ist es leichter verständlich.

Grundlegende Verwendung

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 und id

  • teacher: Style-ID, die an sing_frame_audio_query übergeben wird. Derzeit existiert nur 6000, daher ist 6000 der Standardwert.
  • generate(id:): Style-ID, die an frame_synthesis übergeben wird.
Die Liste der verfügbaren Gesangs-Speaker können Sie mit singers() abrufen.
use Revolution\Voicevox\Voicevox;

$singers = Voicevox::singers();

F0 und Lautstärke mit tap() anpassen

Bei Song ist der Einsatzzweck von tap() besonders klar: Sie können das SongAudioQuery anpassen, bevor Sie es an generate() weitergeben.
use Revolution\Voicevox\Client\SongAudioQuery;
use Revolution\Voicevox\Voicevox;

$response = Voicevox::song($score, teacher: 6000)
    ->tap(function (SongAudioQuery $song) {
        $song->sync();
    })
    ->generate(id: 3001);
Wenn Sie F0 und Lautstärke einzeln aktualisieren möchten, führen Sie es in der Reihenfolge F0 → Lautstärke aus.
->tap(function (SongAudioQuery $song) {
    $song->updateF0();
    $song->updateVolume();
})
tap() ist auch praktisch, wenn Sie den Score ändern und dann neu synchronisieren möchten.
->tap(function (SongAudioQuery $song) {
    $song->score->notes[2] = Note::make(length: Note::len(480, 120), lyric: 'ファ', key: 65);
    $song->sync();
})
Die Idee hinter tap() ist im Abschnitt tap()-Helper und Tappable-Trait zusammengefasst. VOICEVOX für Laravel ist ein typisches Beispiel für „Wir wollen den Rückgabewert nicht ändern, sondern nur das Zwischenobjekt anpassen”.

Nächste Seiten

Score- und Note-Details

Frame-Längen-Berechnung und JSON-Verwaltungsmuster.

Native Song

Verwenden Sie denselben Score im Native-Modus über FFI.

Verwendung von VOICEVOX Core für PHP

Ablauf der Sprachsynthese mit der Core-Library allein.
Zuletzt geändert am 13. Juli 2026