|
|
|
@ -1113,7 +1113,7 @@ object AgentService : CoroutineScope { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置支持的语音识别语言 |
|
|
|
* 设置支持的语音识别语言,同时更新TTS语言设置 |
|
|
|
*/ |
|
|
|
fun setSupportedLanguages(languages: List<String>): Boolean { |
|
|
|
if (!isInitialized) { |
|
|
|
@ -1132,28 +1132,35 @@ object AgentService : CoroutineScope { |
|
|
|
Log.i(TAG, "设置支持的语言: ${languages.joinToString(", ")}") |
|
|
|
|
|
|
|
// 重新初始化ASR服务以应用新的语言设置 |
|
|
|
val success = azureAsrHelper?.initialize( |
|
|
|
val asrSuccess = azureAsrHelper?.initialize( |
|
|
|
subscriptionKey = this.azureSpeechKey, |
|
|
|
region = this.azureSpeechRegion, |
|
|
|
supportedLanguages = languages.toTypedArray(), |
|
|
|
audioSourceType = audioSourceType |
|
|
|
) ?: false |
|
|
|
|
|
|
|
if (success) { |
|
|
|
Log.i(TAG, "语言设置更新成功") |
|
|
|
// 同时更新TTS语言设置 |
|
|
|
val ttsSuccess = updateTtsLanguage(languages.first()) // 使用第一个语言作为TTS语言 |
|
|
|
|
|
|
|
val overallSuccess = asrSuccess && ttsSuccess |
|
|
|
|
|
|
|
if (overallSuccess) { |
|
|
|
Log.i(TAG, "ASR和TTS语言设置更新成功") |
|
|
|
sendEvent("languages_updated", mapOf( |
|
|
|
"languages" to languages, |
|
|
|
"status" to "success" |
|
|
|
"status" to "success", |
|
|
|
"asr_success" to asrSuccess, |
|
|
|
"tts_success" to ttsSuccess |
|
|
|
)) |
|
|
|
} else { |
|
|
|
Log.e(TAG, "语言设置更新失败") |
|
|
|
Log.e(TAG, "语言设置更新失败 - ASR: $asrSuccess, TTS: $ttsSuccess") |
|
|
|
sendEvent("error", mapOf( |
|
|
|
"code" to "LANGUAGE_UPDATE_FAILED", |
|
|
|
"message" to "语言设置更新失败" |
|
|
|
"message" to "语言设置更新失败 - ASR: $asrSuccess, TTS: $ttsSuccess" |
|
|
|
)) |
|
|
|
} |
|
|
|
|
|
|
|
success |
|
|
|
overallSuccess |
|
|
|
} catch (e: Exception) { |
|
|
|
Log.e(TAG, "设置支持语言异常: ${e.message}") |
|
|
|
sendEvent("error", mapOf( |
|
|
|
@ -1164,6 +1171,105 @@ object AgentService : CoroutineScope { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 更新TTS语言设置 |
|
|
|
* |
|
|
|
* @param languageCode ASR语言代码,如 "zh-CN", "en-US" |
|
|
|
* @return 是否更新成功 |
|
|
|
*/ |
|
|
|
private fun updateTtsLanguage(languageCode: String): Boolean { |
|
|
|
return try { |
|
|
|
Log.i(TAG, "更新TTS语言设置: $languageCode") |
|
|
|
|
|
|
|
// 根据ASR语言代码映射到对应的TTS语音角色 |
|
|
|
val voiceName = getTtsVoiceNameByAsrCode(languageCode) |
|
|
|
|
|
|
|
if (voiceName.isNotEmpty()) { |
|
|
|
// 设置TTS语音角色 |
|
|
|
val success = ttsService?.setVoice(voiceName) ?: false |
|
|
|
|
|
|
|
if (success) { |
|
|
|
Log.i(TAG, "TTS语音角色设置成功: $voiceName") |
|
|
|
} else { |
|
|
|
Log.w(TAG, "TTS语音角色设置失败: $voiceName") |
|
|
|
} |
|
|
|
|
|
|
|
success |
|
|
|
} else { |
|
|
|
Log.w(TAG, "未找到语言代码 $languageCode 对应的TTS语音角色") |
|
|
|
false |
|
|
|
} |
|
|
|
} catch (e: Exception) { |
|
|
|
Log.e(TAG, "更新TTS语言设置异常: ${e.message}") |
|
|
|
false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 根据ASR语言代码获取对应的TTS语音角色名称 |
|
|
|
* 与LanguageManager中的映射保持一致 |
|
|
|
* |
|
|
|
* @param asrCode ASR语言代码,如 "zh-CN", "en-US" |
|
|
|
* @return TTS语音角色名称 |
|
|
|
*/ |
|
|
|
private fun getTtsVoiceNameByAsrCode(asrCode: String): String { |
|
|
|
return when (asrCode) { |
|
|
|
// 中文相关 |
|
|
|
"zh-CN" -> "zh-CN-XiaoxiaoNeural" |
|
|
|
"zh-TW" -> "zh-TW-HsiaoChenNeural" |
|
|
|
"zh-HK" -> "zh-HK-HiuMaanNeural" |
|
|
|
|
|
|
|
// 英语相关 |
|
|
|
"en-US" -> "en-US-AriaNeural" |
|
|
|
|
|
|
|
// 亚洲语言 |
|
|
|
"ja-JP" -> "ja-JP-NanamiNeural" |
|
|
|
"ko-KR" -> "ko-KR-SunHiNeural" |
|
|
|
"th-TH" -> "th-TH-PremwadeeNeural" |
|
|
|
"vi-VN" -> "vi-VN-HoaiMyNeural" |
|
|
|
"id-ID" -> "id-ID-GadisNeural" |
|
|
|
"hi-IN" -> "hi-IN-SwaraNeural" |
|
|
|
"ms-MY" -> "ms-MY-YasminNeural" |
|
|
|
"bn-IN" -> "bn-IN-TanishaaNeural" |
|
|
|
"ta-IN" -> "ta-IN-PallaviNeural" |
|
|
|
"te-IN" -> "te-IN-ShrutiNeural" |
|
|
|
"mr-IN" -> "mr-IN-AarohiNeural" |
|
|
|
"ur-IN" -> "ur-IN-GulNeural" |
|
|
|
"tr-TR" -> "tr-TR-EmelNeural" |
|
|
|
"fa-IR" -> "fa-IR-DilaraNeural" |
|
|
|
|
|
|
|
// 欧洲语言 |
|
|
|
"fr-FR" -> "fr-FR-DeniseNeural" |
|
|
|
"es-ES" -> "es-ES-ElviraNeural" |
|
|
|
"pt-BR" -> "pt-BR-FranciscaNeural" |
|
|
|
"it-IT" -> "it-IT-ElsaNeural" |
|
|
|
"de-DE" -> "de-DE-KatjaNeural" |
|
|
|
"ru-RU" -> "ru-RU-SvetlanaNeural" |
|
|
|
"pl-PL" -> "pl-PL-AgnieszkaNeural" |
|
|
|
"nl-NL" -> "nl-NL-ColetteNeural" |
|
|
|
"sv-SE" -> "sv-SE-SofieNeural" |
|
|
|
"cs-CZ" -> "cs-CZ-VlastaNeural" |
|
|
|
"el-GR" -> "el-GR-AthinaNeural" |
|
|
|
"ro-RO" -> "ro-RO-AlinaNeural" |
|
|
|
"hu-HU" -> "hu-HU-NoemiNeural" |
|
|
|
"uk-UA" -> "uk-UA-PolinaNeural" |
|
|
|
"da-DK" -> "da-DK-ChristelNeural" |
|
|
|
"fi-FI" -> "fi-FI-NooraNeural" |
|
|
|
"nb-NO" -> "nb-NO-IselinNeural" |
|
|
|
"hr-HR" -> "hr-HR-GabrijelaNeural" |
|
|
|
"ca-ES" -> "ca-ES-JoanaNeural" |
|
|
|
|
|
|
|
// 阿拉伯语和非洲语言 |
|
|
|
"ar-EG" -> "ar-EG-SalmaNeural" |
|
|
|
"sw-KE" -> "sw-KE-ZuriNeural" |
|
|
|
|
|
|
|
else -> { |
|
|
|
Log.w(TAG, "未支持的语言代码: $asrCode,使用默认英语语音") |
|
|
|
"en-US-AriaNeural" |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存聊天消息 |
|
|
|
*/ |
|
|
|
|