Changes for voice command search

merge-update-with-lab-changes
Sultan khan 3 years ago
parent 47702b5c01
commit f29d33d7e7

@ -66,8 +66,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_tts/flutter_tts.dart'; import 'package:flutter_tts/flutter_tts.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_error.dart';
// import 'package:speech_to_text/speech_to_text.dart' as stt; import 'package:speech_to_text/speech_to_text.dart' as stt;
import 'package:speech_to_text/speech_to_text.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class FloatingSearchButton extends StatefulWidget { class FloatingSearchButton extends StatefulWidget {
@ -83,7 +84,8 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
RobotProvider eventProvider = RobotProvider(); RobotProvider eventProvider = RobotProvider();
bool isLoading = false; bool isLoading = false;
bool isError = false; bool isError = false;
// stt.SpeechToText speech = stt.SpeechToText(); stt.SpeechToText speech = stt.SpeechToText();
FlutterTts tts = FlutterTts();
String error = ''; String error = '';
String _currentLocaleId = ""; String _currentLocaleId = "";
String lastError; String lastError;
@ -92,7 +94,6 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
double minSoundLevel = 50000; double minSoundLevel = 50000;
double maxSoundLevel = -50000; double maxSoundLevel = -50000;
String reconizedWord = ''; String reconizedWord = '';
FlutterTts flutterTts = FlutterTts();
var selectedLang; var selectedLang;
bool isSearching = false; bool isSearching = false;
Map results = {}; Map results = {};
@ -113,7 +114,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
void initState() { void initState() {
controller = AnimationController(vsync: this, duration: Duration(seconds: 1)); controller = AnimationController(vsync: this, duration: Duration(seconds: 1));
offset = Tween<Offset>(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0)).animate(controller); offset = Tween<Offset>(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0)).animate(controller);
startIosTts();
if (IS_VOICE_COMMAND_CLOSED == true) { if (IS_VOICE_COMMAND_CLOSED == true) {
controller.reverse(from: -1); controller.reverse(from: -1);
} else { } else {
@ -192,20 +193,20 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
: Image.asset('assets/images/gif/robot-idle.gif'), : Image.asset('assets/images/gif/robot-idle.gif'),
), ),
onTap: () async { onTap: () async {
// if (Platform.isAndroid) { if (Platform.isAndroid) {
// if (await PermissionService.isMicrophonePermissionEnabled()) { if (await PermissionService.isMicrophonePermissionEnabled()) {
// new RoboSearch(context: context).showAlertDialog(context); new RoboSearch(context: context).showAlertDialog(context);
// initSpeechState().then((value) => {startVoiceSearch()}); initSpeechState().then((value) => {startVoiceSearch()});
// } else { } else {
// Utils.showPermissionConsentDialog(context, TranslationBase.of(context).recordAudioPermission, () { Utils.showPermissionConsentDialog(context, TranslationBase.of(context).recordAudioPermission, () {
// new RoboSearch(context: context).showAlertDialog(context); new RoboSearch(context: context).showAlertDialog(context);
// initSpeechState().then((value) => {startVoiceSearch()}); initSpeechState().then((value) => {startVoiceSearch()});
// }); });
// } }
// } else { } else {
// new RoboSearch(context: context).showAlertDialog(context); new RoboSearch(context: context).showAlertDialog(context);
// initSpeechState().then((value) => {startVoiceSearch()}); initSpeechState().then((value) => {startVoiceSearch()});
// } }
}, },
), ),
Positioned( Positioned(
@ -234,9 +235,18 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
])); ]));
} }
// startVoiceSearch() async {
// bool available = await speech.initialize(onStatus: statusListener, onError: errorListener); startIosTts() async{
// _currentLocaleId = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); await tts.setSharedInstance(true);
await tts.setLanguage("en-US");
tts.setIosAudioCategory(
IosTextToSpeechAudioCategory.playback,
[IosTextToSpeechAudioCategoryOptions.mixWithOthers],
IosTextToSpeechAudioMode.voicePrompt);
}
startVoiceSearch() async {
bool available = await speech.initialize();
_currentLocaleId = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
// //
// if (available) { // if (available) {
// speech.listen( // speech.listen(
@ -247,31 +257,38 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
// } else { // } else {
// print("The user has denied the use of speech recognition."); // print("The user has denied the use of speech recognition.");
// } // }
// // some time later... // some time later...
// //speech.stop(); if(available) {
// // speech.listen( speech.stop();
// // onResult: resultListener, speech.listen(
// // listenFor: Duration(seconds: 10), onResult: resultListener,
// // localeId: _currentLocaleId == 'en' ? 'en-US' : 'ar-SA', listenFor: Duration(seconds: 10),
// // onSoundLevelChange: soundLevelListener, localeId: _currentLocaleId == 'en' ? 'en-US' : 'ar-SA',
// // cancelOnError: true, onSoundLevelChange: soundLevelListener,
// // partialResults: true, cancelOnError: true,
// // onDevice: true, partialResults: true,
// // listenMode: ListenMode.deviceDefault); onDevice: true,
// } listenMode: ListenMode.deviceDefault);
}
}
void resultListener(result) { void resultListener(result) {
_stopListening();
reconizedWord = result.recognizedWords; reconizedWord = result.recognizedWords;
event.setValue({"searchText": reconizedWord}); event.setValue({"searchText": reconizedWord});
if (result.finalResult == true) { if (result.finalResult == true) {
Future.delayed(const Duration(seconds: 1), () { Future.delayed(const Duration(seconds: 1), () {
_speak(reconizedWord); _speak(reconizedWord);
RoboSearch.closeAlertDialog(context); RoboSearch.closeAlertDialog(context);
//Navigator.of(context).pop(); //Navigator.of(context).pop();
}); });
} }
} }
void _stopListening() async {
await speech.stop();
// setState(() {});
}
Future _speak(reconizedWord) async { Future _speak(reconizedWord) async {
getPages(reconizedWord); getPages(reconizedWord);
} }
@ -315,10 +332,10 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
// }); // });
} }
// void errorListener(SpeechRecognitionError error) { void errorListener(SpeechRecognitionError error) {
// event.setValue({"searchText": 'null'}); event.setValue({"searchText": 'null'});
// RoboSearch.closeAlertDialog(context); RoboSearch.closeAlertDialog(context);
// } }
void statusListener(String status) { void statusListener(String status) {
//setState(() { //setState(() {
@ -807,7 +824,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
); );
} }
speak({isInit}) async { speak({isInit =false}) async {
//if (mounted) { //if (mounted) {
setState(() { setState(() {
this.networkImage = results['AnimationURL']; this.networkImage = results['AnimationURL'];
@ -817,12 +834,18 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
if (isInit == true) { if (isInit == true) {
event.setValue({"animationEnable": 'true'}); event.setValue({"animationEnable": 'true'});
} }
// var voice = await tts.getVoice();
// print(voice);
if (isArabic == false && results['ReturnMessage'] != null && isInit == false) { if (isArabic == false && results['ReturnMessage'] != null && isInit == false) {
await flutterTts.setVoice({"name": "en-au-x-aub-network", "locale": "en-AU"}); // await tts.synthesizeToFile("Hello World", Platform.isAndroid ? "tts.wav" : "tts.caf");
await flutterTts.speak(results['ReturnMessage']);
await tts.setVoice({"name": "Karen", "locale": "en-AU"});
// await tts.setVoice({"name" : voice[35]["name"],"locale": voice[35]["locale"]});
await tts.speak(results['ReturnMessage']);
} else if (results['ReturnMessage_Ar'] != null && isInit == false) { } else if (results['ReturnMessage_Ar'] != null && isInit == false) {
await flutterTts.setVoice({"name": "ar-xa-x-ard-network", "locale": "ar"}); //await tts.setVoice({"name" : voice[0]["name"],"locale": voice[0]["locale"]});
await flutterTts.speak(results['ReturnMessage_Ar']); await tts.speak(results['ReturnMessage_Ar']);
} }
stopAnimation(isInit: isInit); stopAnimation(isInit: isInit);
@ -850,7 +873,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
} }
initialSpeak() async { initialSpeak() async {
await flutterTts.awaitSpeakCompletion(true); // await flutterTts.awaitSpeakCompletion(true);
results = { results = {
'ReturnMessage_Ar': "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", 'ReturnMessage_Ar': "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.",
'ReturnMessage': "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file." 'ReturnMessage': "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file."
@ -875,21 +898,21 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
}); });
}); });
} else { } else {
flutterTts.setCompletionHandler(() async { // tts.setCompletionHandler(() async {
event.setValue({"animationEnable": 'false'}); // event.setValue({"animationEnable": 'false'});
setState(() { // setState(() {
this.networkImage = null; // this.networkImage = null;
this.isAnimationEnable = false; // this.isAnimationEnable = false;
}); // });
}); // });
} }
flutterTts.setCompletionHandler(() async { // flutterTts.setCompletionHandler(() async {
event.setValue({"animationEnable": 'false'}); // event.setValue({"animationEnable": 'false'});
setState(() { // setState(() {
this.networkImage = null; // this.networkImage = null;
this.isAnimationEnable = false; // this.isAnimationEnable = false;
}); // });
}); // });
} }
signOut() async { signOut() async {

@ -1,7 +1,7 @@
name: diplomaticquarterapp name: diplomaticquarterapp
description: A new Flutter application. description: A new Flutter application.
version: 4.5.61+1 version: 4.5.64+1
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.7.0 <3.0.0"
@ -34,7 +34,7 @@ dependencies:
health: ^3.0.3 health: ^3.0.3
#chart #chart
fl_chart: ^0.40.2 fl_chart: ^0.45.0
#Camera Preview #Camera Preview
camera: ^0.10.1 camera: ^0.10.1
@ -165,19 +165,21 @@ dependencies:
cached_network_image: ^3.1.0+1 cached_network_image: ^3.1.0+1
# flutter_tts: # flutter_tts:
# path: flutter_tts-voice_enhancement # path: flutter_tts-voice_enhancement
flutter_tts: ^3.6.1 flutter_tts: ^3.7.0
wifi: ^0.1.5 wifi: ^0.1.5
vibration: ^1.7.3 vibration: ^1.7.3
flutter_nfc_kit: ^3.3.1 flutter_nfc_kit: ^3.3.1
# speech_to_text: ^6.1.1 geofencing: ^0.1.0
speech_to_text: ^6.1.1
# path: speech_to_text # path: speech_to_text
in_app_update: ^3.0.0 in_app_update: ^4.0.1
in_app_review: ^2.0.3 in_app_review: ^2.0.6
badges: ^2.0.1 badges: ^2.0.1
flutter_app_icon_badge: ^2.0.0 flutter_app_icon_badge: ^2.0.0
@ -205,6 +207,7 @@ dependencies:
sms_otp_auto_verify: ^2.1.0 sms_otp_auto_verify: ^2.1.0
flutter_ios_voip_kit: ^0.0.5 flutter_ios_voip_kit: ^0.0.5
google_api_availability: ^3.0.1 google_api_availability: ^3.0.1
# flutter_callkit_incoming: ^1.0.3+3
# firebase_core: 1.12.0 # firebase_core: 1.12.0
dependency_overrides: dependency_overrides:

@ -1,5 +1,6 @@
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
part 'speech_recognition_error.g.dart'; part 'speech_recognition_error.g.dart';
/// A single error returned from the underlying speech services. /// A single error returned from the underlying speech services.

Loading…
Cancel
Save