import 'dart:async'; import 'package:get/get.dart'; import '../../../data/services/azure_asr_service.dart'; import '../../../core/utils/logger.dart'; class AzureAsrTestController extends GetxController { final AzureAsrService _azureService = Get.find(); // 可观察状态 final isListening = false.obs; final errorMessage = ''.obs; final isContinuous = true.obs; final recognitionResults = [].obs; // 连续识别相关 StreamSubscription? _recognitionSubscription; @override void onInit() { super.onInit(); // 由于 AzureAsrService 没有公开的 isListening 属性,我们需要自己管理状态 } /// 开始录音 void startListening() async { try { errorMessage.value = ''; if (isContinuous.value) { // 连续识别模式 final success = await _azureService.startContinuousRecognition(); if (!success) { errorMessage.value = '无法启动语音识别'; return; } isListening.value = true; _recognitionSubscription = _azureService.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 ?? '未知错误'; isListening.value = false; break; case RecognitionEventType.canceled: errorMessage.value = '识别已取消: ${event.reason ?? "未知原因"}'; isListening.value = false; break; case RecognitionEventType.sessionStopped: isListening.value = false; break; default: break; } }, onError: (error) { errorMessage.value = error.toString(); isListening.value = false; }, ); } else { // 一次性识别模式 isListening.value = true; try { final result = await _azureService.recognizeOnce(); if (result.isNotEmpty) { recognitionResults.add(result); } } catch (e) { errorMessage.value = '识别失败: $e'; } finally { isListening.value = false; } } } catch (e) { Logger.error('启动语音识别失败', e); errorMessage.value = e.toString(); isListening.value = false; } } /// 停止录音 void stopListening() async { try { if (isContinuous.value) { final success = await _azureService.stopContinuousRecognition(); if (!success) { errorMessage.value = '停止识别失败'; } await _recognitionSubscription?.cancel(); _recognitionSubscription = null; isListening.value = false; } } catch (e) { Logger.error('停止语音识别失败', e); errorMessage.value = e.toString(); isListening.value = false; } } /// 清空结果 void clearResults() { recognitionResults.clear(); } @override void onClose() { _recognitionSubscription?.cancel(); super.onClose(); } }