// Author: fengshengxiong // Date: 2024/5/8 // Description: 语音转文本 import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_to_text.dart'; import 'package:trans_lark/widget/base_easyloading.dart'; class SpeechToTextManager { static final SpeechToTextManager _instance = SpeechToTextManager._(); factory SpeechToTextManager() { return _instance; } SpeechToTextManager._(); final _speechToText = SpeechToText(); var hasSpeech = false; var isListening = false.obs; Future initSpeech() async { try { BaseEasyLoading.loading(); hasSpeech = await _speechToText.initialize( onStatus: _statusListener, onError: _errorListener, ); BaseEasyLoading.dismiss(); _speechToText.statusListener ??= _statusListener; _speechToText.errorListener ??= _errorListener; } catch (e) { debugPrint('Speech recognition failed: ${e.toString()}'); } } void _statusListener(String status) { debugPrint('状态:$status'); if (status == 'listening') { isListening.value = true; } else { isListening.value = false; } } void _errorListener(SpeechRecognitionError error) { debugPrint('Received error status: $error, listening: ${_speechToText.isListening}'); BaseEasyLoading.toast('Speech recognition failed: ${error.errorMsg}'); } Future startListening(String localeId, SpeechResultListener onResult) async { BaseEasyLoading.loading(); try { await _speechToText.listen( onResult: onResult, localeId: localeId, listenFor: const Duration(minutes: 30), pauseFor: const Duration(minutes: 3), listenOptions: SpeechListenOptions( cancelOnError: true, autoPunctuation: true, listenMode: ListenMode.dictation, ), ); BaseEasyLoading.dismiss(); } catch (e) { if (e.runtimeType == ListenFailedException) { debugPrint('speechToText.listen:${(e as ListenFailedException).message}'); } else { debugPrint('speechToText.listen:${e.toString()}'); } BaseEasyLoading.toast('The current language does not support speech recognition'); } } Future stopListening() async { if (isListening.value) { BaseEasyLoading.loading(); await _speechToText.stop(); BaseEasyLoading.dismiss(); } } }