|
|
|
@ -847,53 +847,64 @@ class TranslationController extends GetxController with WidgetsBindingObserver { |
|
|
|
/// 处理语音识别事件 |
|
|
|
/// [event] 识别事件 |
|
|
|
void _handleRecognitionEvent(RecognitionEvent event) { |
|
|
|
if (event.type == RecognitionEventType.finalResult && |
|
|
|
event.text.isNotEmpty) { |
|
|
|
detectedLanguageCode = event.detectedLanguage; |
|
|
|
print("处理识别完成:${event.text}"); |
|
|
|
if (currentMode.value != 'faceToFace') { |
|
|
|
handleFinalResult(event.text); |
|
|
|
} else { |
|
|
|
faceToFaceRecognitionText.value += event.text; |
|
|
|
// 添加日志打印 |
|
|
|
Logger.info('lxm-面对面翻译识别文本更新: ${faceToFaceRecognitionText.value}'); |
|
|
|
} |
|
|
|
if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) { |
|
|
|
handleFinalResult(faceToFaceRecognitionText.value); |
|
|
|
faceToFaceRecognitionText.value = ''; |
|
|
|
} |
|
|
|
} else if (event.type == RecognitionEventType.finalResult1 && |
|
|
|
event.text.isNotEmpty) { |
|
|
|
// 通话模式下:己方(麦克风)识别完成事件 |
|
|
|
// 若原生未返回检测语言,则兜底为源语言 |
|
|
|
detectedLanguageCode = event.detectedLanguage.isNotEmpty |
|
|
|
? event.detectedLanguage |
|
|
|
: sourceLanguageCode.value; |
|
|
|
print("处理己方识别完成:${event.text}"); |
|
|
|
if (currentMode.value != 'faceToFace') { |
|
|
|
// Logger.info("处理识别事件:${event}"); |
|
|
|
switch (event.type) { |
|
|
|
case RecognitionEventType.finalResult: |
|
|
|
if (event.text.isEmpty) break; |
|
|
|
// 通话模式下:目标语言即为识别语言,无需判断 |
|
|
|
detectedLanguageCode = currentMode.value == 'call' |
|
|
|
? targetLanguageCode.value |
|
|
|
: event.detectedLanguage; |
|
|
|
Logger.info("处理识别完成:${event.text}"); |
|
|
|
if (currentMode.value != 'faceToFace') { |
|
|
|
handleFinalResult(event.text); |
|
|
|
} else { |
|
|
|
faceToFaceRecognitionText.value += event.text; |
|
|
|
Logger.info('lxm-面对面翻译识别文本更新: ${faceToFaceRecognitionText.value}'); |
|
|
|
} |
|
|
|
if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) { |
|
|
|
handleFinalResult(faceToFaceRecognitionText.value); |
|
|
|
faceToFaceRecognitionText.value = ''; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case RecognitionEventType.finalResult1: |
|
|
|
// 通话模式下:己方(麦克风)识别完成事件(对应ast服务) |
|
|
|
if (event.text.isEmpty) break; |
|
|
|
//通话模式下:己方语言即为源语言,无需判断 |
|
|
|
detectedLanguageCode = sourceLanguageCode.value; |
|
|
|
Logger.info("处理己方识别完成:${event.text}"); |
|
|
|
handleFinalResult(event.text); |
|
|
|
} else { |
|
|
|
faceToFaceRecognitionText.value += event.text; |
|
|
|
Logger.info('lxm-面对面翻译识别文本更新(己方): ${faceToFaceRecognitionText.value}'); |
|
|
|
} |
|
|
|
if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) { |
|
|
|
handleFinalResult(faceToFaceRecognitionText.value); |
|
|
|
faceToFaceRecognitionText.value = ''; |
|
|
|
} |
|
|
|
} else if (event.type == RecognitionEventType.intermediateResult && |
|
|
|
event.text.isNotEmpty) { |
|
|
|
if (event.detectedLanguage.isNotEmpty) { |
|
|
|
detectedLanguageCode = event.detectedLanguage; |
|
|
|
} |
|
|
|
print("处理识别中事件:${event.text}"); |
|
|
|
handleIntermediateResult(event.text); |
|
|
|
} else if (event.type == RecognitionEventType.error) { |
|
|
|
Get.snackbar('error'.tr, event.error); |
|
|
|
isRecognizing.value = false; |
|
|
|
Logger.error('语音识别错误: ${event.error}'); |
|
|
|
} else if (event.type == RecognitionEventType.canceled) { |
|
|
|
isRecognizing.value = false; |
|
|
|
Logger.error('语音识别取消: ${event.error}'); |
|
|
|
break; |
|
|
|
|
|
|
|
case RecognitionEventType.intermediateResult: |
|
|
|
if (event.text.isEmpty) break; |
|
|
|
// 通话模式下:目标语言即为识别语言,无需判断 |
|
|
|
detectedLanguageCode = currentMode.value == 'call' |
|
|
|
? targetLanguageCode.value |
|
|
|
: event.detectedLanguage; |
|
|
|
Logger.info("处理识别中事件:${event.text}"); |
|
|
|
handleIntermediateResult(event.text); |
|
|
|
break; |
|
|
|
|
|
|
|
case RecognitionEventType.error: |
|
|
|
Get.snackbar('error'.tr, event.error); |
|
|
|
isRecognizing.value = false; |
|
|
|
Logger.error('语音识别错误: ${event.error}'); |
|
|
|
break; |
|
|
|
|
|
|
|
case RecognitionEventType.canceled: |
|
|
|
isRecognizing.value = false; |
|
|
|
Logger.error('语音识别取消: ${event.error}'); |
|
|
|
break; |
|
|
|
|
|
|
|
case RecognitionEventType.sessionStarted: |
|
|
|
// 可按需处理会话开始事件 |
|
|
|
break; |
|
|
|
|
|
|
|
case RecognitionEventType.sessionStopped: |
|
|
|
// 可按需处理会话结束事件 |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -919,18 +930,21 @@ class TranslationController extends GetxController with WidgetsBindingObserver { |
|
|
|
/// [text] 识别的文本 |
|
|
|
void handleIntermediateResult(String text) { |
|
|
|
if (text.isEmpty) return; |
|
|
|
print( |
|
|
|
Logger.info( |
|
|
|
"handleIntermediateResult:${translationHistory.isEmpty}${translationHistory.isNotEmpty ? translationHistory.last.isIntermediate : 'N/A'}"); |
|
|
|
if (translationHistory.isEmpty || |
|
|
|
(translationHistory.isNotEmpty && |
|
|
|
!translationHistory.last.isIntermediate)) { |
|
|
|
currentSessionId ??= DateTime.now().millisecondsSinceEpoch.toString(); |
|
|
|
|
|
|
|
// 关键调整:使用与最终结果一致的语言方向,避免左右“跳变” |
|
|
|
final languageCodes = _determineLanguageCodes(); |
|
|
|
|
|
|
|
final newItem = TranslationItem( |
|
|
|
sourceText: text, |
|
|
|
translatedText: '', |
|
|
|
sourceLanguageCode: sourceLanguageCode.value, |
|
|
|
targetLanguageCode: targetLanguageCode.value, |
|
|
|
sourceLanguageCode: languageCodes['source']!, |
|
|
|
targetLanguageCode: languageCodes['target']!, |
|
|
|
timestamp: DateTime.now(), |
|
|
|
sessionId: currentSessionId!, |
|
|
|
isFirstInSession: translationHistory.isEmpty || |
|
|
|
|