diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 195ef188f..4003b3f23 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -1596,7 +1596,7 @@ class AgentController extends GetxController { isPushToTalkActive.value = true; //await AgentService.recognizeCallback(); // 开始语音识别 - await AgentService.startConversation(mode: 'push_to_talk'); + AgentService.startConversation(mode: 'push_to_talk'); // await startVoiceInput(); } @@ -1610,7 +1610,7 @@ class AgentController extends GetxController { // 清除按住说话状态(但保持按住说话模式) isPushToTalkActive.value = false; - await AgentService.stopConversation(); + AgentService.stopConversation(); // 停止语音识别 // await stopVoiceInput(); } 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 0dbb36a53..47238fa4f 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 @@ -396,7 +396,7 @@ class AgentServiceImpl: NSObject { } print("ai启动语音=\(audioSourceType)=\(useBle)") guard let success = azureAsrHelper?.startContinuousRecognition( - // callback: self, + // callback: self, audioSourceType: audioSourceType ), success else { sendError("启动语音识别失败", code: "RECOGNITION_START_ERROR") @@ -1708,7 +1708,10 @@ extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { hasSpeechDetected = false // 使用模式感知的空闲检测启动方法 startIdleCheckForMode(mode: currentRecognitionMode) - audioPlayer?.playStartSound() + if (currentRecognitionMode == "ble_wakeup") { + audioPlayer?.playStartSound() + } + } func onSessionStopped() { @@ -1716,7 +1719,9 @@ extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { isRecognizing = false hasSpeechDetected = false stopIdleCheck() - audioPlayer?.playStopSound() + if (currentRecognitionMode == "ble_wakeup") { + audioPlayer?.playStopSound() + } } func onCanceled(_ reason: String, _ errorDetails: String) { diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift index dd070d8af..c38d73af5 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift @@ -703,9 +703,6 @@ public class AzureAsrHelper: NSObject { * 重命名指定路径的音频文件 */ public func renameFile(filePath: String, newName: String)-> Bool { - - - audioStream?.recordfile?.renameFile(at: filePath, to: newName) // Fixed method call return true } 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 439540abc..bd9ccfc32 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 @@ -16,7 +16,7 @@ public class AzureTtsHelper: NSObject, ITtsService { private var synthesizer: SPXSpeechSynthesizer? private var isInitialized = false private var speaking = false - private var sessionid = "" //语音播报任务id + private var sessionid = "" //语音播报任务idsetAudioOutputRoute // 当前配置 private var currentVoice = DEFAULT_VOICE diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/tools/SimpleAudioReceiver.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/tools/SimpleAudioReceiver.swift index 22cb05061..a1085878a 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/tools/SimpleAudioReceiver.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/tools/SimpleAudioReceiver.swift @@ -70,8 +70,9 @@ public class SimpleAudioReceiver: NSObject { print("音频录制组件已初始化,跳过重复初始化") return } + preConfigureAudioSession() - print("初始化了") + // 预配置音频会话 audioFormat = getOptimalAudioFormat() pushAudioStream = SPXPushAudioInputStream() @@ -84,6 +85,22 @@ public class SimpleAudioReceiver: NSObject { startWriteThread() } + // 【新增】预配置音频会话方法 + /** + * 预配置音频会话,在应用启动时调用以减少首次录音延迟 + * 【优化重点】将耗时的音频会话配置提前到初始化阶段 + */ + private func preConfigureAudioSession() { + do { + // 设置音频会话类别和模式 + runMicrophoneCapture() + stopMicrophoneCapture() + print("音频会话预配置完成") + } catch { + print("音频会话预配置失败: \(error)") + } + } + /// 获取最佳音频格式 (iOS 通常支持标准采样率) public func getOptimalAudioFormat() -> AVAudioFormat? { let sampleRate: Double = 16000 // iOS 通常支持 16kHz @@ -373,7 +390,7 @@ public class SimpleAudioReceiver: NSObject { _isWriting=false audioEngine?.pause() - print("stopMicrophoneCapture") + print("stopMicrophoneCapture") } public func releaseAudioResources() { @@ -395,6 +412,7 @@ public class SimpleAudioReceiver: NSObject { case receiver case bluetooth } + public func setAudioOutputRoute(_ route: AudioOutputRoute) { do { @@ -403,7 +421,7 @@ public class SimpleAudioReceiver: NSObject { print("当前正在识别") try audioEngine?.pause() // 先停用以避免冲突 - try audioSession.setActive(false) +// try audioSession.setActive(false) } print("setAudioOutputRoutecurrent,route=\(route)")