Browse Source

fix(azure_speech): 修复流式播放时speaking状态未正确更新的问题

确保在流式播放模式下speaking状态在适当的时候更新,避免状态不一致。同时优化了sessionid为空时的处理逻辑。
weicu
liwei1dao 9 months ago
parent
commit
23f7dbc9f3
  1. 13
      local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift

13
local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift

@ -596,8 +596,10 @@ public class AzureTtsHelper: NSObject, ITtsService, AVAudioPlayerDelegate {
synthesizer?.addSynthesisCompletedEventHandler { [weak self] _, _ in synthesizer?.addSynthesisCompletedEventHandler { [weak self] _, _ in
guard let self = self else { return } guard let self = self else { return }
self.speaking = false
if self.suppressStreamPlayback { return } if self.suppressStreamPlayback { return }
if !self.isUsingPushStreamCapture {
self.speaking = false
}
// 将当前合成的音频加入播放队列 // 将当前合成的音频加入播放队列
if !self.currentSynthesisBuffer.isEmpty { if !self.currentSynthesisBuffer.isEmpty {
os_log("调用链: 合成完成 入队播放 数据长度=%{public}dB session=%{public}@", log: self.log, type: .info, self.currentSynthesisBuffer.count, self.sessionid) os_log("调用链: 合成完成 入队播放 数据长度=%{public}dB session=%{public}@", log: self.log, type: .info, self.currentSynthesisBuffer.count, self.sessionid)
@ -621,11 +623,13 @@ public class AzureTtsHelper: NSObject, ITtsService, AVAudioPlayerDelegate {
synthesizer?.addSynthesisCanceledEventHandler { [weak self] _, event in synthesizer?.addSynthesisCanceledEventHandler { [weak self] _, event in
guard let self = self else { return } guard let self = self else { return }
self.speaking = false
// 减少待处理文本计数 // 减少待处理文本计数
self.pendingTextCount = max(0, self.pendingTextCount - 1) self.pendingTextCount = max(0, self.pendingTextCount - 1)
if self.suppressStreamPlayback { return } if self.suppressStreamPlayback { return }
if !self.isUsingPushStreamCapture {
self.speaking = false
}
if self.isUsingPushStreamCapture { if self.isUsingPushStreamCapture {
self.audioPlaybackQueue.async { self.audioPlaybackQueue.async {
@ -664,11 +668,11 @@ public class AzureTtsHelper: NSObject, ITtsService, AVAudioPlayerDelegate {
*/ */
private func handleSynthesizedAudioChunk(_ data: Data) { private func handleSynthesizedAudioChunk(_ data: Data) {
if suppressStreamPlayback { return } if suppressStreamPlayback { return }
if !speaking { return } if sessionid.isEmpty { return }
notifyAudioData(data) notifyAudioData(data)
guard isUsingPushStreamCapture else { return } guard isUsingPushStreamCapture else { return }
audioPlaybackQueue.async { audioPlaybackQueue.async {
if !self.speaking { return } if self.sessionid.isEmpty { return }
let pcm = self.stripWavHeaderIfNeeded(data) let pcm = self.stripWavHeaderIfNeeded(data)
if !pcm.isEmpty { if !pcm.isEmpty {
self.pcmPendingData.append(pcm) self.pcmPendingData.append(pcm)
@ -767,6 +771,7 @@ public class AzureTtsHelper: NSObject, ITtsService, AVAudioPlayerDelegate {
*/ */
private func checkStreamPlaybackCompletedIfNeeded() { private func checkStreamPlaybackCompletedIfNeeded() {
if activeStreamSynthesisCount == 0, pcmPendingData.isEmpty, scheduledBufferCount == 0 { if activeStreamSynthesisCount == 0, pcmPendingData.isEmpty, scheduledBufferCount == 0 {
speaking = false
hasNotifiedPlaybackStartedForStream = false hasNotifiedPlaybackStartedForStream = false
os_log("调用链: 流式播放完成 session=%{public}@", log: log, type: .info, sessionid) os_log("调用链: 流式播放完成 session=%{public}@", log: log, type: .info, sessionid)
notifyEvent(eventType: .playbackCompleted) notifyEvent(eventType: .playbackCompleted)

Loading…
Cancel
Save