You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.3 KiB

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<AzureAsrService>();
// 可观察状态
final isListening = false.obs;
final errorMessage = ''.obs;
final isContinuous = true.obs;
final recognitionResults = <String>[].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();
}
}