Skip to main content

Playback and queues

KittenTTS separates synthesis from playback. Implement AudioPlayer using audioplayers, just_audio, a platform channel, or your existing audio system.

class MyAudioPlayer implements AudioPlayer {

Future<void> play(
Float32List samples,
int sampleRate, {
AudioPlayOptions options = const AudioPlayOptions(),
}) async {
options.onPlaybackStart?.call();
final wav = WAVEncoder.encode(samples, sampleRate);
await playWavBytes(wav);
}


Future<void> stop() async {}


Future<void> pause() async {}


Future<void> resume() async {}


bool get isPlaying => false;
}
final tts = await KittenTTS.create(player: MyAudioPlayer());
await tts.speak('This plays through the configured player.');

Generate, then play

final result = await tts.generate('Prepare the UI first.');
await tts.play(result, AudioPlayOptions(onPlaybackStart: beginHighlighting));

FIFO queue

final queue = tts.createPlaybackQueue();

await queue.enqueue(firstResult);
await queue.enqueueText('Generate this when it reaches the front.', voice: 'luna');

clear() rejects pending items. stop() clears pending items and stops active playback. A custom player's play() future should complete after playback, not after loading, so queue order remains strict.