A flutter text to speech plugin (Swift,Kotlin)
- Android, iOS, Web, Windows & macOS
- speak
- stop
- get languages
- set language
- set speech rate
- set speech volume
- set speech pitch
- Android, iOS, Web & macOS
- is language available
- Android, iOS, macOS, Web, & Windows
- get voices
- set voice
- Android, iOS
- speech marks (requires iOS 7+ and Android 26+)
- synthesize to file (requires iOS 13+)
- Android, iOS, Web, & Windows
- pause
- Android
- set silence
- is language installed
- are languages installed
- get engines
- set engine
- get default engine
- get default voice
- set queue mode
- get max speech input length
- iOS
- set shared instance
- set audio session category
OSX version: 10.15
Example App from the macOS_app branch
Website from the example directory.
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>
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()
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
// - 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();
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;
});
});
For help getting started with Flutter, view our online documentation.
For help on editing plugin code, view the documentation.