19 changed files with 2169 additions and 1097 deletions
Binary file not shown.
@ -0,0 +1,532 @@ |
|||
import 'package:get/get.dart'; |
|||
import '../../core/utils/logger.dart'; |
|||
|
|||
/// 语言信息类,包含语言的各种表示形式 |
|||
class LanguageInfo { |
|||
/// 短代码,如 'zh', 'en' |
|||
final String shortCode; |
|||
|
|||
/// 中文名称 |
|||
final String chineseName; |
|||
|
|||
/// 英文名称 |
|||
final String englishName; |
|||
|
|||
/// Azure ASR 语言代码,如 'zh-CN', 'en-US' |
|||
final String asrCode; |
|||
|
|||
/// Azure TTS 语音名称 |
|||
final String ttsVoiceName; |
|||
|
|||
/// 备注信息 |
|||
final String? note; |
|||
|
|||
LanguageInfo({ |
|||
required this.shortCode, |
|||
required this.chineseName, |
|||
required this.englishName, |
|||
required this.asrCode, |
|||
required this.ttsVoiceName, |
|||
this.note, |
|||
}); |
|||
} |
|||
|
|||
/// 语言类型管理类,提供语言信息的查询和转换功能 |
|||
class LanguageManager extends GetxService { |
|||
// 单例实例 |
|||
static LanguageManager? _instance; |
|||
|
|||
// 单例工厂方法 |
|||
factory LanguageManager() { |
|||
_instance ??= LanguageManager._internal(); |
|||
return _instance!; |
|||
} |
|||
|
|||
// 私有构造函数 |
|||
LanguageManager._internal() { |
|||
_initLanguageMap(); |
|||
} |
|||
|
|||
// 语言信息映射表,以 ASR 代码为键 |
|||
final Map<String, LanguageInfo> _languageMap = {}; |
|||
|
|||
// 中文名称到 ASR 代码的映射 |
|||
final Map<String, String> _chineseNameToAsrCodeMap = {}; |
|||
|
|||
// 英文名称到 ASR 代码的映射 |
|||
final Map<String, String> _englishNameToAsrCodeMap = {}; |
|||
|
|||
// 短代码到 ASR 代码的映射 |
|||
final Map<String, String> _shortCodeToAsrCodeMap = {}; |
|||
|
|||
/// 初始化语言映射表 |
|||
void _initLanguageMap() { |
|||
// 中文相关 |
|||
_addLanguage( |
|||
shortCode: 'zh', |
|||
chineseName: '中文(简体)', |
|||
englishName: 'Chinese (simplified)', |
|||
asrCode: 'zh-CN', |
|||
ttsVoiceName: 'zh-CN-XiaoxiaoNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'zh-Hant', |
|||
chineseName: '中文(繁体)', |
|||
englishName: 'Chinese (traditional)', |
|||
asrCode: 'zh-TW', |
|||
ttsVoiceName: 'zh-TW-HsiaoChenNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'zh-Hant-hk', |
|||
chineseName: '中文(香港繁体)', |
|||
englishName: 'Chinese (Hongkong traditional)', |
|||
asrCode: 'zh-HK', |
|||
ttsVoiceName: 'zh-HK-HiuMaanNeural', |
|||
); |
|||
|
|||
// 英语相关 |
|||
_addLanguage( |
|||
shortCode: 'en', |
|||
chineseName: '英语', |
|||
englishName: 'English', |
|||
asrCode: 'en-US', |
|||
ttsVoiceName: 'en-US-AriaNeural', |
|||
); |
|||
|
|||
// 日语相关 |
|||
_addLanguage( |
|||
shortCode: 'ja', |
|||
chineseName: '日语', |
|||
englishName: 'Japanese', |
|||
asrCode: 'ja-JP', |
|||
ttsVoiceName: 'ja-JP-NanamiNeural', |
|||
); |
|||
|
|||
// 韩语相关 |
|||
_addLanguage( |
|||
shortCode: 'ko', |
|||
chineseName: '韩语', |
|||
englishName: 'Korean', |
|||
asrCode: 'ko-KR', |
|||
ttsVoiceName: 'ko-KR-SunHiNeural', |
|||
); |
|||
|
|||
// 欧洲语言 |
|||
_addLanguage( |
|||
shortCode: 'fr', |
|||
chineseName: '法语', |
|||
englishName: 'French', |
|||
asrCode: 'fr-FR', |
|||
ttsVoiceName: 'fr-FR-DeniseNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'es', |
|||
chineseName: '西班牙语', |
|||
englishName: 'Spanish', |
|||
asrCode: 'es-ES', |
|||
ttsVoiceName: 'es-ES-ElviraNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'pt', |
|||
chineseName: '葡萄牙语', |
|||
englishName: 'Portuguese', |
|||
asrCode: 'pt-BR', |
|||
ttsVoiceName: 'pt-BR-FranciscaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'it', |
|||
chineseName: '意大利语', |
|||
englishName: 'Italian', |
|||
asrCode: 'it-IT', |
|||
ttsVoiceName: 'it-IT-ElsaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'de', |
|||
chineseName: '德语', |
|||
englishName: 'German', |
|||
asrCode: 'de-DE', |
|||
ttsVoiceName: 'de-DE-KatjaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'ru', |
|||
chineseName: '俄语', |
|||
englishName: 'Russian', |
|||
asrCode: 'ru-RU', |
|||
ttsVoiceName: 'ru-RU-SvetlanaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'pl', |
|||
chineseName: '波兰语', |
|||
englishName: 'Polish', |
|||
asrCode: 'pl-PL', |
|||
ttsVoiceName: 'pl-PL-AgnieszkaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'nl', |
|||
chineseName: '荷兰语', |
|||
englishName: 'Dutch', |
|||
asrCode: 'nl-NL', |
|||
ttsVoiceName: 'nl-NL-ColetteNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'sv', |
|||
chineseName: '瑞典语', |
|||
englishName: 'Swedish', |
|||
asrCode: 'sv-SE', |
|||
ttsVoiceName: 'sv-SE-SofieNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'cs', |
|||
chineseName: '捷克语', |
|||
englishName: 'Czech', |
|||
asrCode: 'cs-CZ', |
|||
ttsVoiceName: 'cs-CZ-VlastaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'el', |
|||
chineseName: '现代希腊语', |
|||
englishName: 'Modern Greek', |
|||
asrCode: 'el-GR', |
|||
ttsVoiceName: 'el-GR-AthinaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'ro', |
|||
chineseName: '罗马尼亚语', |
|||
englishName: 'Romanian', |
|||
asrCode: 'ro-RO', |
|||
ttsVoiceName: 'ro-RO-AlinaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'hu', |
|||
chineseName: '匈牙利语', |
|||
englishName: 'Hungarian', |
|||
asrCode: 'hu-HU', |
|||
ttsVoiceName: 'hu-HU-NoemiNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'uk', |
|||
chineseName: '乌克兰语', |
|||
englishName: 'Ukrainian', |
|||
asrCode: 'uk-UA', |
|||
ttsVoiceName: 'uk-UA-PolinaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'da', |
|||
chineseName: '丹麦语', |
|||
englishName: 'Danish', |
|||
asrCode: 'da-DK', |
|||
ttsVoiceName: 'da-DK-ChristelNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'fi', |
|||
chineseName: '芬兰语', |
|||
englishName: 'Finnish', |
|||
asrCode: 'fi-FI', |
|||
ttsVoiceName: 'fi-FI-NooraNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'no', |
|||
chineseName: '挪威语', |
|||
englishName: 'Norwegian', |
|||
asrCode: 'nb-NO', |
|||
ttsVoiceName: 'nb-NO-IselinNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'hr', |
|||
chineseName: '克罗地亚语', |
|||
englishName: 'Croatian', |
|||
asrCode: 'hr-HR', |
|||
ttsVoiceName: 'hr-HR-GabrijelaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'ca', |
|||
chineseName: '加泰隆语', |
|||
englishName: 'Catalan', |
|||
asrCode: 'ca-ES', |
|||
ttsVoiceName: 'ca-ES-JoanaNeural', |
|||
); |
|||
|
|||
// 亚洲语言 |
|||
_addLanguage( |
|||
shortCode: 'ar', |
|||
chineseName: '阿拉伯语', |
|||
englishName: 'Arabic', |
|||
asrCode: 'ar-EG', |
|||
ttsVoiceName: 'ar-EG-SalmaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'th', |
|||
chineseName: '泰语', |
|||
englishName: 'Thai', |
|||
asrCode: 'th-TH', |
|||
ttsVoiceName: 'th-TH-PremwadeeNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'vi', |
|||
chineseName: '越南语', |
|||
englishName: 'Vietnamese', |
|||
asrCode: 'vi-VN', |
|||
ttsVoiceName: 'vi-VN-HoaiMyNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'id', |
|||
chineseName: '印尼语', |
|||
englishName: 'Indonesian', |
|||
asrCode: 'id-ID', |
|||
ttsVoiceName: 'id-ID-GadisNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'hi', |
|||
chineseName: '印地语', |
|||
englishName: 'Hindi', |
|||
asrCode: 'hi-IN', |
|||
ttsVoiceName: 'hi-IN-SwaraNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'tr', |
|||
chineseName: '土耳其语', |
|||
englishName: 'Turkish', |
|||
asrCode: 'tr-TR', |
|||
ttsVoiceName: 'tr-TR-EmelNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'ms', |
|||
chineseName: '马来语', |
|||
englishName: 'Malay', |
|||
asrCode: 'ms-MY', |
|||
ttsVoiceName: 'ms-MY-YasminNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'bn', |
|||
chineseName: '孟加拉语', |
|||
englishName: 'Bengali', |
|||
asrCode: 'bn-IN', |
|||
ttsVoiceName: 'bn-IN-TanishaaNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'ta', |
|||
chineseName: '泰米尔语', |
|||
englishName: 'Tamil', |
|||
asrCode: 'ta-IN', |
|||
ttsVoiceName: 'ta-IN-PallaviNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'te', |
|||
chineseName: '泰卢固语', |
|||
englishName: 'Telugu', |
|||
asrCode: 'te-IN', |
|||
ttsVoiceName: 'te-IN-ShrutiNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'mr', |
|||
chineseName: '马拉提语', |
|||
englishName: 'Marathi', |
|||
asrCode: 'mr-IN', |
|||
ttsVoiceName: 'mr-IN-AarohiNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'ur', |
|||
chineseName: '乌尔都语', |
|||
englishName: 'Urdu', |
|||
asrCode: 'ur-IN', |
|||
ttsVoiceName: 'ur-IN-GulNeural', |
|||
); |
|||
|
|||
_addLanguage( |
|||
shortCode: 'fa', |
|||
chineseName: '波斯语', |
|||
englishName: 'Persian', |
|||
asrCode: 'fa-IR', |
|||
ttsVoiceName: 'fa-IR-DilaraNeural', |
|||
); |
|||
|
|||
// 非洲语言 |
|||
_addLanguage( |
|||
shortCode: 'sw', |
|||
chineseName: '斯瓦希里语', |
|||
englishName: 'Swahili', |
|||
asrCode: 'sw-KE', |
|||
ttsVoiceName: 'sw-KE-ZuriNeural', |
|||
); |
|||
|
|||
Logger.info('语言管理器初始化完成,共加载 ${_languageMap.length} 种语言'); |
|||
} |
|||
|
|||
/// 添加语言信息到映射表 |
|||
void _addLanguage({ |
|||
required String shortCode, |
|||
required String chineseName, |
|||
required String englishName, |
|||
required String asrCode, |
|||
required String ttsVoiceName, |
|||
String? note, |
|||
}) { |
|||
final languageInfo = LanguageInfo( |
|||
shortCode: shortCode, |
|||
chineseName: chineseName, |
|||
englishName: englishName, |
|||
asrCode: asrCode, |
|||
ttsVoiceName: ttsVoiceName, |
|||
note: note, |
|||
); |
|||
|
|||
_languageMap[asrCode] = languageInfo; |
|||
_chineseNameToAsrCodeMap[chineseName] = asrCode; |
|||
_englishNameToAsrCodeMap[englishName] = asrCode; |
|||
_shortCodeToAsrCodeMap[shortCode] = asrCode; |
|||
} |
|||
|
|||
/// 获取所有支持的语言信息 |
|||
Map<String, LanguageInfo> getAllLanguages() { |
|||
return Map.from(_languageMap); |
|||
} |
|||
|
|||
/// 获取所有支持的语言的中文名称 |
|||
List<String> getAllChineseNames() { |
|||
return _chineseNameToAsrCodeMap.keys.toList(); |
|||
} |
|||
|
|||
/// 获取所有支持的语言的英文名称 |
|||
List<String> getAllEnglishNames() { |
|||
return _englishNameToAsrCodeMap.keys.toList(); |
|||
} |
|||
|
|||
/// 根据 ASR 代码获取语言信息 |
|||
LanguageInfo? getLanguageByAsrCode(String asrCode) { |
|||
return _languageMap[asrCode]; |
|||
} |
|||
|
|||
/// 根据中文名称获取语言信息 |
|||
LanguageInfo? getLanguageByChineseName(String chineseName) { |
|||
final asrCode = _chineseNameToAsrCodeMap[chineseName]; |
|||
if (asrCode == null) return null; |
|||
return _languageMap[asrCode]; |
|||
} |
|||
|
|||
/// 根据英文名称获取语言信息 |
|||
LanguageInfo? getLanguageByEnglishName(String englishName) { |
|||
final asrCode = _englishNameToAsrCodeMap[englishName]; |
|||
if (asrCode == null) return null; |
|||
return _languageMap[asrCode]; |
|||
} |
|||
|
|||
/// 根据短代码获取语言信息 |
|||
LanguageInfo? getLanguageByShortCode(String shortCode) { |
|||
final asrCode = _shortCodeToAsrCodeMap[shortCode]; |
|||
if (asrCode == null) return null; |
|||
return _languageMap[asrCode]; |
|||
} |
|||
|
|||
/// 根据中文名称获取 ASR 代码 |
|||
String? getAsrCodeByChineseName(String chineseName) { |
|||
return _chineseNameToAsrCodeMap[chineseName]; |
|||
} |
|||
|
|||
/// 根据英文名称获取 ASR 代码 |
|||
String? getAsrCodeByEnglishName(String englishName) { |
|||
return _englishNameToAsrCodeMap[englishName]; |
|||
} |
|||
|
|||
/// 根据短代码获取 ASR 代码 |
|||
String? getAsrCodeByShortCode(String shortCode) { |
|||
return _shortCodeToAsrCodeMap[shortCode]; |
|||
} |
|||
|
|||
/// 根据 ASR 代码获取中文名称 |
|||
String? getChineseNameByAsrCode(String asrCode) { |
|||
final languageInfo = _languageMap[asrCode]; |
|||
return languageInfo?.chineseName; |
|||
} |
|||
|
|||
/// 根据 ASR 代码获取英文名称 |
|||
String? getEnglishNameByAsrCode(String asrCode) { |
|||
final languageInfo = _languageMap[asrCode]; |
|||
return languageInfo?.englishName; |
|||
} |
|||
|
|||
/// 根据 ASR 代码获取短代码 |
|||
String? getShortCodeByAsrCode(String asrCode) { |
|||
final languageInfo = _languageMap[asrCode]; |
|||
return languageInfo?.shortCode; |
|||
} |
|||
|
|||
/// 根据 ASR 代码获取 TTS 语音名称 |
|||
String? getTtsVoiceNameByAsrCode(String asrCode) { |
|||
final languageInfo = _languageMap[asrCode]; |
|||
return languageInfo?.ttsVoiceName; |
|||
} |
|||
|
|||
/// 根据中文名称获取 TTS 语音名称 |
|||
String? getTtsVoiceNameByChineseName(String chineseName) { |
|||
final asrCode = _chineseNameToAsrCodeMap[chineseName]; |
|||
if (asrCode == null) return null; |
|||
return _languageMap[asrCode]?.ttsVoiceName; |
|||
} |
|||
|
|||
/// 根据短代码获取中文名称 |
|||
String? getChineseNameByShortCode(String shortCode) { |
|||
final asrCode = _shortCodeToAsrCodeMap[shortCode]; |
|||
if (asrCode == null) return null; |
|||
return _languageMap[asrCode]?.chineseName; |
|||
} |
|||
|
|||
/// 根据短代码获取英文名称 |
|||
String? getEnglishNameByShortCode(String shortCode) { |
|||
final asrCode = _shortCodeToAsrCodeMap[shortCode]; |
|||
if (asrCode == null) return null; |
|||
return _languageMap[asrCode]?.englishName; |
|||
} |
|||
|
|||
/// 根据短代码获取 TTS 语音名称 |
|||
String? getTtsVoiceNameByShortCode(String shortCode) { |
|||
final asrCode = _shortCodeToAsrCodeMap[shortCode]; |
|||
if (asrCode == null) return null; |
|||
return _languageMap[asrCode]?.ttsVoiceName; |
|||
} |
|||
|
|||
/// 获取中文名称到 ASR 代码的映射 |
|||
Map<String, String> getChineseNameToAsrCodeMap() { |
|||
return Map.from(_chineseNameToAsrCodeMap); |
|||
} |
|||
|
|||
/// 获取英文名称到 ASR 代码的映射 |
|||
Map<String, String> getEnglishNameToAsrCodeMap() { |
|||
return Map.from(_englishNameToAsrCodeMap); |
|||
} |
|||
|
|||
/// 获取短代码到 ASR 代码的映射 |
|||
Map<String, String> getShortCodeToAsrCodeMap() { |
|||
return Map.from(_shortCodeToAsrCodeMap); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue