import 'dart:async'; import 'package:get/get.dart'; import '../../../data/services/volcano_voice_recognition_service.dart'; class AsrTestController extends GetxController { final VolcanoVoiceRecognitionService _voiceService = Get.find(); // 可观察状态 final isListening = false.obs; final errorMessage = ''.obs; final isContinuous = true.obs; final recognitionResults = [].obs; // 连续识别相关 StreamSubscription? _recognitionSubscription; @override void onInit() { super.onInit(); // 监听语音识别服务的状态 _voiceService.isListening.listen((listening) { isListening.value = listening; if (!listening) { errorMessage.value = ''; } }); } /// 开始录音 void startListening() async { try { errorMessage.value = ''; if (isContinuous.value) { // 连续识别模式 final success = await _voiceService.startContinuousRecognition(); if (!success) { errorMessage.value = '无法启动语音识别'; return; } _recognitionSubscription = _voiceService.recognitionStream?.listen( (event) { switch (event.type) { case RecognitionEventType.finalResult: if (event.text.isNotEmpty) { recognitionResults.add(event.text); } break; case RecognitionEventType.error: errorMessage.value = event.error ?? '未知错误'; break; default: break; } }, onError: (error) { errorMessage.value = error.toString(); isListening.value = false; }, ); } else { // 一次性识别模式 final success = await _voiceService.startOneTimeRecognition(); if (!success) { errorMessage.value = '无法启动语音识别'; return; } // 一次性识别模式下,结果会通过服务的recognitionResults获取 // 在onInit中我们已经监听了isListening状态,当识别完成时会自动更新UI } } catch (e) { errorMessage.value = e.toString(); isListening.value = false; } } /// 停止录音 void stopListening() async { try { if (isContinuous.value) { await _voiceService.stopRecognition(); await _recognitionSubscription?.cancel(); _recognitionSubscription = null; } } catch (e) { errorMessage.value = e.toString(); } } /// 清空结果 void clearResults() { recognitionResults.clear(); } @override void onClose() { _recognitionSubscription?.cancel(); super.onClose(); } }