Browse Source

修复bug

newdev_shunjiawei
fdp 1 year ago
parent
commit
2d957da14d
  1. 8
      ios/Runner/GoogleService-Info.plist
  2. 3
      lib/modules/meeting/controllers/meeting_record_controller.dart
  3. 91
      lib/modules/translation/controllers/translation_controller.dart
  4. 8
      lib/modules/translation/views/translation_list_view.dart
  5. 26
      lib/modules/translation/views/translation_view.dart

8
ios/Runner/GoogleService-Info.plist

@ -3,9 +3,9 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CLIENT_ID</key> <key>CLIENT_ID</key>
<string>907754492821-oc9e77svgmmlgouo0op7vv00e1hb8278.apps.googleusercontent.com</string> <string>907754492821-tl2blr39g82re40sttkve36ovt6qcu6c.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key> <key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.907754492821-oc9e77svgmmlgouo0op7vv00e1hb8278</string> <string>com.googleusercontent.apps.907754492821-tl2blr39g82re40sttkve36ovt6qcu6c</string>
<key>ANDROID_CLIENT_ID</key> <key>ANDROID_CLIENT_ID</key>
<string>907754492821-9jakqvathu61e6b8g95i41ssi7o4dnka.apps.googleusercontent.com</string> <string>907754492821-9jakqvathu61e6b8g95i41ssi7o4dnka.apps.googleusercontent.com</string>
<key>API_KEY</key> <key>API_KEY</key>
@ -15,7 +15,7 @@
<key>PLIST_VERSION</key> <key>PLIST_VERSION</key>
<string>1</string> <string>1</string>
<key>BUNDLE_ID</key> <key>BUNDLE_ID</key>
<string>com.yunqiinnovation.deepsound</string> <string>com.chuangxiangyunqi.deapsound</string>
<key>PROJECT_ID</key> <key>PROJECT_ID</key>
<string>deepsound-e0e3d</string> <string>deepsound-e0e3d</string>
<key>STORAGE_BUCKET</key> <key>STORAGE_BUCKET</key>
@ -31,6 +31,6 @@
<key>IS_SIGNIN_ENABLED</key> <key>IS_SIGNIN_ENABLED</key>
<true></true> <true></true>
<key>GOOGLE_APP_ID</key> <key>GOOGLE_APP_ID</key>
<string>1:907754492821:ios:246794fc44b23174145c9c</string> <string>1:907754492821:ios:e4b4f3b37e58a7d1145c9c</string>
</dict> </dict>
</plist> </plist>

3
lib/modules/meeting/controllers/meeting_record_controller.dart

@ -138,6 +138,7 @@ class MeetingRecordController extends GetxController
_bleManager.closeCodec(); _bleManager.closeCodec();
} }
_asrService.stopRecord(true); _asrService.stopRecord(true);
_asrService.setPause();
_asrService.stopContinuousRecognition(); _asrService.stopContinuousRecognition();
isRecording.value = false; isRecording.value = false;
} }
@ -214,7 +215,7 @@ class MeetingRecordController extends GetxController
_recognitionSubscription?.cancel(); _recognitionSubscription?.cancel();
_recognitionSubscription = _recognitionSubscription =
recognitionStream.listen(_handleRecognitionEvent); recognitionStream.listen(_handleRecognitionEvent);
_asrService.setContinue();
// Prepare storage directory // Prepare storage directory
final appDir = await appDocDir; final appDir = await appDocDir;
final dir = Directory("${appDir.path}/MeetingAudio/"); final dir = Directory("${appDir.path}/MeetingAudio/");

91
lib/modules/translation/controllers/translation_controller.dart

@ -106,13 +106,16 @@ class TranslationController extends GetxController {
_asrService.setContinue(); _asrService.setContinue();
lastActiveSpeaker.value = id; lastActiveSpeaker.value = id;
} else { } else {
_asrService.setPause();
if (fTFTranslationResult != '' && !isPlayback) { if (fTFTranslationResult != '' && !isPlayback) {
isPlayback = true; isPlayback = true;
await _ttsService.setAudioOutputDevice(lastActiveSpeaker.value); await _ttsService.setAudioOutputDevice(lastActiveSpeaker.value);
await Future.delayed(const Duration(milliseconds: 1300)); await Future.delayed(const Duration(milliseconds: 1300));
await playTranslatedText(fTFTranslationResult!); await playTranslatedText(fTFTranslationResult!);
fTFTranslationResult = ''; fTFTranslationResult = '';
} else if ((translationHistory.isEmpty ||
!translationHistory.last.isIntermediate) &&
currentMode.value == 'faceToFace') {
_asrService.setPause();
} }
} }
} }
@ -165,7 +168,7 @@ class TranslationController extends GetxController {
} }
// 加载历史记录 // 加载历史记录
//loadTranslationHistory(); loadTranslationHistory();
// 初始化服务 // 初始化服务
_initServices(); _initServices();
@ -462,6 +465,7 @@ class TranslationController extends GetxController {
if (translationHistory.isEmpty || !translationHistory.last.isIntermediate) { if (translationHistory.isEmpty || !translationHistory.last.isIntermediate) {
currentSessionId ??= DateTime.now().millisecondsSinceEpoch.toString(); currentSessionId ??= DateTime.now().millisecondsSinceEpoch.toString();
final newItem = TranslationItem( final newItem = TranslationItem(
sourceText: text, sourceText: text,
translatedText: '', translatedText: '',
@ -474,10 +478,15 @@ class TranslationController extends GetxController {
isIntermediate: true, isIntermediate: true,
); );
// 添加新项后滚动到底部 // 添加新项后滚动到底部
translationHistory.add(newItem); if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) {
_asrService.setPause();
} else {
translationHistory.add(newItem);
}
_scrollToBottom(); _scrollToBottom();
} else { } else {
// 更新当前项 // 更新当前项
translationHistory.last.sourceText = text; translationHistory.last.sourceText = text;
translationHistory.refresh(); translationHistory.refresh();
// 更新后滚动到底部 // 更新后滚动到底部
@ -509,7 +518,9 @@ class TranslationController extends GetxController {
// 更新后滚动到底部 // 更新后滚动到底部
_scrollToBottom(); _scrollToBottom();
saveTranslationHistory(); saveTranslationHistory();
if (activeSpeaker.value == 0 && currentMode.value == 'faceToFace') {
_asrService.setPause();
}
// 使用项目的时间戳进行翻译 // 使用项目的时间戳进行翻译
translateText(text, translationHistory.last.timestamp, isFinal: true); translateText(text, translationHistory.last.timestamp, isFinal: true);
} else { } else {
@ -526,14 +537,16 @@ class TranslationController extends GetxController {
translationHistory.last.sessionId != currentSessionId, translationHistory.last.sessionId != currentSessionId,
isIntermediate: false, isIntermediate: false,
); );
if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) {
translationHistory.add(newItem); _asrService.setPause();
translationHistory.refresh(); } else {
_scrollToBottom(); translationHistory.add(newItem);
saveTranslationHistory(); translationHistory.refresh();
_scrollToBottom();
// 使用新项目的时间戳进行翻译 saveTranslationHistory();
translateText(text, newItem.timestamp, isFinal: true); // 使用新项目的时间戳进行翻译
translateText(text, newItem.timestamp, isFinal: true);
}
} }
} }
@ -546,13 +559,33 @@ class TranslationController extends GetxController {
String? translationResult; String? translationResult;
try { try {
// 根据检测到的语言确定源语言和目标语言 var detectedSourceLanguageCode;
final bool shouldSwap = detectedLanguageCode == sourceLanguageCode.value; var detectedTargetLanguageCode;
final detectedSourceLanguageCode = if ((currentMode.value == 'faceToFace' && activeSpeaker.value == 1) ||
shouldSwap ? sourceLanguageCode.value : targetLanguageCode.value; (currentMode.value == 'faceToFace' &&
final detectedTargetLanguageCode = activeSpeaker.value == 0 &&
shouldSwap ? targetLanguageCode.value : sourceLanguageCode.value; lastActiveSpeaker.value == 1)) {
detectedLanguageCode = sourceLanguageCode.value;
detectedSourceLanguageCode = sourceLanguageCode.value;
detectedTargetLanguageCode = targetLanguageCode.value;
} else if ((currentMode.value == 'faceToFace' &&
activeSpeaker.value == 2) ||
(currentMode.value == 'faceToFace' &&
activeSpeaker.value == 0 &&
lastActiveSpeaker.value == 2)) {
// 根据检测到的语言确定源语言和目标语言
detectedLanguageCode = targetLanguageCode.value;
detectedSourceLanguageCode = targetLanguageCode.value;
detectedTargetLanguageCode = sourceLanguageCode.value;
} else {
// 根据检测到的语言确定源语言和目标语言
final bool shouldSwap =
detectedLanguageCode == sourceLanguageCode.value;
detectedSourceLanguageCode =
shouldSwap ? sourceLanguageCode.value : targetLanguageCode.value;
detectedTargetLanguageCode =
shouldSwap ? targetLanguageCode.value : sourceLanguageCode.value;
}
// 调用翻译服务 // 调用翻译服务
translationResult = await _translationService.translateText( translationResult = await _translationService.translateText(
text: sourceText, text: sourceText,
@ -560,6 +593,7 @@ class TranslationController extends GetxController {
targetLanguageCode: detectedTargetLanguageCode, targetLanguageCode: detectedTargetLanguageCode,
); );
/// }
if (translationResult != null) { if (translationResult != null) {
// 查找匹配的项目 - 优先使用timestamp查找 // 查找匹配的项目 - 优先使用timestamp查找
int index = -1; int index = -1;
@ -577,14 +611,16 @@ class TranslationController extends GetxController {
saveTranslationHistory(); saveTranslationHistory();
// 更新后滚动到底部 // 更新后滚动到底部
_scrollToBottom(); _scrollToBottom();
if (isFinal && currentMode.value == 'faceToFace') { // 播放TTS - 只在最终结果时播放
print("音频输出文本2$translationResult"); if (isTtsEnabled.value &&
isFinal &&
currentMode.value != 'faceToFace') {
await playTranslatedText(translationResult);
} else {
fTFTranslationResult = fTFTranslationResult =
(fTFTranslationResult ?? '') + translationResult; (fTFTranslationResult ?? '') + translationResult;
if (activeSpeaker.value == 0 && if (activeSpeaker.value == 0 && !isPlayback) {
!isPlayback &&
currentMode.value == 'faceToFace') {
isPlayback = true; isPlayback = true;
await _ttsService.setAudioOutputDevice(lastActiveSpeaker.value); await _ttsService.setAudioOutputDevice(lastActiveSpeaker.value);
await Future.delayed(const Duration(milliseconds: 1300)); await Future.delayed(const Duration(milliseconds: 1300));
@ -592,12 +628,6 @@ class TranslationController extends GetxController {
fTFTranslationResult = ''; fTFTranslationResult = '';
} }
} }
// 播放TTS - 只在最终结果时播放
if (isTtsEnabled.value &&
isFinal &&
currentMode.value != 'faceToFace') {
await playTranslatedText(translationResult);
}
} else { } else {
Logger.info( Logger.info(
'未找到匹配的历史项 ${sourceText} ${timestamp.toIso8601String() ?? "无时间戳"}'); '未找到匹配的历史项 ${sourceText} ${timestamp.toIso8601String() ?? "无时间戳"}');
@ -623,7 +653,6 @@ class TranslationController extends GetxController {
final voiceName = _languageManager final voiceName = _languageManager
.getTtsVoiceNameByAsrCode(detectedTargetLanguageCode) ?? .getTtsVoiceNameByAsrCode(detectedTargetLanguageCode) ??
'en-US-AriaNeural'; 'en-US-AriaNeural';
await _ttsService.setVoice(voiceName); await _ttsService.setVoice(voiceName);
await _ttsService.speakOnce(text); await _ttsService.speakOnce(text);
} catch (e) { } catch (e) {

8
lib/modules/translation/views/translation_list_view.dart

@ -340,7 +340,11 @@ class TranslationListView extends GetView<TranslationListController> {
FileSystemEntity file, FileSystemEntity file,
) { ) {
final TextEditingController _renameController = TextEditingController( final TextEditingController _renameController = TextEditingController(
text: file.path.split('/').last, text: () {
final fileName = file.path.split('/').last;
final dotIndex = fileName.lastIndexOf('.');
return dotIndex != -1 ? fileName.substring(0, dotIndex) : fileName;
}(),
); );
Get.bottomSheet( Get.bottomSheet(
@ -432,7 +436,7 @@ class TranslationListView extends GetView<TranslationListController> {
if (newName.isEmpty) return; if (newName.isEmpty) return;
final dir = file.parent.path; final dir = file.parent.path;
final newPath = '$dir/$newName'; final newPath = '$dir/$newName.wav';
try { try {
await file.rename(newPath); await file.rename(newPath);

26
lib/modules/translation/views/translation_view.dart

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -528,27 +530,29 @@ class TranslationView extends GetView<TranslationController> {
}) { }) {
bool isActive = activeSpeaker == speakerId; bool isActive = activeSpeaker == speakerId;
bool isDisabled = activeSpeaker != 0 && activeSpeaker != speakerId; bool isDisabled = activeSpeaker != 0 && activeSpeaker != speakerId;
Timer? _holdTimer; // 增加延迟触发的计时器
return Listener( return Listener(
onPointerDown: (_) { onPointerDown: (_) {
if (activeSpeaker == 0) { // 设置300ms延迟防止误触
// 没有激活的按钮时才能激活 _holdTimer = Timer(const Duration(milliseconds: 200), () {
if (speakerId == 1) { if (activeSpeaker == 0) {
// 耳机收音 - 恢复原始音频状态 if (speakerId == 1) {
controller.restoreOriginalAudioState(); controller.restoreOriginalAudioState();
} else { } else {
// 手机收音 - 禁用蓝牙音频 controller.disableBluetoothAudio();
controller.disableBluetoothAudio(); }
controller.setActiveSpeaker(speakerId);
} }
controller.setActiveSpeaker(speakerId); });
}
}, },
onPointerUp: (_) { onPointerUp: (_) {
_holdTimer?.cancel();
if (isActive) { if (isActive) {
controller.setActiveSpeaker(0); controller.setActiveSpeaker(0);
} }
}, },
onPointerCancel: (_) { onPointerCancel: (_) {
_holdTimer?.cancel();
if (isActive) { if (isActive) {
controller.setActiveSpeaker(0); controller.setActiveSpeaker(0);
} }

Loading…
Cancel
Save