Browse Source

feat(语音服务): 改进语言处理逻辑以支持更多语言场景

重构语音服务中的语言处理逻辑,统一处理中文地区代码并支持从配置获取首选语言
优化语言匹配逻辑,确保在不同场景下都能正确设置语音合成参数
weicu
lxm 9 months ago
parent
commit
3814e2aa24
  1. 43
      lib/data/services/ble_manager.dart
  2. 15
      lib/modules/profile/controllers/profile_controller.dart
  3. 24
      lib/modules/settings/controllers/settings_controller.dart
  4. 10
      local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt
  5. 5
      local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift

43
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');
}
}
}
}

15
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();

24
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');
}
}
}
}

10
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事件监听

5
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
}

Loading…
Cancel
Save