Text To Speech
A flutter text to speech plugin (Swift,Kotlin)
Features
x
Android, iOS, Web, Windows & macOSx
speakx
stopx
get languagesx
set languagex
set speech ratex
set speech volumex
set speech pitchx
get voicesx
set voice
x
Android, iOS, Web & macOSx
is language available
x
Android, iOS, Webx
speech marks (requires iOS 7+, Android 26+, and default voice engine for web)
x
Android, iOSx
synthesize to file (requires iOS 13+)
x
Android, iOS, Web, & Windowsx
pause
x
Androidx
set silencex
is language installedx
are languages installedx
get enginesx
set enginex
get default enginex
get default voicex
set queue modex
get max speech input length
x
iOSx
set shared instancex
set audio session category
Usage
macOS
OSX version: 10.15
Example App from the macOS_app branch
Web
Website from the example directory.
Progress updates on Web
Progress updates are only supported for native speech synsthesis. Use the default engine to ensure support for progress updates. Chromium#41195426
Android
Change the minimum Android sdk version to 21 (or higher) in your android/app/build.gradle
file.
minSdkVersion 21
Update the Kotlin Gradle Plugin Version
Change the verision of the Kotlin Gradle plugin to 1.9.10
.
If your project was created with a version of Flutter before 3.19, go to the android/build.gradle
file and update the ext.kotlin_version
:
ext.kotlin_version = '1.9.10'
Otherwise go to android/settings.gradle
and update the verion of the plugin org.jetbrains.kotlin.android
:
id "org.jetbrains.kotlin.android" version "1.9.10" apply false
Apps targeting Android 11 that use text-to-speech should
declare TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE
in the queries
elements of their manifest.
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
Pausing on Android
Android TTS does not support the pause function natively, so we have implemented a work around. We utilize the native onRangeStart()
method to determine the index of start when pause
is invoked. We use that index to create a new text the next time speak
is invoked. Due to using onRangeStart()
, pause works on SDK versions >= 26. Also, if using start
and end
offsets inside of setProgressHandler()
, you'll need to keep a track of them if using pause
since they will update once the new text is created when speak
is called after being paused.
await flutterTts.pause()
iOS
There's a known issue with integrating plugins that use Swift into a Flutter project created with the Objective-C template. Flutter#16049
To use this plugin :
- add the dependency to your pubspec.yaml file.
dependencies:
flutter:
sdk: flutter
flutter_tts:
- instantiate FlutterTts
FlutterTts flutterTts = FlutterTts();
To set shared audio instance (iOS only):
await flutterTts.setSharedInstance(true);
To set audio category and options with optional mode (iOS only). The following setup allows background music and in-app audio session to continue simultaneously:
await flutterTts.setIosAudioCategory(IosTextToSpeechAudioCategory.ambient,
[
IosTextToSpeechAudioCategoryOptions.allowBluetooth,
IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP,
IosTextToSpeechAudioCategoryOptions.mixWithOthers
],
IosTextToSpeechAudioMode.voicePrompt
);
To await speak completion.
await flutterTts.awaitSpeakCompletion(true);
To await synthesize to file completion.
await flutterTts.awaitSynthCompletion(true);
speak, stop, getLanguages, setLanguage, setSpeechRate, getVoices, setVoice, setVolume, setPitch, isLanguageAvailable, setSharedInstance
Future _speak() async{
var result = await flutterTts.speak("Hello World");
if (result == 1) setState(() => ttsState = TtsState.playing);
}
Future _stop() async{
var result = await flutterTts.stop();
if (result == 1) setState(() => ttsState = TtsState.stopped);
}
List<dynamic> languages = await flutterTts.getLanguages;
await flutterTts.setLanguage("en-US");
await flutterTts.setSpeechRate(1.0);
await flutterTts.setVolume(1.0);
await flutterTts.setPitch(1.0);
await flutterTts.isLanguageAvailable("en-US");
// iOS, Android and Web only
//see the "Pausing on Android" section for more info
await flutterTts.pause();
// iOS, macOS, and Android only
// The last parameter is an optional boolean value for isFullPath (defaults to false)
await flutterTts.synthesizeToFile("Hello World", Platform.isAndroid ? "tts.wav" : "tts.caf", false);
// Each voice is a Map containing at least these keys: name, locale
// - Windows (UWP voices) only: gender, identifier
// - iOS, macOS only: quality, gender, identifier
// - Android only: quality, latency, network_required, features
List<Map> voices = await flutterTts.getVoices;
await flutterTts.setVoice({"name": "Karen", "locale": "en-AU"});
// iOS, macOS only
await flutterTts.setVoice({"identifier": "com.apple.voice.compact.en-AU.Karen"});
// iOS only
await flutterTts.setSharedInstance(true);
// Android only
await flutterTts.speak("Hello World", focus: true);
await flutterTts.setSilence(2);
await flutterTts.getEngines;
await flutterTts.getDefaultVoice;
await flutterTts.isLanguageInstalled("en-AU");
await flutterTts.areLanguagesInstalled(["en-AU", "en-US"]);
await flutterTts.setQueueMode(1);
await flutterTts.getMaxSpeechInputLength;
await flutterTts.setAudioAttributesForNavigation();
Listening for platform calls
flutterTts.setStartHandler(() {
setState(() {
ttsState = TtsState.playing;
});
});
flutterTts.setCompletionHandler(() {
setState(() {
ttsState = TtsState.stopped;
});
});
flutterTts.setProgressHandler((String text, int startOffset, int endOffset, String word) {
setState(() {
_currentWord = word;
});
});
flutterTts.setErrorHandler((msg) {
setState(() {
ttsState = TtsState.stopped;
});
});
flutterTts.setCancelHandler((msg) {
setState(() {
ttsState = TtsState.stopped;
});
});
// Android, iOS and Web
flutterTts.setPauseHandler((msg) {
setState(() {
ttsState = TtsState.paused;
});
});
flutterTts.setContinueHandler((msg) {
setState(() {
ttsState = TtsState.continued;
});
});
Getting Started
For help getting started with Flutter, view our online documentation.
For help on editing plugin code, view the documentation.