diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index ae0bf3ea5..f181dcc77 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -9,6 +9,7 @@ import 'package:get_storage/get_storage.dart'; import 'dart:convert'; import 'package:agent_service/agent_service.dart'; import 'bluetooth_manager.dart'; +import 'language_manager.dart'; // 重新导出BLE连接状态常量,让外部可以通过BleManager访问 export 'package:ble_service/ble_service.dart' show BleConnectionState; @@ -556,26 +557,44 @@ class BleManager extends GetxService { // 根据APP语言动态配置语音识别语言 List supportedLanguages = []; try { - // 使用 GetX 获取 APP 当前语言环境 (Locale) - final appLocale = Get.locale; - - if (appLocale != null) { - final lang = appLocale.languageCode; // e.g., 'en' - final country = appLocale.countryCode; // e.g., 'US' - - // 构造 Azure SDK 需要的格式 (e.g., 'en-US') - if (country != null && country.isNotEmpty) { - supportedLanguages.add('$lang-$country'); - } else { - supportedLanguages.add(lang); // fallback only language code + final storage = GetStorage(); + final languageManager = Get.find(); + + // 从存储中读取用户设置的语言 + String? savedLanguage = storage.read('language'); + + if (savedLanguage != null && savedLanguage != 'system') { + // 用户设置了特定语言 + final parts = savedLanguage.split('_'); + if (parts.length == 2) { + final asrCode = languageManager.getAsrCodeByShortCode(parts[0]); + if (asrCode != null) { + supportedLanguages.add(asrCode); + } else { + // 直接使用语言-国家格式 + supportedLanguages.add('${parts[0]}-${parts[1]}'); + } + } + } else { + // 跟随系统语言或未设置 + final appLocale = Get.locale; + if (appLocale != null) { + final lang = appLocale.languageCode; + final country = appLocale.countryCode; + + // 尝试从语言管理器获取对应的ASR代码 + final asrCode = languageManager.getAsrCodeByShortCode(lang); + if (asrCode != null) { + supportedLanguages.add(asrCode); + } else if (country != null && country.isNotEmpty) { + // 构造 Azure SDK 需要的格式 (e.g., 'en-US') + supportedLanguages.add('$lang-$country'); + } else { + supportedLanguages.add('en-US'); // 默认英语 + } } } - // 添加 en-US 作为备选 - // if (!supportedLanguages.contains('en-US')) { - // supportedLanguages.add('en-US'); - // } - // 最终兜底 if (supportedLanguages.isEmpty) { supportedLanguages.add('en-US'); diff --git a/lib/modules/settings/controllers/settings_controller.dart b/lib/modules/settings/controllers/settings_controller.dart index 0f84a5059..4553f3d1d 100644 --- a/lib/modules/settings/controllers/settings_controller.dart +++ b/lib/modules/settings/controllers/settings_controller.dart @@ -9,6 +9,7 @@ import '../../../routes/app_routes.dart'; import '../models/language_model.dart'; import 'package:logger/logger.dart'; import '../../../data/services/ble_manager.dart'; +import '../../../data/services/language_manager.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -393,6 +394,10 @@ class SettingsController extends GetxController { print("languageList: ${data.value}"); language.value = data; _storage.write('language', data.value); + + // 更新agent服务的语音识别语言设置 + await _updateAgentLanguageSettings(data); + // 延迟一下确保语言更新完成,然后重新进入应用 await Future.delayed(const Duration(milliseconds: 500)); @@ -401,6 +406,66 @@ class SettingsController extends GetxController { Get.back(); } + /// 更新agent服务的语音识别语言设置 + Future _updateAgentLanguageSettings(LanguageModel languageModel) async { + try { + final languageManager = Get.find(); + List supportedLanguages = []; + + // 根据选择的语言设置对应的ASR语言代码 + if (languageModel.value == 'system') { + // 跟随系统语言 + final deviceLocale = Get.deviceLocale; + if (deviceLocale != null) { + final lang = deviceLocale.languageCode; + final country = deviceLocale.countryCode; + if (country != null && country.isNotEmpty) { + supportedLanguages.add('$lang-$country'); + } else { + // 根据语言代码映射到对应的ASR代码 + final asrCode = languageManager.getAsrCodeByShortCode(lang); + if (asrCode != null) { + supportedLanguages.add(asrCode); + } else { + supportedLanguages.add('en-US'); // 默认英语 + } + } + } else { + supportedLanguages.add('en-US'); // 默认英语 + } + } else { + // 根据选择的语言值映射到ASR代码 + final parts = languageModel.value.split('_'); + if (parts.length == 2) { + final asrCode = languageManager.getAsrCodeByShortCode(parts[0]); + if (asrCode != null) { + supportedLanguages.add(asrCode); + } else { + // 直接使用语言-国家格式 + supportedLanguages.add('${parts[0]}-${parts[1]}'); + } + } + } + + // 确保至少有一个语言 + if (supportedLanguages.isEmpty) { + supportedLanguages.add('en-US'); + } + + Logger().i('更新agent服务语音识别语言: ${supportedLanguages.join(', ')}'); + + // 调用agent服务更新语言设置 + final success = await AgentService.setSupportedLanguages(supportedLanguages); + if (success) { + Logger().i('agent服务语言设置更新成功'); + } else { + Logger().w('agent服务语言设置更新失败'); + } + } catch (e) { + Logger().e('更新agent服务语言设置时出错: $e'); + } + } + // 加载当前语音服务类型 void _loadCurrentSpeechServiceType() { try { diff --git a/local_plugins/agent_service/lib/agent_service.dart b/local_plugins/agent_service/lib/agent_service.dart index 5871bd8fe..e3e2eb1c4 100644 --- a/local_plugins/agent_service/lib/agent_service.dart +++ b/local_plugins/agent_service/lib/agent_service.dart @@ -402,6 +402,21 @@ class AgentService { } } + /// 设置支持的语音识别语言 + /// + /// [languages] 支持的语言列表,如 ["zh-CN", "en-US"] + /// 返回是否设置成功 + static Future setSupportedLanguages(List languages) async { + try { + final bool result = await _channel.invokeMethod('setSupportedLanguages', { + 'languages': languages, + }); + return result; + } on PlatformException catch (e) { + throw AgentServiceException(e.code, e.message ?? '设置支持语言失败', e.details); + } + } + /// 释放资源 static Future dispose() async { try {