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,44 +235,60 @@ 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");
// if (available) { tts.setIosAudioCategory(
// speech.listen( IosTextToSpeechAudioCategory.playback,
// onResult: resultListener, [IosTextToSpeechAudioCategoryOptions.mixWithOthers],
// //listenMode: ListenMode.confirmation, IosTextToSpeechAudioMode.voicePrompt);
// localeId: _currentLocaleId == 'en' ? 'en_US' : 'ar_SA', }
// ); startVoiceSearch() async {
// } else { bool available = await speech.initialize();
// print("The user has denied the use of speech recognition."); _currentLocaleId = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
// } //
// // some time later... // if (available) {
// //speech.stop(); // speech.listen(
// // speech.listen( // onResult: resultListener,
// // onResult: resultListener, // //listenMode: ListenMode.confirmation,
// // listenFor: Duration(seconds: 10), // localeId: _currentLocaleId == 'en' ? 'en_US' : 'ar_SA',
// // localeId: _currentLocaleId == 'en' ? 'en-US' : 'ar-SA', // );
// // onSoundLevelChange: soundLevelListener, // } else {
// // cancelOnError: true, // print("The user has denied the use of speech recognition.");
// // partialResults: true, // }
// // onDevice: true, // some time later...
// // listenMode: ListenMode.deviceDefault); if(available) {
// } speech.stop();
speech.listen(
onResult: resultListener,
listenFor: Duration(seconds: 10),
localeId: _currentLocaleId == 'en' ? 'en-US' : 'ar-SA',
onSoundLevelChange: soundLevelListener,
cancelOnError: true,
partialResults: true,
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"
@ -15,7 +15,7 @@ dependencies:
sdk: flutter sdk: flutter
intl: ^0.17.0 intl: ^0.17.0
# web view # web view
# webview_flutter: ^2.3.1 # webview_flutter: ^2.3.1
# http client # http client
http: ^0.13.4 http: ^0.13.4
@ -23,7 +23,7 @@ dependencies:
async: ^2.8.1 async: ^2.8.1
audio_wave: ^0.1.4 audio_wave: ^0.1.4
# audio_session: ^0.1.13 # audio_session: ^0.1.13
# State Management # State Management
provider: ^6.0.1 provider: ^6.0.1
@ -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
@ -54,7 +54,7 @@ dependencies:
maps_launcher: ^2.0.1 maps_launcher: ^2.0.1
url_launcher: ^6.0.15 url_launcher: ^6.0.15
shared_preferences: ^2.0.0 shared_preferences: ^2.0.0
# flutter_flexible_toast: ^0.1.4 # flutter_flexible_toast: ^0.1.4
fluttertoast: ^8.0.8 fluttertoast: ^8.0.8
firebase_messaging: ^14.1.0 firebase_messaging: ^14.1.0
firebase_analytics: ^10.0.5 firebase_analytics: ^10.0.5
@ -98,7 +98,7 @@ dependencies:
flutter_polyline_points: ^1.0.0 flutter_polyline_points: ^1.0.0
location: ^4.3.0 location: ^4.3.0
# Qr code Scanner # Qr code Scanner
# barcode_scan_fix: ^1.0.2 # barcode_scan_fix: ^1.0.2
barcode_scan2: ^4.2.2 barcode_scan2: ^4.2.2
# Rating Stars # Rating Stars
@ -108,7 +108,7 @@ dependencies:
syncfusion_flutter_calendar: ^19.3.55 syncfusion_flutter_calendar: ^19.3.55
# SVG Images # SVG Images
# flutter_svg: ^0.23.0+1 # flutter_svg: ^0.23.0+1
#Calendar Events #Calendar Events
manage_calendar_events: ^2.0.1 manage_calendar_events: ^2.0.1
@ -152,7 +152,7 @@ dependencies:
#google maps places #google maps places
google_maps_place_picker_mb: ^3.0.0 google_maps_place_picker_mb: ^3.0.0
# google_maps_place_picker: ^2.1.0-nullsafety.3 # google_maps_place_picker: ^2.1.0-nullsafety.3
map_launcher: ^1.1.3 map_launcher: ^1.1.3
#countdown timer for Upcoming List #countdown timer for Upcoming List
flutter_countdown_timer: ^4.1.0 flutter_countdown_timer: ^4.1.0
@ -161,23 +161,25 @@ dependencies:
native_device_orientation: ^1.0.0 native_device_orientation: ^1.0.0
wakelock: ^0.5.6 wakelock: ^0.5.6
after_layout: ^1.1.0 after_layout: ^1.1.0
# twilio_programmable_video: ^0.11.0+1 # twilio_programmable_video: ^0.11.0+1
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
# path: speech_to_text
in_app_update: ^3.0.0 speech_to_text: ^6.1.1
# path: speech_to_text
in_app_review: ^2.0.3 in_app_update: ^4.0.1
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
@ -191,7 +193,7 @@ dependencies:
carousel_slider: ^4.0.0 carousel_slider: ^4.0.0
flutter_material_pickers: ^3.1.2 flutter_material_pickers: ^3.1.2
flutter_staggered_grid_view: ^0.4.1 flutter_staggered_grid_view: ^0.4.1
# flutter_hms_gms_availability: ^2.0.0 # flutter_hms_gms_availability: ^2.0.0
huawei_hmsavailability: ^6.6.0+300 huawei_hmsavailability: ^6.6.0+300
huawei_location: 6.0.0+302 huawei_location: 6.0.0+302
@ -201,15 +203,16 @@ dependencies:
equatable: ^2.0.3 equatable: ^2.0.3
signalr_core: ^1.1.1 signalr_core: ^1.1.1
wave: ^0.2.0 wave: ^0.2.0
# sms_retriever: ^1.0.0 # sms_retriever: ^1.0.0
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:
provider : ^5.0.0 provider : ^5.0.0
# permission_handler : ^10.2.0 # permission_handler : ^10.2.0
flutter_svg: ^1.0.0 flutter_svg: ^1.0.0
# firebase_messaging_platform_interface: any # firebase_messaging_platform_interface: any
# flutter_inappwebview: 5.7.2+3 # flutter_inappwebview: 5.7.2+3

@ -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