|
|
@ -997,7 +997,7 @@ class ChatApiStreamCallback: StreamCallback { |
|
|
if speakResponse && reply && broadcast{ |
|
|
if speakResponse && reply && broadcast{ |
|
|
try agentService.azureTtsHelper?.speakStream(token) |
|
|
try agentService.azureTtsHelper?.speakStream(token) |
|
|
// 在开始流式TTS时立即停止气泡音 |
|
|
// 在开始流式TTS时立即停止气泡音 |
|
|
try agentService.audioPlayer?.stopAwaitSound() |
|
|
// try agentService.audioPlayer?.stopAwaitSound() |
|
|
} |
|
|
} |
|
|
if (reply && token != "") { |
|
|
if (reply && token != "") { |
|
|
try agentService.sendEvent(name: "assistant_token", data: ["token": token]) |
|
|
try agentService.sendEvent(name: "assistant_token", data: ["token": token]) |
|
|
@ -1220,8 +1220,12 @@ class AudioPlayer { |
|
|
private var player: AVAudioPlayer? |
|
|
private var player: AVAudioPlayer? |
|
|
private var callingPlayer: AVAudioPlayer? |
|
|
private var callingPlayer: AVAudioPlayer? |
|
|
private var awaitPlayer: AVAudioPlayer? // 新增:等待音效播放器 |
|
|
private var awaitPlayer: AVAudioPlayer? // 新增:等待音效播放器 |
|
|
|
|
|
private var awaitTimer: DispatchSourceTimer? // 新增:等待音效超时定时器 |
|
|
private let logger = OSLog(subsystem: "com.yunqiinnovation.agent_service", category: "AudioPlayer") |
|
|
private let logger = OSLog(subsystem: "com.yunqiinnovation.agent_service", category: "AudioPlayer") |
|
|
private let audioQueue = DispatchQueue(label: "agent.audio.player", qos: .userInitiated) |
|
|
private let audioQueue = DispatchQueue(label: "agent.audio.player", qos: .userInitiated) |
|
|
|
|
|
|
|
|
|
|
|
// 等待音效超时时间(秒)- 改为 var 以支持动态修改 |
|
|
|
|
|
private var awaitTimeoutSeconds: TimeInterval = 10.0 |
|
|
|
|
|
|
|
|
private var resourcesBundle: Bundle { |
|
|
private var resourcesBundle: Bundle { |
|
|
#if SWIFT_PACKAGE |
|
|
#if SWIFT_PACKAGE |
|
|
@ -1247,7 +1251,14 @@ class AudioPlayer { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func playAwaitSound() { |
|
|
func playAwaitSound() { |
|
|
|
|
|
// 先停止之前的等待音效和定时器 |
|
|
|
|
|
stopAwaitSound() |
|
|
|
|
|
|
|
|
|
|
|
// 播放等待音效 |
|
|
playLoopSound(named: "await", fileType: "mp3", player: &awaitPlayer) |
|
|
playLoopSound(named: "await", fileType: "mp3", player: &awaitPlayer) |
|
|
|
|
|
|
|
|
|
|
|
// 启动超时定时器 |
|
|
|
|
|
startAwaitTimeout() |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func playStopSound() { |
|
|
func playStopSound() { |
|
|
@ -1264,8 +1275,14 @@ class AudioPlayer { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func stopAwaitSound() { |
|
|
func stopAwaitSound() { |
|
|
|
|
|
// 停止音频播放 |
|
|
awaitPlayer?.stop() |
|
|
awaitPlayer?.stop() |
|
|
awaitPlayer = nil |
|
|
awaitPlayer = nil |
|
|
|
|
|
|
|
|
|
|
|
// 停止超时定时器 |
|
|
|
|
|
stopAwaitTimeout() |
|
|
|
|
|
|
|
|
|
|
|
os_log("停止等待音效播放", log: logger, type: .debug) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private func playSound(named: String, fileType: String = "mp3") { |
|
|
private func playSound(named: String, fileType: String = "mp3") { |
|
|
@ -1338,6 +1355,41 @@ class AudioPlayer { |
|
|
os_log("播放循环音频失败: %{public}@", log: logger, type: .error, error.localizedDescription) |
|
|
os_log("播放循环音频失败: %{public}@", log: logger, type: .error, error.localizedDescription) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private func startAwaitTimeout() { |
|
|
|
|
|
// 停止之前的定时器 |
|
|
|
|
|
stopAwaitTimeout() |
|
|
|
|
|
|
|
|
|
|
|
// 创建新的定时器 |
|
|
|
|
|
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global(qos: .utility)) |
|
|
|
|
|
awaitTimer = timer |
|
|
|
|
|
|
|
|
|
|
|
timer.schedule(deadline: .now() + awaitTimeoutSeconds) |
|
|
|
|
|
timer.setEventHandler { [weak self] in |
|
|
|
|
|
DispatchQueue.main.async { [weak self] in |
|
|
|
|
|
guard let self = self else { return } |
|
|
|
|
|
|
|
|
|
|
|
os_log("等待音效超时,自动停止播放 - 超时时间: %.0f秒", |
|
|
|
|
|
log: self.logger, type: .info, self.awaitTimeoutSeconds) |
|
|
|
|
|
|
|
|
|
|
|
self.stopAwaitSound() |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
timer.resume() |
|
|
|
|
|
|
|
|
|
|
|
os_log("启动等待音效超时定时器,超时时间: %.0f秒", |
|
|
|
|
|
log: logger, type: .debug, awaitTimeoutSeconds) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private func stopAwaitTimeout() { |
|
|
|
|
|
awaitTimer?.cancel() |
|
|
|
|
|
awaitTimer = nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func setAwaitTimeout(_ seconds: TimeInterval) { |
|
|
|
|
|
awaitTimeoutSeconds = max(2.0, seconds) // 最小5秒 |
|
|
|
|
|
os_log("设置等待音效超时时间: %.0f秒", log: logger, type: .info, awaitTimeoutSeconds) |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
|