@mhpdev/react-native-speech
Version:
A high-performance React Native library for text-to-speech on iOS and Android
230 lines (227 loc) • 8.13 kB
text/typescript
import TurboSpeech from './NativeSpeech';
import type {VoiceProps, VoiceOptions, EngineProps} from './NativeSpeech';
export default class Speech {
/**
* The *maximum number of characters allowed in a single call to the speak methods.
*
* On `Android`, this value is determined by `TextToSpeech.getMaxSpeechInputLength`.
* Text exceeding this length must be manually split into smaller utterances on the JavaScript side.
*
* On `iOS`, there is no synthesis system limit, and by default, the speech class returns `Number.MAX_VALUE`.
*/
static readonly maxInputLength =
TurboSpeech.getConstants().maxInputLength ?? Number.MAX_VALUE;
/**
* Gets a list of all available voices on the device
* @param language - Optional language code to filter voices (e.g., 'en', 'fr', 'en-US', 'fr-FR').
* If not provided, returns all available voices.
* @returns Promise<VoiceProps[]> Array of voice properties matching the language filter
* @example
* // Get all available voices
* const allVoices = await Speech.getAvailableVoices();
* // Get only English voices
* const englishVoices = await Speech.getAvailableVoices('en-US');
* // or
* const englishVoices = await Speech.getAvailableVoices('en');
*/
public static getAvailableVoices(language?: string): Promise<VoiceProps[]> {
return TurboSpeech.getAvailableVoices(language ?? '');
}
/**
* Gets a list of all available text-to-speech engines on the device
* @returns Promise<EngineProps[]> Array of engine properties including name, label, and isDefault flag
* @platform Android
* @example
* const engines = await Speech.getEngines();
* engines.forEach(engine => {
* console.log(`Engine: ${engine.label} (${engine.name})`);
* if (engine.isDefault) {
* console.log('This is the default engine');
* }
* });
*/
public static getEngines(): Promise<EngineProps[]> {
return TurboSpeech.getEngines();
}
/**
* Sets the text-to-speech engine to use for speech synthesis
* @param engineName - The name of the engine to use (obtained from getEngines())
* @returns Promise<void> Resolves when engine is set
* @platform Android
* @example
* // First, get available engines
* const engines = await Speech.getEngines();
* // Then set a specific engine
* await Speech.setEngine(engines[0].name);
* // Or set by known engine name
* await Speech.setEngine('com.google.android.tts');
*/
public static setEngine(engineName: string): Promise<void> {
return TurboSpeech.setEngine(engineName);
}
/**
* Opens the system UI to install or update TTS voice data.
* @returns Promise<void> Resolves when the installer activity has been launched.
* @throws If the installer activity cannot be opened on the device.
* @platform Android
*/
public static openVoiceDataInstaller(): Promise<void> {
return TurboSpeech.openVoiceDataInstaller();
}
/**
* Sets the global options for all subsequent speak() calls
* @param options - Voice configuration options
* @example
* Speech.initialize({
* pitch: 1.2,
* rate: 0.8,
* volume: 1.0,
* language: 'en-US'
* });
*/
public static initialize(options: VoiceOptions): void {
TurboSpeech.initialize(options);
}
/**
* Resets all speech options to their default values
* @example
* Speech.reset();
*/
public static reset(): void {
TurboSpeech.reset();
}
/**
* Immediately stops any ongoing or in queue speech synthesis
* @returns Promise<void> Resolves when speech is stopped
* @example
* await Speech.stop();
*/
public static stop(): Promise<void> {
return TurboSpeech.stop();
}
/**
* Pauses the current speech at the next word boundary
* @note on Android, API 26+ required due to missing onRangeStart support
* @returns Promise<boolean> Resolves to true if speech was paused, false if nothing to pause
* @example
* const isPaused = await Speech.pause();
* console.log(isPaused ? 'Speech paused' : 'Nothing to pause');
*/
public static pause(): Promise<boolean> {
return TurboSpeech.pause();
}
/**
* Resumes previously paused speech
* @note on Android, API 26+ required due to missing onRangeStart support
* @returns Promise<boolean> Resolves to true if speech was resumed, false if nothing to resume
* @example
* const isResumed = await Speech.resume();
* console.log(isResumed ? 'Speech resumed' : 'Nothing to resume');
*/
public static resume(): Promise<boolean> {
return TurboSpeech.resume();
}
/**
* Checks if speech is currently being synthesized
* @returns Promise<boolean> Resolves to true if speaking or paused, false otherwise
* @example
* const speaking = await Speech.isSpeaking();
* console.log(speaking ? 'Speaking' : 'Not speaking');
*/
public static isSpeaking(): Promise<boolean> {
return TurboSpeech.isSpeaking();
}
/**
* Speaks text using current global options
* @param text - The text to synthesize
* @returns Promise<void> Resolves when speech completes
* @throws If text is null or undefined
* @example
* await Speech.speak('Hello, world!');
*/
public static speak(text: string): Promise<void> {
return TurboSpeech.speak(text);
}
/**
* Speaks text with custom options for this utterance only. Uses global options for any settings not provided.
* @param text - The text to synthesize
* @param options - Voice options overriding global settings
* @returns Promise<void> Resolves when speech completes
* @throws If text is null or undefined
* @example
* await Speech.speakWithOptions('Hello!', {
* pitch: 1.5,
* rate: 0.8,
* language: 'en-US'
* });
*/
public static speakWithOptions(
text: string,
options: VoiceOptions,
): Promise<void> {
return TurboSpeech.speakWithOptions(text, options);
}
/**
* Called when an error occurs during speech synthesis
* @example
* // Add listener
* const subscription = Speech.onError(({id}) => console.log('Speech error', id));
* // Later, cleanup when no longer needed
* subscription.remove();
*/
public static onError = TurboSpeech.onError;
/**
* Called when speech synthesis begins
* @example
* // Add listener
* const subscription = Speech.onStart(({id}) => console.log('Started speaking', id));
* // Later, cleanup when no longer needed
* subscription.remove();
*/
public static onStart = TurboSpeech.onStart;
/**
* Called when speech synthesis completes successfully
* @example
* const subscription = Speech.onFinish(({id}) => console.log('Finished speaking', id));
* // Cleanup
* subscription.remove();
*/
public static onFinish = TurboSpeech.onFinish;
/**
* Called when speech is paused
* @note on Android, API 26+ required due to missing onRangeStart support
* @example
* const subscription = Speech.onPause(({id}) => console.log('Speech paused', id));
* // Cleanup
* subscription.remove();
*/
public static onPause = TurboSpeech.onPause;
/**
* Called when speech is resumed
* @note on Android, API 26+ required due to missing onRangeStart support
* @example
* const subscription = Speech.onResume(({id}) => console.log('Speech resumed', id));
* // Cleanup
* subscription.remove();
*/
public static onResume = TurboSpeech.onResume;
/**
* Called when speech is stopped
* @example
* const subscription = Speech.onStopped(({id}) => console.log('Speech stopped', id));
* // Cleanup
* subscription.remove();
*/
public static onStopped = TurboSpeech.onStopped;
/**
* Called during speech with progress information
* @note on Android, API 26+ required due to missing onRangeStart support
* @example
* const subscription = Speech.onProgress(progress => {
* console.log(`Speaking progress`, progress);
* });
* // Cleanup when component unmounts or listener is no longer needed
* subscription.remove();
*/
public static onProgress = TurboSpeech.onProgress;
}