From ad1081e63139e8f2a78c90b8c46e3ffebe8bc7a7 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Fri, 15 Nov 2024 17:59:37 +0900 Subject: [PATCH] [flutter_tts] Update flutter_tts to 4.2.0 Update flutter_tts 3.6.3 to 4.2.0. Update the example app. Add isLanguageAvailable API which was not implemented. --- packages/flutter_tts/CHANGELOG.md | 6 +- packages/flutter_tts/README.md | 4 +- packages/flutter_tts/example/lib/main.dart | 63 ++++++++++--------- packages/flutter_tts/example/pubspec.yaml | 2 +- packages/flutter_tts/pubspec.yaml | 2 +- .../tizen/src/flutter_tts_tizen_plugin.cc | 13 ++++ .../flutter_tts/tizen/src/text_to_speech.cc | 12 ++++ .../flutter_tts/tizen/src/text_to_speech.h | 2 + 8 files changed, 71 insertions(+), 33 deletions(-) diff --git a/packages/flutter_tts/CHANGELOG.md b/packages/flutter_tts/CHANGELOG.md index ec827b00c..6822bf291 100644 --- a/packages/flutter_tts/CHANGELOG.md +++ b/packages/flutter_tts/CHANGELOG.md @@ -1,6 +1,10 @@ -## NEXT +## 1.5.0 * Update minimum Flutter and Dart version to 3.13 and 3.1. +* Update flutter_tts 3.6.3 to 4.2.0. +* Update the example app. +* Add isLanguageAvailable API which was not implemented. + ## 1.4.0 diff --git a/packages/flutter_tts/README.md b/packages/flutter_tts/README.md index f2a6700a3..2ac5beebb 100644 --- a/packages/flutter_tts/README.md +++ b/packages/flutter_tts/README.md @@ -10,8 +10,8 @@ This package is not an _endorsed_ implementation of `flutter_tts`. Therefore, yo ```yaml dependencies: - flutter_tts: ^3.6.3 - flutter_tts_tizen: ^1.4.0 + flutter_tts: ^4.2.0 + flutter_tts_tizen: ^1.5.0 ``` Then you can import `flutter_tts` in your Dart code: diff --git a/packages/flutter_tts/example/lib/main.dart b/packages/flutter_tts/example/lib/main.dart index ac268321c..7e9d926be 100644 --- a/packages/flutter_tts/example/lib/main.dart +++ b/packages/flutter_tts/example/lib/main.dart @@ -24,10 +24,10 @@ class _MyAppState extends State { TtsState ttsState = TtsState.stopped; - get isPlaying => ttsState == TtsState.playing; - get isStopped => ttsState == TtsState.stopped; - get isPaused => ttsState == TtsState.paused; - get isContinued => ttsState == TtsState.continued; + bool get isPlaying => ttsState == TtsState.playing; + bool get isStopped => ttsState == TtsState.stopped; + bool get isPaused => ttsState == TtsState.paused; + bool get isContinued => ttsState == TtsState.continued; @override initState() { @@ -35,7 +35,7 @@ class _MyAppState extends State { initTts(); } - initTts() { + dynamic initTts() { flutterTts = FlutterTts(); _setAwaitOptions(); @@ -85,16 +85,16 @@ class _MyAppState extends State { }); } - Future _getLanguages() => flutterTts.getLanguages; + Future _getLanguages() async => await flutterTts.getLanguages; - Future _getDefaultVoice() async { + Future _getDefaultVoice() async { var voice = await flutterTts.getDefaultVoice; if (voice != null) { print(voice); } } - Future _speak() async { + Future _speak() async { await flutterTts.setVolume(volume); await flutterTts.setSpeechRate(rate); @@ -105,16 +105,16 @@ class _MyAppState extends State { } } - Future _setAwaitOptions() async { + Future _setAwaitOptions() async { await flutterTts.awaitSpeakCompletion(true); } - Future _stop() async { + Future _stop() async { var result = await flutterTts.stop(); if (result == 1) setState(() => ttsState = TtsState.stopped); } - Future _pause() async { + Future _pause() async { var result = await flutterTts.pause(); if (result == 1) setState(() => ttsState = TtsState.paused); } @@ -126,16 +126,19 @@ class _MyAppState extends State { } List> getLanguageDropDownMenuItems( - dynamic languages) { + List languages) { var items = >[]; for (dynamic type in languages) { items.add(DropdownMenuItem( - value: type as String?, child: Text(type as String))); + value: type as String?, child: Text((type as String)))); } return items; } - void changedLanguageDropDownItem(String? selectedType) { + void changedLanguageDropDownItem(String? selectedType) async { + var result = await flutterTts.isLanguageAvailable(selectedType!); + if (result == 0) return; + setState(() { language = selectedType; flutterTts.setLanguage(language!); @@ -175,23 +178,27 @@ class _MyAppState extends State { future: _getLanguages(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { - return _languageDropDownSection(snapshot.data); + return _languageDropDownSection(snapshot.data as List); } else if (snapshot.hasError) { return Text('Error loading languages...'); } else return Text('Loading Languages...'); }); - Widget _inputSection() => Container( - alignment: Alignment.topCenter, - padding: EdgeInsets.only(top: 25.0, left: 25.0, right: 25.0), - child: TextField( - maxLines: 11, - minLines: 6, - onChanged: (String value) { - _onChange(value); - }, - )); + Widget _inputSection() { + _newVoiceText = 'Hello everyone. This is a flutter tts example app.'; + return Container( + alignment: Alignment.topCenter, + padding: EdgeInsets.only(top: 25.0, left: 25.0, right: 25.0), + child: TextField( + maxLines: 11, + minLines: 6, + onChanged: (String value) { + _onChange(value); + }, + controller: TextEditingController(text: _newVoiceText), + )); + } Widget _btnSection() { return Container( @@ -210,7 +217,7 @@ class _MyAppState extends State { ); } - Widget _languageDropDownSection(dynamic languages) => Container( + Widget _languageDropDownSection(List languages) => Container( padding: EdgeInsets.only(top: 10.0), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ DropdownButton( @@ -272,7 +279,7 @@ class _MyAppState extends State { min: 0.0, max: 1.0, divisions: 10, - label: "Volume: $volume"); + label: "Volume: ${volume.toStringAsFixed(1)}"); } Widget _rate() { @@ -284,7 +291,7 @@ class _MyAppState extends State { min: 0.0, max: 1.0, divisions: 10, - label: "Rate: $rate", + label: "Rate: ${rate.toStringAsFixed(1)}", activeColor: Colors.green, ); } diff --git a/packages/flutter_tts/example/pubspec.yaml b/packages/flutter_tts/example/pubspec.yaml index b383496ce..a5e126241 100644 --- a/packages/flutter_tts/example/pubspec.yaml +++ b/packages/flutter_tts/example/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: flutter: sdk: flutter - flutter_tts: ^3.6.3 + flutter_tts: ^4.2.0 flutter_tts_tizen: path: ../ diff --git a/packages/flutter_tts/pubspec.yaml b/packages/flutter_tts/pubspec.yaml index f2ee10183..107909294 100644 --- a/packages/flutter_tts/pubspec.yaml +++ b/packages/flutter_tts/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_tts_tizen description: The Tizen implementation of flutter_tts plugin. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/flutter_tts -version: 1.4.0 +version: 1.5.0 environment: sdk: ">=3.1.0 <4.0.0" diff --git a/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc b/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc index 0e1153cd5..c36a3924d 100644 --- a/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc +++ b/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc @@ -110,6 +110,8 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { OnGetMaxSpeechInputLength(); } else if (method_name == "setVolume") { OnSetVolume(arguments); + } else if (method_name == "isLanguageAvailable") { + OnIsLanguageAvailable(arguments); } else { result_->NotImplemented(); } @@ -236,6 +238,17 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { SendResult(flutter::EncodableValue(0)); } + void OnIsLanguageAvailable(const flutter::EncodableValue &arguments) { + if (std::holds_alternative(arguments)) { + std::string language = std::move(std::get(arguments)); + if (!language.empty() && tts_->IsLanguageAvailable(language)) { + SendResult(flutter::EncodableValue(1)); + return; + } + } + SendResult(flutter::EncodableValue(0)); + } + void SendResult(const flutter::EncodableValue &result) { if (result_) { result_->Success(result); diff --git a/packages/flutter_tts/tizen/src/text_to_speech.cc b/packages/flutter_tts/tizen/src/text_to_speech.cc index 095fa6029..8ac294661 100644 --- a/packages/flutter_tts/tizen/src/text_to_speech.cc +++ b/packages/flutter_tts/tizen/src/text_to_speech.cc @@ -245,6 +245,18 @@ bool TextToSpeech::GetSpeedRange(int32_t *min, int32_t *normal, int32_t *max) { return true; } +bool TextToSpeech::IsLanguageAvailable(const std::string &language) { + if (supported_lanaguages_.size() == 0) { + GetSupportedLanaguages(); + } + + if (std::find(supported_lanaguages_.begin(), supported_lanaguages_.end(), + language) != supported_lanaguages_.end()) { + return true; + } + return false; +} + void TextToSpeech::SwitchVolumeOnStateChange(tts_state_e previous, tts_state_e current) { if (previous == TTS_STATE_PLAYING) { diff --git a/packages/flutter_tts/tizen/src/text_to_speech.h b/packages/flutter_tts/tizen/src/text_to_speech.h index a860a548e..772b697f3 100644 --- a/packages/flutter_tts/tizen/src/text_to_speech.h +++ b/packages/flutter_tts/tizen/src/text_to_speech.h @@ -58,6 +58,8 @@ class TextToSpeech { bool SetVolume(double volume); + bool IsLanguageAvailable(const std::string &language); + bool GetSpeedRange(int32_t *min, int32_t *normal, int32_t *max); void SetTtsSpeed(int32_t speed) { tts_speed_ = speed; }