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 fedf86d19..24d28b51f 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 @@ -401,6 +401,7 @@ object AgentService : CoroutineScope { if (!success) { Log.e(TAG, "Bytedance TTS服务初始化失败") } else { + ttsService?.setSpeechParams(rate = 25, pitch = 0, volume = 100) val voiceName = getTtsVoiceNameByAsrCode(ttsLanguage) if (voiceName.isNotEmpty()) { ttsService?.setVoice(voiceName) @@ -1394,6 +1395,7 @@ object AgentService : CoroutineScope { restartIdleCheck() // 状态变化,重启检测 // 直接调用TTS,无需协程包装 + ttsService?.setSpeechParams(rate = 25, pitch = 0, volume = 100) ttsService?.speakOnce(text) } 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 7c67417b2..6d1553ee7 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 @@ -343,6 +343,7 @@ class AgentServiceImpl: NSObject { } _ = azureTtsHelper?.setVoice(getTtsVoiceNameByAsrCode(primaryLanguage)) + _ = azureTtsHelper?.setSpeechParams(rate: 25, pitch: 0, volume: 100) return true } @@ -604,6 +605,7 @@ class AgentServiceImpl: NSObject { return false } + _ = azureTtsHelper?.setSpeechParams(rate: 25, pitch: 0, volume: 100) return azureTtsHelper?.speakOnce(sessionid:sessionid,text) ?? false } diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureSpeechPlugin.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureSpeechPlugin.kt index a2d922b2e..abc20de31 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureSpeechPlugin.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureSpeechPlugin.kt @@ -668,6 +668,7 @@ class AzureSpeechPlugin : BleService.Callback, FlutterPlugin { "initialize" -> { val subscriptionKey = call.argument("subscriptionKey") ?: "" val region = call.argument("region") ?: "" + val language = call.argument("language") ?: "zh-CN" val useCustomAudioOutput = call.argument("useCustomAudioOutput") ?: false @@ -677,7 +678,7 @@ class AzureSpeechPlugin : BleService.Callback, FlutterPlugin { ttsAppId = "", // Azure TTS不需要appId ttsAppToken = subscriptionKey, ttsResource = region, - language = "zh-CN" + language = language ) // 如果初始化成功且需要使用自定义音频输出,则设置自定义音频播放器 @@ -703,6 +704,13 @@ class AzureSpeechPlugin : BleService.Callback, FlutterPlugin { } } + "setSpeechParams" -> { + val rate = call.argument("rate") ?: 0 + val pitch = call.argument("pitch") ?: 0 + val volume = call.argument("volume") ?: 100 + result.success(azureTtsHelper.setSpeechParams(rate = rate, pitch = pitch, volume = volume)) + } + "setVoice" -> { val voiceName = call.argument("voiceName") ?: return result.error("INVALID_ARGUMENTS", "语音名称不能为空", null) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt index 4b47782aa..05223bd8d 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt @@ -437,7 +437,7 @@ class AzureTtsHelper(private val context: Context) : ITtsService { /** * 设置语音参数 */ - private fun setSpeechParams(rate: Int = 0, pitch: Int = 0, volume: Int = 100): Boolean { + fun setSpeechParams(rate: Int = 0, pitch: Int = 0, volume: Int = 100): Boolean { if (!isInitialized) return false try { @@ -762,4 +762,4 @@ class AzureTtsHelper(private val context: Context) : ITtsService { * 是否正在播放 */ fun isSpeaking(): Boolean = isSpeaking -} \ No newline at end of file +} diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureSpeechPlugin.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureSpeechPlugin.swift index 2484ab79e..a3c9cc9b3 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureSpeechPlugin.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureSpeechPlugin.swift @@ -631,6 +631,18 @@ private func sendAstEvent(_ event: [String: Any]) { let success = azureTtsHelper.setVoice(voiceName) result(success) + + case "setSpeechParams": + guard let args = call.arguments as? [String: Any] else { + result(FlutterError(code: "INVALID_ARGUMENTS", message: "参数不能为空", details: nil)) + return + } + + let rate = args["rate"] as? Int ?? 0 + let pitch = args["pitch"] as? Int ?? 0 + let volume = args["volume"] as? Int ?? 100 + let success = azureTtsHelper.setSpeechParams(rate: rate, pitch: pitch, volume: volume) + result(success) case "speakText": guard let args = call.arguments as? [String: Any], @@ -1366,5 +1378,3 @@ private class AsrCallbackWrapper: AzureAsrHelper.ContinuousRecognizeCallback { ]) } } - - diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift index 9a0b5f639..9e7bb5abc 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift @@ -645,7 +645,7 @@ public class AzureTtsHelper: NSObject, ITtsService { /** * 设置语音参数 */ - private func setSpeechParams(rate: Int = 0, pitch: Int = 0, volume: Int = 100) -> Bool { + public func setSpeechParams(rate: Int = 0, pitch: Int = 0, volume: Int = 100) -> Bool { currentRate = rate >= 0 ? "+\(rate)%" : "\(rate)%" currentPitch = pitch >= 0 ? "+\(pitch)%" : "\(pitch)%" currentVolume = "\(min(max(volume, 0), 100))%"