Browse Source

修复tts

newdev_shunjiawei
fdp 1 year ago
parent
commit
53dabd4ef4
  1. 113
      local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift

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

@ -264,44 +264,77 @@ public class AzureTtsHelper: NSObject, ITtsService {
pendingTasks.removeAll() pendingTasks.removeAll()
taskLock.unlock() taskLock.unlock()
do { // 使用异步停止方法并等待完成
print("liwei-------------停止语音合成播放") let stopGroup = DispatchGroup()
try self.synthesizer?.stopSpeaking() stopGroup.enter()
self.notifyEvent(eventType: .synthesisCanceled)
if !micCapture.isCapturing{
// 停止时设置音频会话为非活跃状态
// try AVAudioSession.sharedInstance().setActive(false)
}
print("音频会话已设置为非活跃状态")
} catch {
os_log("停止语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
self.notifyEvent(eventType: .error, params: [
"errorCode": "STOP_FAILED",
"errorMessage": error.localizedDescription
])
}
synthesisQueue.async { synthesisQueue.async { [weak self] in
guard let self = self else {
stopGroup.leave()
return
}
do { do {
print("liwei-------------停止语音合成播放")
// 使用异步停止方法
if let synthesizer = self.synthesizer {
let stopFuture = synthesizer.stopSpeakingAsync()
// 等待停止操作完成
_ = stopFuture.get()
}
self.notifyEvent(eventType: .synthesisCanceled)
if !self.micCapture.isCapturing {
// 停止时设置音频会话为非活跃状态
// try AVAudioSession.sharedInstance().setActive(false)
}
print("音频会话已设置为非活跃状态")
// 等待所有合成操作完成后再重新创建
self.synthesisGroup.wait()
// 安全地销毁和重新创建合成器
self.synthesizer = nil self.synthesizer = nil
try self.recreateSynthesizer() try self.recreateSynthesizer()
}catch {
os_log("重置语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription) } catch {
os_log("停止语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
self.notifyEvent(eventType: .error, params: [
"errorCode": "STOP_FAILED",
"errorMessage": error.localizedDescription
])
} }
stopGroup.leave()
} }
// 等待停止操作完成
stopGroup.wait()
return true return true
} }
/** /**
* 释放资源 * 释放资源
*/ */
public func dispose() { public func dispose() {
// 先停止所有操作
_ = stop() _ = stop()
// 等待所有异步操作完成
synthesisGroup.wait() synthesisGroup.wait()
synthesisQueue.sync { synthesisQueue.sync {
// 确保合成器完全停止后再销毁
if let synthesizer = self.synthesizer {
do {
let stopFuture = synthesizer.stopSpeakingAsync()
_ = try stopFuture.get()
} catch {
os_log("停止合成器失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
}
}
synthesizer = nil synthesizer = nil
speechConfig = nil speechConfig = nil
customAudioOutputStream = nil customAudioOutputStream = nil
@ -441,29 +474,55 @@ public class AzureTtsHelper: NSObject, ITtsService {
/** /**
* 执行语音合成 * 执行语音合成
*/ */
private func performSynthesis(sessionid:String,text: String) { private func performSynthesis(sessionid: String, text: String) {
if (self.sessionid != sessionid) { if (self.sessionid != sessionid) {
return return
} }
// 进入合成组
synthesisGroup.enter()
speaking = true speaking = true
// lastSpokenText = text
// 生成SSML // 生成SSML
let ssml = generateOptimizedSsml(text) let ssml = generateOptimizedSsml(text)
do { do {
if (self.sessionid != sessionid) { if (self.sessionid != sessionid) {
synthesisGroup.leave()
return return
} }
os_log("开始合成: %{public}@", log: log, type: .debug, ssml) os_log("开始合成: %{public}@", log: log, type: .debug, ssml)
let result = try synthesizer?.startSpeakingSsml(ssml)
if let result = result { // 使用异步合成方法
os_log("合成完成,结果: %{public}@", log: log, type: .debug, String(describing: result.reason)) if let synthesizer = self.synthesizer {
let future = synthesizer.speakSsmlAsync(ssml)
// 在后台等待合成完成
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
defer {
self?.synthesisGroup.leave()
}
do {
let result = try future.get()
os_log("合成完成,结果: %{public}@", log: self?.log ?? OSLog.default, type: .debug, String(describing: result.reason))
} catch {
self?.speaking = false
self?.pendingTextCount = max(0, (self?.pendingTextCount ?? 0) - text.count)
os_log("异步语音合成失败: %{public}@", log: self?.log ?? OSLog.default, type: .error, error.localizedDescription)
self?.notifyEvent(eventType: .error, params: [
"errorCode": "ASYNC_SYNTHESIS_FAILED",
"errorMessage": error.localizedDescription
])
}
}
} }
} catch { } catch {
speaking = false speaking = false
// 减少待处理文本计数
pendingTextCount = max(0, pendingTextCount - text.count) pendingTextCount = max(0, pendingTextCount - text.count)
synthesisGroup.leave()
os_log("语音合成失败: %{public}@", log: log, type: .error, error.localizedDescription) os_log("语音合成失败: %{public}@", log: log, type: .error, error.localizedDescription)
notifyEvent(eventType: .error, params: [ notifyEvent(eventType: .error, params: [
"errorCode": "SYNTHESIS_FAILED", "errorCode": "SYNTHESIS_FAILED",

Loading…
Cancel
Save