From 0ebaf2e26247c20f7ef15713bdd8f59caebe46a1 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 5 Jan 2026 17:50:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=AF=AD=E9=9F=B3=E6=9C=8D=E5=8A=A1):=20?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E8=AF=AD=E8=A8=80=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=A5=E6=94=AF=E6=8C=81=E6=9B=B4=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构语音服务中的语言处理逻辑,统一处理中文地区代码并支持从配置获取首选语言 优化语言匹配逻辑,确保在不同场景下都能正确设置语音合成参数 --- lib/data/services/ble_manager.dart | 43 +++++++++++++------ .../controllers/profile_controller.dart | 15 +++---- .../controllers/settings_controller.dart | 24 +++++++---- .../agent_service/AgentService.kt | 10 ++++- .../agent_service/AgentServiceImpl.swift | 5 ++- 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index c0afa44cf..2b8a6ffa8 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -12,6 +12,7 @@ import '../models/user_Info.dart' as userInfo; import '/data/models/appconfig_model.dart'; import '../../data/models/appconfig.dart'; +import '../../core/translations/app_translations.dart'; import '../../core/utils/logger.dart'; import 'bluetooth_manager.dart'; import 'language_manager.dart'; @@ -900,30 +901,44 @@ class BleManager extends GetxService { // 用户设置了特定语言 final parts = savedLanguage.split('_'); if (parts.length == 2) { - final asrCode = languageManager.getAsrCodeByShortCode(parts[0]); - if (asrCode != null) { - supportedLanguages.add(asrCode); + final lang = parts[0]; + final country = parts[1].toUpperCase(); + + if (lang == 'zh' && + (country == 'HK' || country == 'TW' || country == 'CN')) { + supportedLanguages.add('zh-$country'); } else { - // 直接使用语言-国家格式 - supportedLanguages.add('${parts[0]}-${parts[1]}'); + final asrCode = languageManager.getAsrCodeByShortCode(lang); + if (asrCode != null) { + supportedLanguages.add(asrCode); + } else { + supportedLanguages.add('$lang-$country'); + } } } } else { // 跟随系统语言或未设置 - final appLocale = Get.locale; + final appLocale = Get.locale ?? AppTranslations.deviceLocale(); 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'); + if (lang.toLowerCase() == 'zh' && + country != null && + country.isNotEmpty && + (country.toUpperCase() == 'HK' || + country.toUpperCase() == 'TW' || + country.toUpperCase() == 'CN')) { + supportedLanguages.add('zh-${country.toUpperCase()}'); } else { - supportedLanguages.add('en-US'); // 默认英语 + final asrCode = languageManager.getAsrCodeByShortCode(lang); + if (asrCode != null) { + supportedLanguages.add(asrCode); + } else if (country != null && country.isNotEmpty) { + supportedLanguages.add('$lang-$country'); + } else { + supportedLanguages.add('en-US'); + } } } } diff --git a/lib/modules/profile/controllers/profile_controller.dart b/lib/modules/profile/controllers/profile_controller.dart index 50493ad08..1acc3db48 100644 --- a/lib/modules/profile/controllers/profile_controller.dart +++ b/lib/modules/profile/controllers/profile_controller.dart @@ -1,23 +1,22 @@ -import '/data/services/user_portrait.dart'; +import 'dart:io'; + import 'package:dio/dio.dart' as dio; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:logger/logger.dart'; -import '../../../data/models/user_Info.dart'; -import 'dart:io'; -//import 'dart:convert'; import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:path_provider/path_provider.dart'; -import '../../../data/services/network/api.dart'; import 'package:dio/dio.dart'; + +import '../../../data/models/user_Info.dart'; +import '../../../data/services/user_portrait.dart'; +import '../../../data/services/network/api.dart'; import '../../../routes/app_routes.dart'; -//import '../../../modules/login/controllers/googleLogin.dart'; -//import '../../../modules/login/controllers/facebookLogin.dart'; import '../../../data/services/account_service.dart'; -//import 'package:http_parser/http_parser.dart'; // 新增此导入 +/// 个人资料页面控制器 class ProfileController extends GetxController { static ProfileController get to => Get.find(); diff --git a/lib/modules/settings/controllers/settings_controller.dart b/lib/modules/settings/controllers/settings_controller.dart index 4d6bb0ddc..ad328427c 100644 --- a/lib/modules/settings/controllers/settings_controller.dart +++ b/lib/modules/settings/controllers/settings_controller.dart @@ -137,7 +137,7 @@ class SettingsController extends GetxController { await _updateAgentLanguageSettings(selectedLanguage); // 显示语言切换成功提示 - Logger().i("语言切换成功: ${selectedLanguage.value}"); + Logger().i("lxm--语言切换成功: ${selectedLanguage.value}"); // 延迟一下确保语言更新完成,然后重新进入应用 await Future.delayed(const Duration(milliseconds: 500)); @@ -161,8 +161,9 @@ class SettingsController extends GetxController { // 跟随系统语言 final deviceLocale = Get.deviceLocale; if (deviceLocale != null) { - final lang = deviceLocale.languageCode; - final country = deviceLocale.countryCode; + final matchedLocale = AppTranslations.getMatchedLocale(deviceLocale); + final lang = matchedLocale.languageCode; + final country = matchedLocale.countryCode; if (country != null && country.isNotEmpty) { supportedLanguages.add('$lang-$country'); } else { @@ -181,12 +182,19 @@ class SettingsController extends GetxController { // 根据选择的语言值映射到ASR代码 final parts = languageModel.value.split('_'); if (parts.length == 2) { - final asrCode = languageManager.getAsrCodeByShortCode(parts[0]); - if (asrCode != null) { - supportedLanguages.add(asrCode); + final lang = parts[0]; + final country = parts[1].toUpperCase(); + + if (lang == 'zh' && + (country == 'HK' || country == 'TW' || country == 'CN')) { + supportedLanguages.add('zh-$country'); } else { - // 直接使用语言-国家格式 - supportedLanguages.add('${parts[0]}-${parts[1]}'); + final asrCode = languageManager.getAsrCodeByShortCode(lang); + if (asrCode != null) { + supportedLanguages.add(asrCode); + } else { + supportedLanguages.add('$lang-$country'); + } } } } 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 7b71a8058..cfe3c3461 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 @@ -380,7 +380,10 @@ object AgentService : CoroutineScope { // 从配置中获取TTS参数 val ttsAppId = config["volcanoAppId"]?.toString() ?: "" val ttsAppToken = config["volcanoToken"]?.toString() ?: "" - val ttsLanguage = config["ttsLanguage"]?.toString() ?: "zh-CN" + val supportedLanguages = (config["supportedLanguages"] as? List<*>)?.mapNotNull { it as? String } + val ttsLanguage = config["ttsLanguage"]?.toString()?.takeIf { it.isNotBlank() } + ?: supportedLanguages?.firstOrNull() + ?: "zh-CN" // 创建并初始化BytedanceTTS val azureTtsHelper = AzureTtsHelper(context) @@ -396,6 +399,11 @@ object AgentService : CoroutineScope { if (!success) { Log.e(TAG, "Bytedance TTS服务初始化失败") + } else { + val voiceName = getTtsVoiceNameByAsrCode(ttsLanguage) + if (voiceName.isNotEmpty()) { + ttsService?.setVoice(voiceName) + } } // 添加TTS事件监听 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 10d2d58e1..b75f9ede4 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 @@ -311,6 +311,7 @@ class AgentServiceImpl: NSObject { // 获取支持的语言列表,支持从配置中读取 let supportedLanguages = config["supportedLanguages"] as? [String] ?? ["zh-CN"] + let primaryLanguage = supportedLanguages.first ?? "zh-CN" guard let asrSuccess = azureAsrHelper?.initialize( subscriptionKey: azureSpeechKey, @@ -335,13 +336,13 @@ class AgentServiceImpl: NSObject { ttsAppId: "", ttsAppToken: azureSpeechKey, ttsResource: azureSpeechRegion, - language: "zh-CN" + language: primaryLanguage ), ttsSuccess else { sendError("初始化语音合成服务失败", code: "TTS_INIT_ERROR") return false } - _ = azureTtsHelper?.setVoice("zh-CN-XiaoxiaoNeural") + _ = azureTtsHelper?.setVoice(getTtsVoiceNameByAsrCode(primaryLanguage)) return true }