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.