diff --git a/lib/pangea/widgets/chat/tts_controller.dart b/lib/pangea/widgets/chat/tts_controller.dart index 9acc7f7f8..93d270133 100644 --- a/lib/pangea/widgets/chat/tts_controller.dart +++ b/lib/pangea/widgets/chat/tts_controller.dart @@ -18,8 +18,21 @@ class TtsController { setupTTS(); } + Future dispose() async { + await tts.stop(); + } + + onError(dynamic message) => ErrorHandler.logError( + m: 'TTS error', + data: { + 'message': message, + }, + ); + Future setupTTS() async { try { + tts.setErrorHandler(onError); + targetLanguage ??= MatrixState.pangeaController.languageController.userL2?.langCode; @@ -53,12 +66,50 @@ class TtsController { } } + Future stop() async { + try { + // return type is dynamic but apparent its supposed to be 1 + // https://pub.dev/packages/flutter_tts + final result = await tts.stop(); + if (result != 1) { + ErrorHandler.logError( + m: 'Unexpected result from tts.stop', + data: { + 'result': result, + }, + ); + } + } catch (e, s) { + debugger(when: kDebugMode); + ErrorHandler.logError(e: e, s: s); + } + await tts.stop(); + } + Future speak(String text) async { - targetLanguage ??= - MatrixState.pangeaController.languageController.userL2?.langCode; + try { + stop(); - await tts.stop(); - return tts.speak(text); + targetLanguage ??= + MatrixState.pangeaController.languageController.userL2?.langCode; + + final result = await tts.speak(text); + + // return type is dynamic but apparent its supposed to be 1 + // https://pub.dev/packages/flutter_tts + if (result != 1) { + ErrorHandler.logError( + m: 'Unexpected result from tts.speak', + data: { + 'result': result, + 'text': text, + }, + ); + } + } catch (e, s) { + debugger(when: kDebugMode); + ErrorHandler.logError(e: e, s: s); + } } bool get isLanguageFullySupported => diff --git a/lib/pangea/widgets/practice_activity/word_audio_button.dart b/lib/pangea/widgets/practice_activity/word_audio_button.dart index 8602a48d8..226328804 100644 --- a/lib/pangea/widgets/practice_activity/word_audio_button.dart +++ b/lib/pangea/widgets/practice_activity/word_audio_button.dart @@ -19,7 +19,6 @@ class WordAudioButtonState extends State { TtsController ttsController = TtsController(); - @override @override void initState() { // TODO: implement initState @@ -27,6 +26,12 @@ class WordAudioButtonState extends State { ttsController.setupTTS().then((value) => setState(() {})); } + @override + void dispose() { + ttsController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Column(