{"id":13552194,"url":"https://github.com/dlutton/flutter_tts","last_synced_at":"2025-05-14T09:06:24.827Z","repository":{"id":39659978,"uuid":"128891912","full_name":"dlutton/flutter_tts","owner":"dlutton","description":"Flutter Text to Speech package","archived":false,"fork":false,"pushed_at":"2025-01-29T03:18:47.000Z","size":67062,"stargazers_count":672,"open_issues_count":174,"forks_count":274,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-05-14T09:04:54.232Z","etag":null,"topics":["android","dart","flutter","flutter-plugin","google","ios","java","kotlin","macos","swift","text-to-speech","tts","web","windows"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dlutton.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["dlutton"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2018-04-10T07:27:56.000Z","updated_at":"2025-05-13T08:16:06.000Z","dependencies_parsed_at":"2023-11-26T03:27:35.381Z","dependency_job_id":"e7cd92c1-a7f3-4414-b568-efaf46a8d27c","html_url":"https://github.com/dlutton/flutter_tts","commit_stats":{"total_commits":420,"total_committers":55,"mean_commits":7.636363636363637,"dds":0.6166666666666667,"last_synced_commit":"48eba562d66bf99b3fe3a0fc51d634f9aff7e2e1"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlutton%2Fflutter_tts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlutton%2Fflutter_tts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlutton%2Fflutter_tts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlutton%2Fflutter_tts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dlutton","download_url":"https://codeload.github.com/dlutton/flutter_tts/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254110374,"owners_count":22016391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","dart","flutter","flutter-plugin","google","ios","java","kotlin","macos","swift","text-to-speech","tts","web","windows"],"created_at":"2024-08-01T12:02:00.387Z","updated_at":"2025-05-14T09:06:24.805Z","avatar_url":"https://github.com/dlutton.png","language":"Dart","readme":"# Text To Speech\n\n[![pub package](https://img.shields.io/pub/v/flutter_tts.svg?style=for-the-badge\u0026colorB=green)](https://pub.dartlang.org/packages/flutter_tts)\n\nA flutter text to speech plugin (Swift,Kotlin)\n\n## Features\n\n- [x] Android, iOS, Web, Windows \u0026 macOS\n  - [x] speak\n  - [x] stop\n  - [x] get languages\n  - [x] set language\n  - [x] set speech rate\n  - [x] set speech volume\n  - [x] set speech pitch\n  - [x] get voices\n  - [x] set voice\n- [x] Android, iOS, Web \u0026 macOS\n  - [x] is language available\n- [x] Android, iOS, Web\n  - [x] speech marks (requires iOS 7+, Android 26+, and default voice engine for web)\n- [x] Android, iOS\n  - [x] synthesize to file (requires iOS 13+)\n- [x] Android, iOS, Web, \u0026 Windows\n  - [x] pause\n- [x] Android\n  - [x] set silence\n  - [x] is language installed\n  - [x] are languages installed\n  - [x] get engines\n  - [x] set engine\n  - [x] get default engine\n  - [x] get default voice\n  - [x] set queue mode\n  - [x] get max speech input length\n- [x] iOS\n  - [x] set shared instance\n  - [x] set audio session category\n\n## Usage\n\n## macOS\n\n```bash\nOSX version: 10.15\n```\n\n[Example App](https://github.com/dlutton/flutter_tts/tree/macOS_app) from the macOS_app branch\n\n## Web\n\n[Website](https://dlutton.github.io/flutter_tts) from the example directory.\n\n**Progress updates on Web**\n\nProgress updates are only supported for native speech synsthesis. Use the default engine to ensure support for progress updates. [Chromium#41195426](https://issues.chromium.org/issues/41195426#comment8)\n\n## Android\n\nChange the minimum Android sdk version to 21 (or higher) in your `android/app/build.gradle` file.\n\n```groovy\nminSdkVersion 21\n```\n\n**Update the Kotlin Gradle Plugin Version**\n\nChange the verision of the Kotlin Gradle plugin to `1.9.10`. \u003cbr\u003e\nIf 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`:\n```groovy\next.kotlin_version = '1.9.10'\n```\n\nOtherwise go to `android/settings.gradle` and update the verion of the plugin `org.jetbrains.kotlin.android`:\n```groovy\nid \"org.jetbrains.kotlin.android\" version \"1.9.10\" apply false\n```\n\n\nApps targeting Android 11 that use text-to-speech should\ndeclare [`TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE`](https://developer.android.com/reference/android/speech/tts/TextToSpeech.Engine#INTENT_ACTION_TTS_SERVICE)\nin the `queries` elements of their manifest.\n\n```xml\n\u003cqueries\u003e\n  \u003cintent\u003e\n    \u003caction android:name=\"android.intent.action.TTS_SERVICE\" /\u003e\n  \u003c/intent\u003e\n\u003c/queries\u003e\n```\n\n### Pausing on Android\n\nAndroid 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 \u003e= 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.\n\n```dart\nawait flutterTts.pause()\n```\n\n## iOS\n\nThere's a known issue with integrating plugins that use Swift into a Flutter project created with the Objective-C template. [Flutter#16049](https://github.com/flutter/flutter/issues/16049)\n\n[Example](https://github.com/dlutton/flutter_tts/blob/master/example/lib/main.dart)\n\nTo use this plugin :\n\n- add the dependency to your [pubspec.yaml](https://github.com/dlutton/flutter_tts/blob/master/example/pubspec.yaml) file.\n\n```yaml\n  dependencies:\n    flutter:\n      sdk: flutter\n    flutter_tts:\n```\n\n- instantiate FlutterTts\n\n```dart\nFlutterTts flutterTts = FlutterTts();\n\n```\n\nTo set shared audio [instance](https://developer.apple.com/documentation/avfoundation/avaudiosession/1616504-sharedinstance) (iOS only):\n\n```dart\nawait flutterTts.setSharedInstance(true);\n```\n\nTo set audio [category and options](https://developer.apple.com/documentation/avfoundation/avaudiosession) with optional [mode](https://developer.apple.com/documentation/avfaudio/avaudiosession/mode) (iOS only). The following setup allows background music and in-app audio session to continue simultaneously:\n\n```dart\nawait flutterTts.setIosAudioCategory(IosTextToSpeechAudioCategory.ambient,\n     [\n          IosTextToSpeechAudioCategoryOptions.allowBluetooth,\n          IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP,\n          IosTextToSpeechAudioCategoryOptions.mixWithOthers\n     ],\n     IosTextToSpeechAudioMode.voicePrompt\n);\n```\n\nTo await speak completion.\n\n```dart\nawait flutterTts.awaitSpeakCompletion(true);\n```\n\nTo await synthesize to file completion.\n\n```dart\nawait flutterTts.awaitSynthCompletion(true);\n```\n\n### speak, stop, getLanguages, setLanguage, setSpeechRate, getVoices, setVoice, setVolume, setPitch, isLanguageAvailable, setSharedInstance\n\n```dart\nFuture _speak() async{\n    var result = await flutterTts.speak(\"Hello World\");\n    if (result == 1) setState(() =\u003e ttsState = TtsState.playing);\n}\n\nFuture _stop() async{\n    var result = await flutterTts.stop();\n    if (result == 1) setState(() =\u003e ttsState = TtsState.stopped);\n}\n\nList\u003cdynamic\u003e languages = await flutterTts.getLanguages;\n\nawait flutterTts.setLanguage(\"en-US\");\n\nawait flutterTts.setSpeechRate(1.0);\n\nawait flutterTts.setVolume(1.0);\n\nawait flutterTts.setPitch(1.0);\n\nawait flutterTts.isLanguageAvailable(\"en-US\");\n\n// iOS, Android and Web only\n//see the \"Pausing on Android\" section for more info\nawait flutterTts.pause();\n\n// iOS, macOS, and Android only\n// The last parameter is an optional boolean value for isFullPath (defaults to false)\nawait flutterTts.synthesizeToFile(\"Hello World\", Platform.isAndroid ? \"tts.wav\" : \"tts.caf\", false);\n\n// Each voice is a Map containing at least these keys: name, locale\n// - Windows (UWP voices) only: gender, identifier\n// - iOS, macOS only: quality, gender, identifier\n// - Android only: quality, latency, network_required, features \nList\u003cMap\u003e voices = await flutterTts.getVoices;\n\nawait flutterTts.setVoice({\"name\": \"Karen\", \"locale\": \"en-AU\"});\n// iOS, macOS only\nawait flutterTts.setVoice({\"identifier\": \"com.apple.voice.compact.en-AU.Karen\"});\n\n// iOS only\nawait flutterTts.setSharedInstance(true);\n\n// Android only\nawait flutterTts.speak(\"Hello World\", focus: true);\n\nawait flutterTts.setSilence(2);\n\nawait flutterTts.getEngines;\n\nawait flutterTts.getDefaultVoice;\n\nawait flutterTts.isLanguageInstalled(\"en-AU\");\n\nawait flutterTts.areLanguagesInstalled([\"en-AU\", \"en-US\"]);\n\nawait flutterTts.setQueueMode(1);\n\nawait flutterTts.getMaxSpeechInputLength;\n\nawait flutterTts.setAudioAttributesForNavigation();\n```\n\n### Listening for platform calls\n\n```dart\nflutterTts.setStartHandler(() {\n  setState(() {\n    ttsState = TtsState.playing;\n  });\n});\n\nflutterTts.setCompletionHandler(() {\n  setState(() {\n    ttsState = TtsState.stopped;\n  });\n});\n\nflutterTts.setProgressHandler((String text, int startOffset, int endOffset, String word) {\n  setState(() {\n    _currentWord = word;\n  });\n});\n\nflutterTts.setErrorHandler((msg) {\n  setState(() {\n    ttsState = TtsState.stopped;\n  });\n});\n\nflutterTts.setCancelHandler((msg) {\n  setState(() {\n    ttsState = TtsState.stopped;\n  });\n});\n\n// Android, iOS and Web\nflutterTts.setPauseHandler((msg) {\n  setState(() {\n    ttsState = TtsState.paused;\n  });\n});\n\nflutterTts.setContinueHandler((msg) {\n  setState(() {\n    ttsState = TtsState.continued;\n  });\n});\n\n```\n\n## Getting Started\n\nFor help getting started with Flutter, view our online\n[documentation](https://flutter.dev/).\n\nFor help on editing plugin code, view the [documentation](https://flutter.dev/platform-plugins/#edit-code).\n","funding_links":["https://github.com/sponsors/dlutton"],"categories":["Dart"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdlutton%2Fflutter_tts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdlutton%2Fflutter_tts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdlutton%2Fflutter_tts/lists"}