diff --git a/lib/modules/picture_translation/controllers/picture_translation_controller.dart b/lib/modules/picture_translation/controllers/picture_translation_controller.dart index abd55af47..1044eb86f 100644 --- a/lib/modules/picture_translation/controllers/picture_translation_controller.dart +++ b/lib/modules/picture_translation/controllers/picture_translation_controller.dart @@ -26,13 +26,15 @@ class PictureTranslationController extends GetxController { final LanguageManager languageManager = Get.find(); // UI状态 - final sourceLanguageChineseName = '中文(简体)'.obs; + final sourceLanguageChineseName = 'autoDetect'.obs; final targetLanguageChineseName = '英语'.obs; final sourceText = ''.obs; final translatedText = ''.obs; final translatedImageBytes = Rx(null); // 回贴后的图片二进制 final isProcessing = false.obs; final pickedImageFile = Rx(null); + final isSourceLanguageUserSet = false.obs; + final isTargetLanguageUserSet = false.obs; final currentStep = ProcessingStep( title: 'waitingForAction'.tr, // 等待操作 description: 'pleaseSelectImageToStart'.tr, // 请选择图片开始翻译 @@ -49,6 +51,7 @@ class PictureTranslationController extends GetxController { static const String _historyKey = 'picture_translation_history'; static const String _settingsKey = 'picture_translation_settings'; + String? _lastDetectedSourceLanguageCode; @override void onInit() { @@ -68,11 +71,76 @@ class PictureTranslationController extends GetxController { try { final settings = _storage.read(_settingsKey) as Map?; if (settings != null) { - sourceLanguageChineseName.value = - settings['sourceLanguage'] ?? '中文(简体)'; - targetLanguageChineseName.value = settings['targetLanguage'] ?? '英语'; + final langs = languageManager.getAllChineseNames(); + + final appDefaultTargetLanguage = _getLanguageByAppLocale(); + + final bool sourceUserSet = + (settings['sourceLanguageUserSet'] == true) || + ((settings['sourceLanguageUserSet'] == null) && + (settings['sourceLanguage'] != null) && + (settings['sourceLanguage'] != '中文(简体)')); + + bool targetUserSet = settings['targetLanguageUserSet'] == true; + final bool shouldMigrateTargetUserSetKey = + settings['targetLanguageUserSet'] == null; + if (shouldMigrateTargetUserSetKey) { + final savedTargetLanguage = settings['targetLanguage']; + if (savedTargetLanguage != null && + appDefaultTargetLanguage != null && + savedTargetLanguage == appDefaultTargetLanguage) { + settings.remove('targetLanguage'); + targetUserSet = false; + } else { + targetUserSet = savedTargetLanguage != null && + savedTargetLanguage != 'autoDetect' && + savedTargetLanguage != '英语'; + } + } + + isSourceLanguageUserSet.value = sourceUserSet; + isTargetLanguageUserSet.value = targetUserSet; + + final savedSourceLanguage = settings['sourceLanguage']; + if (sourceUserSet && + savedSourceLanguage != null && + (savedSourceLanguage == 'autoDetect' || + langs.contains(savedSourceLanguage))) { + sourceLanguageChineseName.value = savedSourceLanguage; + } else { + sourceLanguageChineseName.value = 'autoDetect'; + } + + final savedTargetLanguage = settings['targetLanguage']; + if (targetUserSet && + savedTargetLanguage != null && + savedTargetLanguage != 'autoDetect' && + langs.contains(savedTargetLanguage)) { + targetLanguageChineseName.value = savedTargetLanguage; + } else { + if (appDefaultTargetLanguage != null && + langs.contains(appDefaultTargetLanguage)) { + targetLanguageChineseName.value = appDefaultTargetLanguage; + } else { + targetLanguageChineseName.value = '英语'; + } + } + + if (shouldMigrateTargetUserSetKey) { + _saveSettings(); + } + imageQuality.value = settings['imageQuality'] ?? 85; maxImageSize.value = settings['maxImageSize'] ?? 1920; + } else { + final appDefaultTargetLanguage = _getLanguageByAppLocale(); + final langs = languageManager.getAllChineseNames(); + if (appDefaultTargetLanguage != null && + langs.contains(appDefaultTargetLanguage)) { + targetLanguageChineseName.value = appDefaultTargetLanguage; + } else { + targetLanguageChineseName.value = '英语'; + } } } catch (e) { Logger.error('PictureTranslation', '加载设置失败: $e'); @@ -83,8 +151,12 @@ class PictureTranslationController extends GetxController { void _saveSettings() { try { _storage.write(_settingsKey, { - 'sourceLanguage': sourceLanguageChineseName.value, - 'targetLanguage': targetLanguageChineseName.value, + if (isSourceLanguageUserSet.value) + 'sourceLanguage': sourceLanguageChineseName.value, + if (isTargetLanguageUserSet.value) + 'targetLanguage': targetLanguageChineseName.value, + 'sourceLanguageUserSet': isSourceLanguageUserSet.value, + 'targetLanguageUserSet': isTargetLanguageUserSet.value, 'imageQuality': imageQuality.value, 'maxImageSize': maxImageSize.value, }); @@ -323,7 +395,7 @@ class PictureTranslationController extends GetxController { final targetCode = languageManager .getAsrCodeByChineseName(targetLanguageChineseName.value) ?? - 'zh-CN'; + 'en-US'; final result = await _translationService.translateImage( imageBytes: bytes, @@ -355,6 +427,9 @@ class PictureTranslationController extends GetxController { sourceText.value = ''; translatedText.value = ''; } + + _lastDetectedSourceLanguageCode = + _resolveDetectedSourceLanguageAsrCode(result); } catch (e) { Logger.error('PictureTranslation', '图片翻译调用失败: $e'); _updateStep( @@ -370,9 +445,17 @@ class PictureTranslationController extends GetxController { /// 保存翻译结果 Future _saveTranslationResult(File imageFile) async { try { - final sourceCode = languageManager - .getAsrCodeByChineseName(sourceLanguageChineseName.value) ?? - 'zh-CN'; + String sourceCode = 'zh-CN'; + if (isSourceLanguageUserSet.value && + sourceLanguageChineseName.value != 'autoDetect') { + sourceCode = languageManager + .getAsrCodeByChineseName(sourceLanguageChineseName.value) ?? + 'zh-CN'; + } else if (_lastDetectedSourceLanguageCode != null && + _lastDetectedSourceLanguageCode!.isNotEmpty) { + sourceCode = _lastDetectedSourceLanguageCode!; + } + final targetCode = languageManager .getAsrCodeByChineseName(targetLanguageChineseName.value) ?? 'en-US'; @@ -413,6 +496,7 @@ class PictureTranslationController extends GetxController { void setSourceLanguage(String language) { if (sourceLanguageChineseName.value != language) { sourceLanguageChineseName.value = language; + isSourceLanguageUserSet.value = language != 'autoDetect'; _saveSettings(); } } @@ -420,13 +504,20 @@ class PictureTranslationController extends GetxController { /// 设置目标语言 void setTargetLanguage(String language) { if (targetLanguageChineseName.value != language) { + if (language == 'autoDetect') return; targetLanguageChineseName.value = language; + isTargetLanguageUserSet.value = true; _saveSettings(); } } /// 交换语言 void swapLanguages() { + if (sourceLanguageChineseName.value == 'autoDetect' || + targetLanguageChineseName.value == 'autoDetect') { + return; + } + final temp = sourceLanguageChineseName.value; sourceLanguageChineseName.value = targetLanguageChineseName.value; targetLanguageChineseName.value = temp; @@ -436,6 +527,8 @@ class PictureTranslationController extends GetxController { sourceText.value = translatedText.value; translatedText.value = tempText; + isSourceLanguageUserSet.value = true; + isTargetLanguageUserSet.value = true; _saveSettings(); } @@ -460,4 +553,42 @@ class PictureTranslationController extends GetxController { 'pleaseSelectImageToStart'.tr, // 请选择图片开始翻译 ProcessingStatus.idle); } + + String? _getLanguageByAppLocale() { + final Locale? locale = Get.locale ?? Get.deviceLocale; + if (locale == null) return null; + + final languageCode = locale.languageCode.toLowerCase(); + final countryCode = locale.countryCode?.toUpperCase(); + final scriptCode = locale.scriptCode; + + if (languageCode == 'zh') { + if (countryCode == 'HK' || countryCode == 'MO') { + return languageManager.getChineseNameByAsrCode('zh-HK'); + } + if (countryCode == 'TW') { + return languageManager.getChineseNameByAsrCode('zh-TW'); + } + if (scriptCode == 'Hant') { + return languageManager.getChineseNameByAsrCode('zh-TW'); + } + return languageManager.getChineseNameByAsrCode('zh-CN'); + } + + final normalizedShortCode = switch (languageCode) { + 'nb' => 'no', + _ => languageCode, + }; + + return languageManager.getChineseNameByShortCode(normalizedShortCode); + } + + String? _resolveDetectedSourceLanguageAsrCode(ImageTranslationResult result) { + final shortCode = result.detectedLanguage ?? + (result.blocks.isNotEmpty + ? result.blocks.first.detectedLanguage + : null); + if (shortCode == null || shortCode.isEmpty) return null; + return languageManager.getAsrCodeByShortCode(shortCode); + } } diff --git a/lib/modules/picture_translation/views/picture_translation_view.dart b/lib/modules/picture_translation/views/picture_translation_view.dart index b53acb156..453d8f9fa 100644 --- a/lib/modules/picture_translation/views/picture_translation_view.dart +++ b/lib/modules/picture_translation/views/picture_translation_view.dart @@ -242,7 +242,7 @@ class PictureTranslationView extends GetView { isDarkMode, languages: langs, currentLanguage: currentLanguage, - includeAutoDetect: true, // 图片翻译也支持自动检测 + includeAutoDetect: isSource, translateLanguageNames: true, // 开启多语言显示,语言中文名作为翻译键 onSelected: (name) { if (isSource) { diff --git a/lib/modules/text_translation/controllers/text_translation_controller.dart b/lib/modules/text_translation/controllers/text_translation_controller.dart index 131a560f1..76c0a0345 100644 --- a/lib/modules/text_translation/controllers/text_translation_controller.dart +++ b/lib/modules/text_translation/controllers/text_translation_controller.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../../../data/services/volcano_translation_service.dart'; import '../../../data/services/language_manager.dart'; @@ -17,13 +16,20 @@ class TextTranslationController extends GetxController { final LanguageManager _languageManager = Get.find(); final GetStorage _storage = GetStorage(); + static const String _sourceLanguageKey = 'text_translation_source_language'; + static const String _targetLanguageKey = 'text_translation_target_language'; + static const String _sourceLanguageUserSetKey = + 'text_translation_source_language_user_set'; + static const String _targetLanguageUserSetKey = + 'text_translation_target_language_user_set'; + // 文本输入控制器 final TextEditingController textController = TextEditingController(); // 响应式状态 - final sourceLanguageChineseName = '中文(简体)'.obs; + final sourceLanguageChineseName = 'autoDetect'.obs; final targetLanguageChineseName = '英语'.obs; - final sourceLanguageCode = 'zh-CN'.obs; + final sourceLanguageCode = ''.obs; final targetLanguageCode = 'en-US'.obs; final translatedText = ''.obs; final isTranslating = false.obs; @@ -83,44 +89,78 @@ class TextTranslationController extends GetxController { /// 加载保存的语言设置 void _loadSavedLanguages() { try { - final savedSourceLanguage = - _storage.read('text_translation_source_language'); - final savedTargetLanguage = - _storage.read('text_translation_target_language'); + final String? savedSourceLanguage = _storage.read(_sourceLanguageKey); + String? savedTargetLanguage = _storage.read(_targetLanguageKey); + + final appDefaultTargetLanguage = _getLanguageByAppLocale(); + final bool sourceUserSet = + _storage.read(_sourceLanguageUserSetKey) ?? false; + + bool targetUserSet = _storage.read(_targetLanguageUserSetKey) ?? false; + final bool targetUserSetKeyExists = + _storage.hasData(_targetLanguageUserSetKey); + if (!targetUserSetKeyExists) { + if (savedTargetLanguage != null && + appDefaultTargetLanguage != null && + savedTargetLanguage == appDefaultTargetLanguage) { + savedTargetLanguage = null; + _storage.remove(_targetLanguageKey); + targetUserSet = false; + } else { + targetUserSet = savedTargetLanguage != null; + } + _storage.write(_targetLanguageUserSetKey, targetUserSet); + } - if (savedSourceLanguage != null && - supportedLanguages.contains(savedSourceLanguage)) { + if (sourceUserSet && + savedSourceLanguage != null && + (savedSourceLanguage == 'autoDetect' || + supportedLanguages.contains(savedSourceLanguage))) { sourceLanguageChineseName.value = savedSourceLanguage; - // 同时更新语言代码 - final asrCode = - _languageManager.getAsrCodeByChineseName(savedSourceLanguage); - if (asrCode != null) { - sourceLanguageCode.value = asrCode; + if (savedSourceLanguage == 'autoDetect') { + sourceLanguageCode.value = ''; + } else { + final asrCode = + _languageManager.getAsrCodeByChineseName(savedSourceLanguage); + if (asrCode != null) sourceLanguageCode.value = asrCode; } + } else { + sourceLanguageChineseName.value = 'autoDetect'; + sourceLanguageCode.value = ''; } - if (savedTargetLanguage != null && + if (targetUserSet && + savedTargetLanguage != null && + savedTargetLanguage != 'autoDetect' && supportedLanguages.contains(savedTargetLanguage)) { targetLanguageChineseName.value = savedTargetLanguage; - // 同时更新语言代码 final asrCode = _languageManager.getAsrCodeByChineseName(savedTargetLanguage); - if (asrCode != null) { - targetLanguageCode.value = asrCode; - } + if (asrCode != null) targetLanguageCode.value = asrCode; + } else if (appDefaultTargetLanguage != null && + supportedLanguages.contains(appDefaultTargetLanguage)) { + targetLanguageChineseName.value = appDefaultTargetLanguage; + final asrCode = + _languageManager.getAsrCodeByChineseName(appDefaultTargetLanguage); + if (asrCode != null) targetLanguageCode.value = asrCode; + } else { + targetLanguageChineseName.value = '英语'; + targetLanguageCode.value = 'en-US'; } } catch (e) { Logger.error('加载语言设置失败: $e'); } } - /// 保存语言设置 - void _saveLanguageSettings() { + void _saveLanguageSettings( + {required bool saveSource, required bool saveTarget}) { try { - _storage.write( - 'text_translation_source_language', sourceLanguageChineseName.value); - _storage.write( - 'text_translation_target_language', targetLanguageChineseName.value); + if (saveSource) { + _storage.write(_sourceLanguageKey, sourceLanguageChineseName.value); + } + if (saveTarget) { + _storage.write(_targetLanguageKey, targetLanguageChineseName.value); + } } catch (e) { Logger.error('保存语言设置失败: $e'); } @@ -131,7 +171,6 @@ class TextTranslationController extends GetxController { if (language != sourceLanguageChineseName.value) { sourceLanguageChineseName.value = language; - // 同时更新语言代码;当选择“自动检测”时,将源语言代码置空,后续翻译流程会进行语种检测 if (language == 'autoDetect') { sourceLanguageCode.value = ''; } else { @@ -141,7 +180,11 @@ class TextTranslationController extends GetxController { } } - _saveLanguageSettings(); + _storage.write( + _sourceLanguageUserSetKey, + language != 'autoDetect', + ); + _saveLanguageSettings(saveSource: true, saveTarget: false); // 如果已有翻译结果,清空结果 if (translatedText.value.isNotEmpty) { @@ -161,7 +204,8 @@ class TextTranslationController extends GetxController { targetLanguageCode.value = asrCode; } - _saveLanguageSettings(); + _storage.write(_targetLanguageUserSetKey, true); + _saveLanguageSettings(saveSource: false, saveTarget: true); // 如果已有翻译结果,清空结果 if (translatedText.value.isNotEmpty) { @@ -172,6 +216,11 @@ class TextTranslationController extends GetxController { /// 交换源语言和目标语言 void swapLanguages() { + if (sourceLanguageChineseName.value == 'autoDetect' || + targetLanguageChineseName.value == 'autoDetect') { + return; + } + final tempSource = sourceLanguageChineseName.value; final tempTarget = targetLanguageChineseName.value; final tempSourceCode = sourceLanguageCode.value; @@ -188,7 +237,9 @@ class TextTranslationController extends GetxController { textController.text = tempTranslatedText; translatedText.value = tempInputText; - _saveLanguageSettings(); + _storage.write(_sourceLanguageUserSetKey, true); + _storage.write(_targetLanguageUserSetKey, true); + _saveLanguageSettings(saveSource: true, saveTarget: true); } /// 执行翻译 @@ -269,6 +320,11 @@ class TextTranslationController extends GetxController { Logger.info('语种检测结果: $detectedAsrCode'); } + if (sourceLanguageCode.value == targetLanguageCode.value) { + translatedText.value = text; + return; + } + // 调用翻译服务,使用检测或手动选择的源语言代码 final result = await _translationService.translateText( text: text, @@ -331,7 +387,7 @@ class TextTranslationController extends GetxController { currentLanguage: isSourceLanguage ? sourceLanguageChineseName.value : targetLanguageChineseName.value, - includeAutoDetect: true, // 文本翻译源语言保留“自动检测” + includeAutoDetect: isSourceLanguage, translateLanguageNames: true, // 开启多语言显示,语言中文名作为翻译键 onSelected: (name) { if (isSourceLanguage) { @@ -342,4 +398,33 @@ class TextTranslationController extends GetxController { }, ); } + + String? _getLanguageByAppLocale() { + final Locale? locale = Get.locale ?? Get.deviceLocale; + if (locale == null) return null; + + final languageCode = locale.languageCode.toLowerCase(); + final countryCode = locale.countryCode?.toUpperCase(); + final scriptCode = locale.scriptCode; + + if (languageCode == 'zh') { + if (countryCode == 'HK' || countryCode == 'MO') { + return _languageManager.getChineseNameByAsrCode('zh-HK'); + } + if (countryCode == 'TW') { + return _languageManager.getChineseNameByAsrCode('zh-TW'); + } + if (scriptCode == 'Hant') { + return _languageManager.getChineseNameByAsrCode('zh-TW'); + } + return _languageManager.getChineseNameByAsrCode('zh-CN'); + } + + final normalizedShortCode = switch (languageCode) { + 'nb' => 'no', + _ => languageCode, + }; + + return _languageManager.getChineseNameByShortCode(normalizedShortCode); + } } diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 8ceb5a382..1b6a57edd 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -79,6 +79,8 @@ class TranslationController extends GetxController with WidgetsBindingObserver { // 存储相关配置 static const String _sourceLanguageKey = 'translation_source_language'; static const String _targetLanguageKey = 'translation_target_language'; + static const String _sourceLanguageUserSetKey = + 'translation_source_language_user_set'; // 添加悬浮按钮位置存储键 static const String _floatingButtonPositionKey = 'floating_button_position'; @@ -544,16 +546,27 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// 加载保存的语言设置 void _loadSavedLanguages() { + final appDefaultSourceLanguage = _getSourceLanguageByAppLocale(); final savedSourceLanguage = _storage.read(_sourceLanguageKey); final savedTargetLanguage = _storage.read(_targetLanguageKey); + final bool isSourceLanguageUserSet = + (_storage.read(_sourceLanguageUserSetKey) ?? false) == true; - if (savedSourceLanguage != null && - supportedLanguages.containsKey(savedSourceLanguage)) { + final bool isSavedSourceValid = savedSourceLanguage != null && + supportedLanguages.containsKey(savedSourceLanguage); + final bool isSavedTargetValid = savedTargetLanguage != null && + supportedLanguages.containsKey(savedTargetLanguage); + + if (isSourceLanguageUserSet && isSavedSourceValid) { + sourceLanguage.value = savedSourceLanguage; + } else if (appDefaultSourceLanguage != null && + supportedLanguages.containsKey(appDefaultSourceLanguage)) { + sourceLanguage.value = appDefaultSourceLanguage; + } else if (isSavedSourceValid) { sourceLanguage.value = savedSourceLanguage; } - if (savedTargetLanguage != null && - supportedLanguages.containsKey(savedTargetLanguage)) { + if (isSavedTargetValid) { targetLanguage.value = savedTargetLanguage; } @@ -580,12 +593,47 @@ class TranslationController extends GetxController with WidgetsBindingObserver { }); } - /// 保存当前语言设置 - void _saveLanguageSettings() { + void _saveSourceLanguageSetting({required bool isUserSet}) { _storage.write(_sourceLanguageKey, sourceLanguage.value); + if (isUserSet) { + _storage.write(_sourceLanguageUserSetKey, true); + } + } + + void _saveTargetLanguageSetting() { _storage.write(_targetLanguageKey, targetLanguage.value); } + ///根据当前系统语言获取默认源语言 + String? _getSourceLanguageByAppLocale() { + final Locale? locale = Get.locale ?? Get.deviceLocale; + if (locale == null) return null; + + final languageCode = locale.languageCode.toLowerCase(); + final countryCode = locale.countryCode?.toUpperCase(); + final scriptCode = locale.scriptCode; + + if (languageCode == 'zh') { + if (countryCode == 'HK' || countryCode == 'MO') { + return _languageManager.getChineseNameByAsrCode('zh-HK'); + } + if (countryCode == 'TW') { + return _languageManager.getChineseNameByAsrCode('zh-TW'); + } + if (scriptCode == 'Hant') { + return _languageManager.getChineseNameByAsrCode('zh-TW'); + } + return _languageManager.getChineseNameByAsrCode('zh-CN'); + } + + final normalizedShortCode = switch (languageCode) { + 'nb' => 'no', + _ => languageCode, + }; + + return _languageManager.getChineseNameByShortCode(normalizedShortCode); + } + /// 请求录音权限 /// 返回是否授权成功 Future requestRecordPermission() async { @@ -1581,7 +1629,8 @@ class TranslationController extends GetxController with WidgetsBindingObserver { sourceLanguageCode.value = targetLanguageCode.value; targetLanguageCode.value = tempCode; - _saveLanguageSettings(); + _saveSourceLanguageSetting(isUserSet: true); + _saveTargetLanguageSetting(); _reinitializeAsrService(); } @@ -1598,7 +1647,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { sourceLanguageCode.value = asrCode; } - _saveLanguageSettings(); + _saveSourceLanguageSetting(isUserSet: true); _reinitializeAsrService(); } } @@ -1616,7 +1665,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { targetLanguageCode.value = asrCode; } - _saveLanguageSettings(); + _saveTargetLanguageSetting(); _reinitializeAsrService(); } } diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index acbd4f4f1..7c7bb967c 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -383,7 +383,7 @@ object AgentService : CoroutineScope { restartIdleCheck() sendEvent("tts_started", mapOf("status" to "started")) // 停止气泡音,避免与TTS同时播放 - // audioPlayer?.stopAudio() + } TtsEventType.SYNTHESIS_COMPLETED -> { @@ -404,7 +404,7 @@ object AgentService : CoroutineScope { restartIdleCheck() sendEvent("playback_started", mapOf("status" to "playback_started")) // 确保气泡音已停止,避免与TTS播放重叠 - // audioPlayer?.stopAudio() + audioPlayer?.stopAudio() if(_isInterrupt.get()){ BleService.closeCodec() } @@ -1119,7 +1119,7 @@ object AgentService : CoroutineScope { if (reply && token.isNotEmpty()) { // 发送流式回复token sendEvent("assistant_token", mapOf("sessionid" to sessionid,"token" to token)) - audioPlayer?.stopAudio() + // audioPlayer?.stopAudio() } } catch (e: Exception) { Log.e(TAG, "liwei--------------- AI Call onToken 异常", e) @@ -1231,9 +1231,7 @@ object AgentService : CoroutineScope { try { Log.d( TAG, - "liwei--------------- AI Call onFunctionCallResult ${sessionid}:${functionCallResult.toString()}", - - ) + "liwei--------------- AI Call onFunctionCallResult ${sessionid}:${functionCallResult.toString()}",) audioPlayer?.stopAudio() val name = functionCall.get("name") as String; val resultmap = autoHandleFcunCallResult(name, functionCallResult); diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index bc5c8bcab..e8aeebc20 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -1701,9 +1701,9 @@ class ChatApiStreamCallback: StreamCallback { return } - if (token != "" && responseBuilder.isEmpty) { //关闭声音 - try agentService.audioPlayer?.stopAwaitSound() - } +// if (token != "" && responseBuilder.isEmpty) { //关闭声音 +// try agentService.audioPlayer?.stopAwaitSound() +// } responseBuilder += token if speakResponse && reply && broadcast{ @@ -1892,8 +1892,7 @@ extension AgentServiceImpl: TtsEventListener { isSpeaking = true restartIdleCheck() sendEvent(name: "tts_started", data: ["status": "started"]) - // audioPlayer?.stopAwaitSound() - + case .synthesisCompleted: isSpeaking = false restartIdleCheck() @@ -1902,6 +1901,7 @@ extension AgentServiceImpl: TtsEventListener { case .playbackStarted: restartIdleCheck() sendEvent(name: "playback_started", data: ["status": "playback_started"]) + audioPlayer?.stopAwaitSound() MusicService.shared.reduceVolume() if(isInterrupt){ //播报开始。打断唤醒输入 BleService.shared.closeCodec()