From 14ac0504ee4e9550965810a897fc2579d410c76a Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Mon, 1 Sep 2025 12:37:13 +0800 Subject: [PATCH] =?UTF-8?q?9.1=E4=BF=AE=E5=A4=8D=E5=94=A4=E9=86=92?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent_service/AgentServiceImpl.swift | 3 +- .../Sources/azure_speech/AzureAsrHelper.swift | 131 +++++++++--------- 2 files changed, 68 insertions(+), 66 deletions(-) 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 20ced7773..e6701e459 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 @@ -354,6 +354,7 @@ class AgentServiceImpl: NSObject { if self.isRecognizing && !self.isSpeaking && !self.isAiStreaming { os_log("空闲检测触发自动停止,模式: %{public}@", log: self.logger, type: .info, self.currentRecognitionMode) + BleService.shared.closeCodec() self.stopRecognition() self.sendEvent(name: "auto_stop", data: [ "reason": "idle_timeout", @@ -471,7 +472,7 @@ class AgentServiceImpl: NSObject { MusicService.shared.resume() } - //BleService.shared.closeCodec() + // 重置识别模式 currentRecognitionMode = "normal" 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 03f33d64c..0fe8d7891 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 @@ -264,13 +264,13 @@ public class AzureAsrHelper: NSObject { completion(false) return } - print("startAudioRecordAsync\(_isContinuousRecognitionActive)") - // 二次校验:stop 可能已发生,确认仍需启动 - guard self._isContinuousRecognitionActive else { - os_log("已收到停止请求,取消启动音频录制", log: self.log, type: .info) - completion(false) - return - } + // print("startAudioRecordAsync\(_isContinuousRecognitionActive)") + // // 二次校验:stop 可能已发生,确认仍需启动 + // guard self._isContinuousRecognitionActive else { + // os_log("已收到停止请求,取消启动音频录制", log: self.log, type: .info) + // completion(false) + // return + // } os_log("开始异步启动音频录制", log: self.log, type: .info) @@ -385,74 +385,75 @@ public class AzureAsrHelper: NSObject { * 修复点:在音频启动成功后的闭包中,先判断 _isContinuousRecognitionActive 是否仍然为 true, * 若 stop 已发生则直接跳过 recognizer 的启动,避免“已停止但仍启动识别”的情况。 */ - public func startContinuousRecognition( - audioSourceType: AudioSourceType = .microphone, - audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = nil - ) -> Bool { - guard speechConfig != nil else { - print("语音服务未初始化") - return false - } - - // 检查网络状态 - if !checkNetworkStatus() { - return false - } - - if _isContinuousRecognitionActive { - print("连续识别已在进行中") - return true + public func startContinuousRecognition( + audioSourceType: AudioSourceType = .microphone, + audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = nil +) -> Bool { + guard speechConfig != nil else { + print("语音服务未初始化") + return false + } + + // 检查网络状态 + if !checkNetworkStatus() { + return false + } + + if _isContinuousRecognitionActive { + print("连续识别已在进行中") + return true + } + + // 先取消任何挂起的启动任务 + cancelPendingAudioStart() + + // 延迟设置状态,直到音频启动任务真正开始执行 + self.audioSourceType = audioSourceType + print("startContinuousRecognition:准备启动") + + do { + if recognizer == nil { + // 检查continuousCallback是否为空,只有在不为空时才设置事件监听器 + if let callback = self.continuousCallback { + setupEventListeners(callback: callback) + } } - // 先取消任何挂起的启动任务 - cancelPendingAudioStart() + print("startContinuousRecognition:\(audioSourceType)") + // 移除这里的状态设置,等音频启动成功后再设置 + // self._isContinuousRecognitionActive = true - // 延迟设置状态,直到音频启动任务真正开始执行 - self.audioSourceType = audioSourceType - print("startContinuousRecognition:准备启动") - - do { - if recognizer == nil { - // 检查continuousCallback是否为空,只有在不为空时才设置事件监听器 - if let callback = self.continuousCallback { - setupEventListeners(callback: callback) - } - } + // 异步启动音频处理 + startAudioRecordAsync(audioSourceType: audioSourceType, audioDataCallback: audioDataCallback) { [weak self] (success: Bool) in + guard let self = self else { return } - print("startContinuousRecognition:\(audioSourceType)") - // 只有在音频启动成功后才设置状态为 true - self._isContinuousRecognitionActive = true - // 异步启动音频处理 - startAudioRecordAsync(audioSourceType: audioSourceType, audioDataCallback: audioDataCallback) { [weak self] (success: Bool) in - guard let self = self else { return } + if success { + // 只有在音频启动成功后才设置状态为 true + self._isContinuousRecognitionActive = true + print("startContinuousRecognition:\(self._isContinuousRecognitionActive)") - if success { - // 只有在音频启动成功后才设置状态为 true - self._isContinuousRecognitionActive = true - print("startContinuousRecognition:\(self._isContinuousRecognitionActive)") - - // 启动语音识别 - do { - try self.recognizer?.startContinuousRecognition() - os_log("连续识别已启动,音频源: %{public}@", log: self.log, type: .info, audioSourceType == .microphone ? "麦克风" : "外部") - } catch { - os_log("启动连续识别失败: %{public}@", log: self.log, type: .error, error.localizedDescription) - self.stopContinuousRecognition() - self._isContinuousRecognitionActive = false - } - } else { - os_log("音频启动失败,无法开始识别", log: self.log, type: .error) + // 启动语音识别 + do { + try self.recognizer?.startContinuousRecognition() + os_log("连续识别已启动,音频源: %{public}@", log: self.log, type: .info, audioSourceType == .microphone ? "麦克风" : "外部") + } catch { + os_log("启动连续识别失败: %{public}@", log: self.log, type: .error, error.localizedDescription) + self.stopContinuousRecognition() self._isContinuousRecognitionActive = false } + } else { + os_log("音频启动失败,无法开始识别", log: self.log, type: .error) + self._isContinuousRecognitionActive = false } - - return true - } catch { - stopContinuousRecognition() - _isContinuousRecognitionActive = false - return false } + + return true + } catch { + stopContinuousRecognition() + _isContinuousRecognitionActive = false + return false } +}