Browse Source

feat(语音识别): 添加设置支持语言功能并改进语言处理逻辑

添加AgentService.setSupportedLanguages方法用于设置语音识别语言
改进BleManager和SettingsController中的语言处理逻辑,支持从存储读取用户设置
添加语言映射功能,通过LanguageManager处理语言代码转换
weicu
lxm 1 year ago
parent
commit
f5f2e5b551
  1. 53
      lib/data/services/ble_manager.dart
  2. 65
      lib/modules/settings/controllers/settings_controller.dart
  3. 15
      local_plugins/agent_service/lib/agent_service.dart

53
lib/data/services/ble_manager.dart

@ -9,6 +9,7 @@ import 'package:get_storage/get_storage.dart';
import 'dart:convert'; import 'dart:convert';
import 'package:agent_service/agent_service.dart'; import 'package:agent_service/agent_service.dart';
import 'bluetooth_manager.dart'; import 'bluetooth_manager.dart';
import 'language_manager.dart';
// 重新导出BLE连接状态常量,让外部可以通过BleManager访问 // 重新导出BLE连接状态常量,让外部可以通过BleManager访问
export 'package:ble_service/ble_service.dart' show BleConnectionState; export 'package:ble_service/ble_service.dart' show BleConnectionState;
@ -556,26 +557,44 @@ class BleManager extends GetxService {
// 根据APP语言动态配置语音识别语言 // 根据APP语言动态配置语音识别语言
List<String> supportedLanguages = []; List<String> supportedLanguages = [];
try { try {
// 使用 GetX 获取 APP 当前语言环境 (Locale) final storage = GetStorage();
final appLocale = Get.locale; final languageManager = Get.find<LanguageManager>();
if (appLocale != null) { // 从存储中读取用户设置的语言
final lang = appLocale.languageCode; // e.g., 'en' String? savedLanguage = storage.read('language');
final country = appLocale.countryCode; // e.g., 'US'
if (savedLanguage != null && savedLanguage != 'system') {
// 构造 Azure SDK 需要的格式 (e.g., 'en-US') // 用户设置了特定语言
if (country != null && country.isNotEmpty) { final parts = savedLanguage.split('_');
supportedLanguages.add('$lang-$country'); if (parts.length == 2) {
} else { final asrCode = languageManager.getAsrCodeByShortCode(parts[0]);
supportedLanguages.add(lang); // fallback only language code 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) { if (supportedLanguages.isEmpty) {
supportedLanguages.add('en-US'); supportedLanguages.add('en-US');

65
lib/modules/settings/controllers/settings_controller.dart

@ -9,6 +9,7 @@ import '../../../routes/app_routes.dart';
import '../models/language_model.dart'; import '../models/language_model.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
import '../../../data/services/ble_manager.dart'; import '../../../data/services/ble_manager.dart';
import '../../../data/services/language_manager.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
@ -393,6 +394,10 @@ class SettingsController extends GetxController {
print("languageList: ${data.value}"); print("languageList: ${data.value}");
language.value = data; language.value = data;
_storage.write('language', data.value); _storage.write('language', data.value);
// 更新agent服务的语音识别语言设置
await _updateAgentLanguageSettings(data);
// 延迟一下确保语言更新完成,然后重新进入应用 // 延迟一下确保语言更新完成,然后重新进入应用
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
@ -401,6 +406,66 @@ class SettingsController extends GetxController {
Get.back(); Get.back();
} }
/// 更新agent服务的语音识别语言设置
Future<void> _updateAgentLanguageSettings(LanguageModel languageModel) async {
try {
final languageManager = Get.find<LanguageManager>();
List<String> 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() { void _loadCurrentSpeechServiceType() {
try { try {

15
local_plugins/agent_service/lib/agent_service.dart

@ -402,6 +402,21 @@ class AgentService {
} }
} }
/// 设置支持的语音识别语言
///
/// [languages] 支持的语言列表,如 ["zh-CN", "en-US"]
/// 返回是否设置成功
static Future<bool> setSupportedLanguages(List<String> 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<bool> dispose() async { static Future<bool> dispose() async {
try { try {

Loading…
Cancel
Save