Skip to main content

Playback

Playback is optional. generate() works without a player; speak() and play() require one.

Expo Audio​

import * as ExpoAudio from 'expo-audio';
import {KittenTTS, createExpoAudioPlayer} from '@kittentts/react-native';

const tts = await KittenTTS.create({
player: createExpoAudioPlayer(ExpoAudio),
});

await tts.speak('This plays through Expo Audio.');

React Native Sound​

import Sound from 'react-native-sound';
import {KittenTTS, createRNSoundPlayer} from '@kittentts/react-native';

const tts = await KittenTTS.create({
player: createRNSoundPlayer(Sound),
});

Generate, then play​

const result = await tts.generate('Prepare the UI before playback.');

await tts.play(result, {
onPlaybackStart: () => {
startHighlighting(result.wordTimings);
},
});

onPlaybackStart should represent actual playback start, not the moment a temporary WAV begins loading.

Custom player​

Implement the package AudioPlayer interface when your app already owns an audio pipeline. The adapter receives Float32 PCM and a 24 kHz sample rate, plus playback callbacks. Its promise should resolve after playback finishes when sequential behavior matters.

Browser​

createBrowserAudioPlayer() encodes the result and plays it through browser audio. Browser autoplay policies still apply, so begin playback from a click or tap when required.