|
|
|
@ -113,41 +113,41 @@ class VolcanoAsrApiService implements AsrService { |
|
|
|
|
|
|
|
final resultCompleter = Completer<RecognitionEvent>(); |
|
|
|
|
|
|
|
// 开始连续识别流程 |
|
|
|
final stream = await startContinuousRecognition(_audioSourceType); |
|
|
|
|
|
|
|
// 监听结果 |
|
|
|
StreamSubscription? subscription; |
|
|
|
subscription = stream.listen((event) { |
|
|
|
if (event.type == RecognitionEventType.finalResult) { |
|
|
|
// 收到最终结果,完成单次识别 |
|
|
|
subscription?.cancel(); |
|
|
|
resultCompleter.complete(event); |
|
|
|
stopContinuousRecognition(); |
|
|
|
} else if (event.type == RecognitionEventType.error) { |
|
|
|
// 发生错误,返回错误 |
|
|
|
subscription?.cancel(); |
|
|
|
resultCompleter.completeError(event.error); |
|
|
|
stopContinuousRecognition(); |
|
|
|
} |
|
|
|
}, onError: (e) { |
|
|
|
subscription?.cancel(); |
|
|
|
resultCompleter.completeError(e.toString()); |
|
|
|
stopContinuousRecognition(); |
|
|
|
}, onDone: () { |
|
|
|
if (!resultCompleter.isCompleted) { |
|
|
|
resultCompleter.complete(RecognitionEvent.error('未收到识别结果')); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
// 设置超时 |
|
|
|
Timer(const Duration(seconds: 30), () { |
|
|
|
if (!resultCompleter.isCompleted) { |
|
|
|
subscription?.cancel(); |
|
|
|
resultCompleter.complete(RecognitionEvent.error('识别超时')); |
|
|
|
stopContinuousRecognition(); |
|
|
|
} |
|
|
|
}); |
|
|
|
// // 开始连续识别流程 |
|
|
|
// final stream = await startContinuousRecognition(_audioSourceType); |
|
|
|
|
|
|
|
// // 监听结果 |
|
|
|
// StreamSubscription? subscription; |
|
|
|
// subscription = stream.listen((event) { |
|
|
|
// if (event.type == RecognitionEventType.finalResult) { |
|
|
|
// // 收到最终结果,完成单次识别 |
|
|
|
// subscription?.cancel(); |
|
|
|
// resultCompleter.complete(event); |
|
|
|
// stopContinuousRecognition(); |
|
|
|
// } else if (event.type == RecognitionEventType.error) { |
|
|
|
// // 发生错误,返回错误 |
|
|
|
// subscription?.cancel(); |
|
|
|
// resultCompleter.completeError(event.error); |
|
|
|
// stopContinuousRecognition(); |
|
|
|
// } |
|
|
|
// }, onError: (e) { |
|
|
|
// subscription?.cancel(); |
|
|
|
// resultCompleter.completeError(e.toString()); |
|
|
|
// stopContinuousRecognition(); |
|
|
|
// }, onDone: () { |
|
|
|
// if (!resultCompleter.isCompleted) { |
|
|
|
// resultCompleter.complete(RecognitionEvent.error('未收到识别结果')); |
|
|
|
// } |
|
|
|
// }); |
|
|
|
|
|
|
|
// // 设置超时 |
|
|
|
// Timer(const Duration(seconds: 30), () { |
|
|
|
// if (!resultCompleter.isCompleted) { |
|
|
|
// subscription?.cancel(); |
|
|
|
// resultCompleter.complete(RecognitionEvent.error('识别超时')); |
|
|
|
// stopContinuousRecognition(); |
|
|
|
// } |
|
|
|
// }); |
|
|
|
|
|
|
|
return resultCompleter.future; |
|
|
|
} catch (e) { |
|
|
|
@ -157,44 +157,44 @@ class VolcanoAsrApiService implements AsrService { |
|
|
|
} |
|
|
|
|
|
|
|
@override |
|
|
|
Future<Stream<RecognitionEvent>> startContinuousRecognition( |
|
|
|
bool audioSourceType) async { |
|
|
|
if (!_isInitialized) { |
|
|
|
await initialize(); |
|
|
|
} |
|
|
|
// Future<Stream<RecognitionEvent>> startContinuousRecognition( |
|
|
|
// bool audioSourceType) async { |
|
|
|
// if (!_isInitialized) { |
|
|
|
// await initialize(); |
|
|
|
// } |
|
|
|
|
|
|
|
if (_isContinuousRecognitionActive) { |
|
|
|
await stopContinuousRecognition(); |
|
|
|
} |
|
|
|
// if (_isContinuousRecognitionActive) { |
|
|
|
// await stopContinuousRecognition(); |
|
|
|
// } |
|
|
|
|
|
|
|
try { |
|
|
|
// 创建结果控制器 |
|
|
|
_recognitionController = StreamController<RecognitionEvent>.broadcast(); |
|
|
|
// try { |
|
|
|
// // 创建结果控制器 |
|
|
|
// _recognitionController = StreamController<RecognitionEvent>.broadcast(); |
|
|
|
|
|
|
|
// 连接WebSocket |
|
|
|
await _connectWebSocket(); |
|
|
|
// // 连接WebSocket |
|
|
|
// await _connectWebSocket(); |
|
|
|
|
|
|
|
// 开始录音 |
|
|
|
await _startRecording(); |
|
|
|
// // 开始录音 |
|
|
|
// await _startRecording(); |
|
|
|
|
|
|
|
_isContinuousRecognitionActive = true; |
|
|
|
_isRecognitionEndRequested = false; |
|
|
|
// _isContinuousRecognitionActive = true; |
|
|
|
// _isRecognitionEndRequested = false; |
|
|
|
|
|
|
|
Logger.info('连续语音识别已开始'); |
|
|
|
// Logger.info('连续语音识别已开始'); |
|
|
|
|
|
|
|
return _recognitionController!.stream; |
|
|
|
} catch (e) { |
|
|
|
Logger.error('开始连续语音识别失败: ${e.toString()}'); |
|
|
|
await _cleanupResources(); |
|
|
|
// return _recognitionController!.stream; |
|
|
|
// } catch (e) { |
|
|
|
// Logger.error('开始连续语音识别失败: ${e.toString()}'); |
|
|
|
// await _cleanupResources(); |
|
|
|
|
|
|
|
// 返回一个包含错误的流 |
|
|
|
final errorController = StreamController<RecognitionEvent>.broadcast(); |
|
|
|
errorController.add(RecognitionEvent.error(e.toString())); |
|
|
|
errorController.close(); |
|
|
|
// // 返回一个包含错误的流 |
|
|
|
// final errorController = StreamController<RecognitionEvent>.broadcast(); |
|
|
|
// errorController.add(RecognitionEvent.error(e.toString())); |
|
|
|
// errorController.close(); |
|
|
|
|
|
|
|
return errorController.stream; |
|
|
|
} |
|
|
|
} |
|
|
|
// return errorController.stream; |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
@override |
|
|
|
Future<bool> stopContinuousRecognition() async { |
|
|
|
@ -859,4 +859,10 @@ class VolcanoAsrApiService implements AsrService { |
|
|
|
// TODO: implement recognizeCallback |
|
|
|
throw UnimplementedError(); |
|
|
|
} |
|
|
|
|
|
|
|
@override |
|
|
|
Future<bool> startContinuousRecognition(bool audioSourceType) { |
|
|
|
// TODO: implement startContinuousRecognition |
|
|
|
throw UnimplementedError(); |
|
|
|
} |
|
|
|
} |
|
|
|
|