Browse Source

9.1修复唤醒异常问题

weicu
fdp 1 year ago
parent
commit
a0eb6acebe
  1. 3
      local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift
  2. 131
      local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift

3
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 { if self.isRecognizing && !self.isSpeaking && !self.isAiStreaming {
os_log("空闲检测触发自动停止,模式: %{public}@", log: self.logger, type: .info, self.currentRecognitionMode) os_log("空闲检测触发自动停止,模式: %{public}@", log: self.logger, type: .info, self.currentRecognitionMode)
BleService.shared.closeCodec()
self.stopRecognition() self.stopRecognition()
self.sendEvent(name: "auto_stop", data: [ self.sendEvent(name: "auto_stop", data: [
"reason": "idle_timeout", "reason": "idle_timeout",
@ -471,7 +472,7 @@ class AgentServiceImpl: NSObject {
MusicService.shared.resume() MusicService.shared.resume()
} }
//BleService.shared.closeCodec()
// 重置识别模式 // 重置识别模式
currentRecognitionMode = "normal" currentRecognitionMode = "normal"

131
local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift

@ -264,13 +264,13 @@ public class AzureAsrHelper: NSObject {
completion(false) completion(false)
return return
} }
print("startAudioRecordAsync\(_isContinuousRecognitionActive)") // print("startAudioRecordAsync\(_isContinuousRecognitionActive)")
// 二次校验:stop 可能已发生,确认仍需启动 // // 二次校验:stop 可能已发生,确认仍需启动
guard self._isContinuousRecognitionActive else { // guard self._isContinuousRecognitionActive else {
os_log("已收到停止请求,取消启动音频录制", log: self.log, type: .info) // os_log("已收到停止请求,取消启动音频录制", log: self.log, type: .info)
completion(false) // completion(false)
return // return
} // }
os_log("开始异步启动音频录制", log: self.log, type: .info) os_log("开始异步启动音频录制", log: self.log, type: .info)
@ -385,74 +385,75 @@ public class AzureAsrHelper: NSObject {
* 修复点:在音频启动成功后的闭包中,先判断 _isContinuousRecognitionActive 是否仍然为 true, * 修复点:在音频启动成功后的闭包中,先判断 _isContinuousRecognitionActive 是否仍然为 true,
* 若 stop 已发生则直接跳过 recognizer 的启动,避免“已停止但仍启动识别”的情况。 * 若 stop 已发生则直接跳过 recognizer 的启动,避免“已停止但仍启动识别”的情况。
*/ */
public func startContinuousRecognition( public func startContinuousRecognition(
audioSourceType: AudioSourceType = .microphone, audioSourceType: AudioSourceType = .microphone,
audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = nil audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = nil
) -> Bool { ) -> Bool {
guard speechConfig != nil else { guard speechConfig != nil else {
print("语音服务未初始化") print("语音服务未初始化")
return false return false
} }
// 检查网络状态 // 检查网络状态
if !checkNetworkStatus() { if !checkNetworkStatus() {
return false return false
} }
if _isContinuousRecognitionActive { if _isContinuousRecognitionActive {
print("连续识别已在进行中") print("连续识别已在进行中")
return true return true
}
// 先取消任何挂起的启动任务
cancelPendingAudioStart()
// 延迟设置状态,直到音频启动任务真正开始执行
self.audioSourceType = audioSourceType
print("startContinuousRecognition:准备启动")
do {
if recognizer == nil {
// 检查continuousCallback是否为空,只有在不为空时才设置事件监听器
if let callback = self.continuousCallback {
setupEventListeners(callback: callback)
}
} }
// 先取消任何挂起的启动任务 print("startContinuousRecognition:\(audioSourceType)")
cancelPendingAudioStart() // 移除这里的状态设置,等音频启动成功后再设置
// self._isContinuousRecognitionActive = true
// 延迟设置状态,直到音频启动任务真正开始执行 // 异步启动音频处理
self.audioSourceType = audioSourceType startAudioRecordAsync(audioSourceType: audioSourceType, audioDataCallback: audioDataCallback) { [weak self] (success: Bool) in
print("startContinuousRecognition:准备启动") guard let self = self else { return }
do {
if recognizer == nil {
// 检查continuousCallback是否为空,只有在不为空时才设置事件监听器
if let callback = self.continuousCallback {
setupEventListeners(callback: callback)
}
}
print("startContinuousRecognition:\(audioSourceType)") if success {
// 只有在音频启动成功后才设置状态为 true // 只有在音频启动成功后才设置状态为 true
self._isContinuousRecognitionActive = true self._isContinuousRecognitionActive = true
// 异步启动音频处理 print("startContinuousRecognition:\(self._isContinuousRecognitionActive)")
startAudioRecordAsync(audioSourceType: audioSourceType, audioDataCallback: audioDataCallback) { [weak self] (success: Bool) in
guard let self = self else { return }
if success { // 启动语音识别
// 只有在音频启动成功后才设置状态为 true do {
self._isContinuousRecognitionActive = true try self.recognizer?.startContinuousRecognition()
print("startContinuousRecognition:\(self._isContinuousRecognitionActive)") os_log("连续识别已启动,音频源: %{public}@", log: self.log, type: .info, audioSourceType == .microphone ? "麦克风" : "外部")
} catch {
// 启动语音识别 os_log("启动连续识别失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
do { self.stopContinuousRecognition()
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 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
} }
}

Loading…
Cancel
Save