|
|
|
@ -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 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|