From 2469ec914ae32f262d4010ec3daf5fb43b00cfa3 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Fri, 15 Nov 2024 17:59:37 +0900 Subject: [PATCH 1/4] [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; } From f9bced9bc8c3a71881cb0abb8ba12e0950350faf Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Mon, 18 Nov 2024 16:30:55 +0900 Subject: [PATCH 2/4] [flutter_tts] Add getVoices and setVoice APIs --- packages/flutter_tts/CHANGELOG.md | 2 +- packages/flutter_tts/README.md | 3 + packages/flutter_tts/example/lib/main.dart | 11 ++- .../tizen/src/flutter_tts_tizen_plugin.cc | 57 +++++++++++++- .../flutter_tts/tizen/src/text_to_speech.cc | 78 ++++++++++++------- .../flutter_tts/tizen/src/text_to_speech.h | 15 +++- 6 files changed, 133 insertions(+), 33 deletions(-) diff --git a/packages/flutter_tts/CHANGELOG.md b/packages/flutter_tts/CHANGELOG.md index 6822bf291..b4cd97d5e 100644 --- a/packages/flutter_tts/CHANGELOG.md +++ b/packages/flutter_tts/CHANGELOG.md @@ -3,7 +3,7 @@ * 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. +* Add isLanguageAvailable, getVoices and setVoice APIs which were not implemented. ## 1.4.0 diff --git a/packages/flutter_tts/README.md b/packages/flutter_tts/README.md index 2ac5beebb..4d80b3067 100644 --- a/packages/flutter_tts/README.md +++ b/packages/flutter_tts/README.md @@ -31,6 +31,9 @@ The features supported by Tizen are as follows. Other features are not supported - [x] pause - [x] get languages - [x] set language + - [x] is language available + - [x] get voices + - [x] set voice - [x] set speech rate - [x] set speech volume (requires privilege `http://tizen.org/privilege/volume.set` in `tizen_manifest.xml`) - [x] get default voice diff --git a/packages/flutter_tts/example/lib/main.dart b/packages/flutter_tts/example/lib/main.dart index 7e9d926be..4b3d7377a 100644 --- a/packages/flutter_tts/example/lib/main.dart +++ b/packages/flutter_tts/example/lib/main.dart @@ -42,6 +42,8 @@ class _MyAppState extends State { _getDefaultVoice(); + _getSupportedVoices(); + flutterTts.setStartHandler(() { setState(() { print("Playing"); @@ -90,7 +92,14 @@ class _MyAppState extends State { Future _getDefaultVoice() async { var voice = await flutterTts.getDefaultVoice; if (voice != null) { - print(voice); + print('_getDefaultVoice(): $voice'); + } + } + + Future _getSupportedVoices() async { + var voices = await flutterTts.getVoices; + if (voices != null) { + print('_getSupportedVoices(): $voices'); } } 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 c36a3924d..fef82d697 100644 --- a/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc +++ b/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -22,6 +23,19 @@ namespace { typedef flutter::MethodChannel FlMethodChannel; typedef flutter::MethodResult FlMethodResult; +template +bool GetValueFromEncodableMap(flutter::EncodableMap &map, std::string key, + T &out) { + auto iter = map.find(flutter::EncodableValue(key)); + if (iter != map.end() && !iter->second.IsNull()) { + if (auto pval = std::get_if(&iter->second)) { + out = *pval; + return true; + } + } + return false; +} + class FlutterTtsTizenPlugin : public flutter::Plugin { public: static void RegisterWithRegistrar(flutter::PluginRegistrar *registrar) { @@ -103,9 +117,13 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { } else if (method_name == "setLanguage") { OnSetLanguage(arguments); } else if (method_name == "getLanguages") { - OnGetLanguage(); + OnGetLanguages(); } else if (method_name == "getDefaultVoice") { OnGetDefaultVoice(); + } else if (method_name == "setVoice") { + OnSetVoice(arguments); + } else if (method_name == "getVoices") { + OnGetVoices(); } else if (method_name == "getMaxSpeechInputLength") { OnGetMaxSpeechInputLength(); } else if (method_name == "setVolume") { @@ -197,9 +215,11 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { SendResult(flutter::EncodableValue(0)); } - void OnGetLanguage() { + void OnGetLanguages() { + auto languages = tts_->GetSupportedLanaguages(); + flutter::EncodableList list; - for (auto language : tts_->GetSupportedLanaguages()) { + for (auto language : languages) { list.push_back(flutter::EncodableValue(language)); } SendResult(flutter::EncodableValue(list)); @@ -221,6 +241,37 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { SendResult(flutter::EncodableValue(default_voice_map)); } + void OnSetVoice(const flutter::EncodableValue &arguments) { + if (std::holds_alternative(arguments)) { + auto voice = std::get(arguments); + + std::string voice_name; + if (GetValueFromEncodableMap(voice, "name", voice_name)) { + tts_->SetDefaultVoiceType(voice_name); + SendResult(flutter::EncodableValue(1)); + return; + } + } + SendResult(flutter::EncodableValue(0)); + } + + void OnGetVoices() { + auto voices = tts_->GetSupportedVoiceTypes(); + + flutter::EncodableList list; + for (auto voice : voices) { + flutter::EncodableMap map; + map.insert(std::pair( + flutter::EncodableValue("name"), + flutter::EncodableValue(voice["name"]))); + map.insert(std::pair( + flutter::EncodableValue("locale"), + flutter::EncodableValue(voice["locale"]))); + list.push_back(flutter::EncodableValue(map)); + } + SendResult(flutter::EncodableValue(list)); + } + void OnGetMaxSpeechInputLength() { std::optional length = tts_->GetMaxSpeechInputLength(); SendResult(length.has_value() ? flutter::EncodableValue(*length) diff --git a/packages/flutter_tts/tizen/src/text_to_speech.cc b/packages/flutter_tts/tizen/src/text_to_speech.cc index 8ac294661..05aaf2fdd 100644 --- a/packages/flutter_tts/tizen/src/text_to_speech.cc +++ b/packages/flutter_tts/tizen/src/text_to_speech.cc @@ -10,6 +10,35 @@ namespace { +std::string GetVoiceName(int32_t voice_type) { + switch (voice_type) { + case TTS_VOICE_TYPE_AUTO: + return "auto"; + case TTS_VOICE_TYPE_MALE: + return "male"; + case TTS_VOICE_TYPE_FEMALE: + return "female"; + case TTS_VOICE_TYPE_CHILD: + return "child"; + default: + return "unknown"; + } +} + +int32_t GetVoiceType(std::string voice_name) { + if (voice_name == "auto") { + return TTS_VOICE_TYPE_AUTO; + } else if (voice_name == "male") { + return TTS_VOICE_TYPE_MALE; + } else if (voice_name == "female") { + return TTS_VOICE_TYPE_FEMALE; + } else if (voice_name == "child") { + return TTS_VOICE_TYPE_CHILD; + } else { + return -1; + } +} + TtsState ConvertTtsState(tts_state_e state) { switch (state) { case TTS_STATE_CREATED: @@ -44,6 +73,7 @@ bool TextToSpeech::Initialize() { RegisterCallbacks(); Prepare(); + InitializeSupportedLanaguagesAndVoiceType(); return true; } @@ -107,8 +137,8 @@ void TextToSpeech::UnregisterCallbacks() { tts_unset_error_cb(tts_); } -std::vector &TextToSpeech::GetSupportedLanaguages() { - if (supported_lanaguages_.size() == 0) { +void TextToSpeech::InitializeSupportedLanaguagesAndVoiceType() { + if (supported_lanaguages_.size() == 0 || supported_voice_types_.size() == 0) { tts_foreach_supported_voices( tts_, [](tts_h tts, const char *language, int32_t voice_type, @@ -117,9 +147,15 @@ std::vector &TextToSpeech::GetSupportedLanaguages() { return false; } TextToSpeech *self = static_cast(user_data); - self->supported_lanaguages_.push_back(std::string(language)); - LOG_INFO("Supported voice: language(%s), type(%d)", language, - voice_type); + self->supported_lanaguages_.push_back(language); + + std::map item; + item["name"] = GetVoiceName(voice_type); + item["locale"] = language; + self->supported_voice_types_.push_back(item); + + LOG_INFO("Supported language: %s, voice_type: %s", + item["locale"].c_str(), item["name"].c_str()); return true; }, this); @@ -127,8 +163,10 @@ std::vector &TextToSpeech::GetSupportedLanaguages() { supported_lanaguages_.erase( unique(supported_lanaguages_.begin(), supported_lanaguages_.end()), supported_lanaguages_.end()); + supported_voice_types_.erase( + unique(supported_voice_types_.begin(), supported_voice_types_.end()), + supported_voice_types_.end()); } - return supported_lanaguages_; } std::optional> @@ -147,25 +185,15 @@ TextToSpeech::GetDefaultVoice() { default_voice.first = language; free(language); } + default_voice.second = GetVoiceName(voice_type); + return default_voice; +} - switch (voice_type) { - case TTS_VOICE_TYPE_AUTO: - default_voice.second = "auto"; - break; - case TTS_VOICE_TYPE_MALE: - default_voice.second = "male"; - break; - case TTS_VOICE_TYPE_FEMALE: - default_voice.second = "female"; - break; - case TTS_VOICE_TYPE_CHILD: - default_voice.second = "child"; - break; - default: - default_voice.second = "unknown"; - break; +void TextToSpeech::SetDefaultVoiceType(const std::string &voice) { + int32_t voice_type = GetVoiceType(voice); + if (voice_type != -1) { + default_voice_type_ = voice_type; } - return default_voice; } std::optional TextToSpeech::GetMaxSpeechInputLength() { @@ -246,10 +274,6 @@ bool TextToSpeech::GetSpeedRange(int32_t *min, int32_t *normal, int32_t *max) { } 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; diff --git a/packages/flutter_tts/tizen/src/text_to_speech.h b/packages/flutter_tts/tizen/src/text_to_speech.h index 772b697f3..4aa430e23 100644 --- a/packages/flutter_tts/tizen/src/text_to_speech.h +++ b/packages/flutter_tts/tizen/src/text_to_speech.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -40,10 +41,21 @@ class TextToSpeech { default_language_ = language; } - std::vector &GetSupportedLanaguages(); + void InitializeSupportedLanaguagesAndVoiceType(); + + const std::vector &GetSupportedLanaguages() { + return supported_lanaguages_; + } + + const std::vector> & + GetSupportedVoiceTypes() { + return supported_voice_types_; + } std::optional> GetDefaultVoice(); + void SetDefaultVoiceType(const std::string &voice); + std::optional GetMaxSpeechInputLength(); std::optional GetState(); @@ -86,6 +98,7 @@ class TextToSpeech { int32_t system_volume_ = 0; int32_t system_max_volume_ = 0; std::vector supported_lanaguages_; + std::vector> supported_voice_types_; StateChangedCallback state_changed_callback_; UtteranceCompletedCallback utterance_completed_callback_; From e3dcd244d9db6cf5f1fe650168fe5980d06e4a8f Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Mon, 18 Nov 2024 16:42:44 +0900 Subject: [PATCH 3/4] Fix code format --- packages/flutter_tts/tizen/src/text_to_speech.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tts/tizen/src/text_to_speech.h b/packages/flutter_tts/tizen/src/text_to_speech.h index 4aa430e23..633cbaee3 100644 --- a/packages/flutter_tts/tizen/src/text_to_speech.h +++ b/packages/flutter_tts/tizen/src/text_to_speech.h @@ -47,8 +47,8 @@ class TextToSpeech { return supported_lanaguages_; } - const std::vector> & - GetSupportedVoiceTypes() { + const std::vector> + &GetSupportedVoiceTypes() { return supported_voice_types_; } From eb5cb55070c5807b0edaa445999b1b78f4301c2d Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Tue, 26 Nov 2024 15:53:50 +0900 Subject: [PATCH 4/4] Correct unnecessary code --- packages/flutter_tts/example/lib/main.dart | 25 ++++----- .../tizen/src/flutter_tts_tizen_plugin.cc | 8 +-- .../flutter_tts/tizen/src/text_to_speech.cc | 56 ++++++++----------- 3 files changed, 35 insertions(+), 54 deletions(-) diff --git a/packages/flutter_tts/example/lib/main.dart b/packages/flutter_tts/example/lib/main.dart index 4b3d7377a..8f95f460d 100644 --- a/packages/flutter_tts/example/lib/main.dart +++ b/packages/flutter_tts/example/lib/main.dart @@ -194,20 +194,17 @@ class _MyAppState extends State { return Text('Loading Languages...'); }); - 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 _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); + }, + controller: TextEditingController(text: _newVoiceText), + )); Widget _btnSection() { return Container( 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 fef82d697..44e2a4a28 100644 --- a/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc +++ b/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc @@ -216,10 +216,8 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { } void OnGetLanguages() { - auto languages = tts_->GetSupportedLanaguages(); - flutter::EncodableList list; - for (auto language : languages) { + for (auto language : tts_->GetSupportedLanaguages()) { list.push_back(flutter::EncodableValue(language)); } SendResult(flutter::EncodableValue(list)); @@ -256,10 +254,8 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { } void OnGetVoices() { - auto voices = tts_->GetSupportedVoiceTypes(); - flutter::EncodableList list; - for (auto voice : voices) { + for (auto voice : tts_->GetSupportedVoiceTypes()) { flutter::EncodableMap map; map.insert(std::pair( flutter::EncodableValue("name"), diff --git a/packages/flutter_tts/tizen/src/text_to_speech.cc b/packages/flutter_tts/tizen/src/text_to_speech.cc index 05aaf2fdd..ff70e2d9c 100644 --- a/packages/flutter_tts/tizen/src/text_to_speech.cc +++ b/packages/flutter_tts/tizen/src/text_to_speech.cc @@ -138,35 +138,26 @@ void TextToSpeech::UnregisterCallbacks() { } void TextToSpeech::InitializeSupportedLanaguagesAndVoiceType() { - if (supported_lanaguages_.size() == 0 || supported_voice_types_.size() == 0) { - tts_foreach_supported_voices( - tts_, - [](tts_h tts, const char *language, int32_t voice_type, - void *user_data) -> bool { - if (language == nullptr) { - return false; - } - TextToSpeech *self = static_cast(user_data); - self->supported_lanaguages_.push_back(language); - - std::map item; - item["name"] = GetVoiceName(voice_type); - item["locale"] = language; - self->supported_voice_types_.push_back(item); - - LOG_INFO("Supported language: %s, voice_type: %s", - item["locale"].c_str(), item["name"].c_str()); - return true; - }, - this); - - supported_lanaguages_.erase( - unique(supported_lanaguages_.begin(), supported_lanaguages_.end()), - supported_lanaguages_.end()); - supported_voice_types_.erase( - unique(supported_voice_types_.begin(), supported_voice_types_.end()), - supported_voice_types_.end()); - } + tts_foreach_supported_voices( + tts_, + [](tts_h tts, const char *language, int32_t voice_type, + void *user_data) -> bool { + if (language == nullptr) { + return false; + } + TextToSpeech *self = static_cast(user_data); + self->supported_lanaguages_.push_back(language); + + std::map item; + item["name"] = GetVoiceName(voice_type); + item["locale"] = language; + self->supported_voice_types_.push_back(item); + + LOG_INFO("Supported language: %s, voice_type: %s", + item["locale"].c_str(), item["name"].c_str()); + return true; + }, + this); } std::optional> @@ -274,11 +265,8 @@ bool TextToSpeech::GetSpeedRange(int32_t *min, int32_t *normal, int32_t *max) { } bool TextToSpeech::IsLanguageAvailable(const std::string &language) { - if (std::find(supported_lanaguages_.begin(), supported_lanaguages_.end(), - language) != supported_lanaguages_.end()) { - return true; - } - return false; + return std::find(supported_lanaguages_.begin(), supported_lanaguages_.end(), + language) != supported_lanaguages_.end(); } void TextToSpeech::SwitchVolumeOnStateChange(tts_state_e previous,