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
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 AsrTestController 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();
|
|
}
|
|
}
|