fix(ios): avoid MainActor isolation in audio tap

This commit is contained in:
Peter Steinberger
2025-12-13 00:26:05 +00:00
parent 2b38ddf78d
commit 117b01acbd

View File

@@ -2,6 +2,14 @@ import AVFAudio
import Foundation
import Speech
enum SpeechAudioTapFactory {
static func makeAppendTap(requestBox: SpeechRequestBox) -> @Sendable (AVAudioPCMBuffer, AVAudioTime) -> Void {
{ buffer, _ in
requestBox.append(buffer)
}
}
}
final class SpeechRequestBox: @unchecked Sendable {
let request: SFSpeechAudioBufferRecognitionRequest
@@ -109,19 +117,18 @@ final class VoiceWakeManager: NSObject, ObservableObject {
let requestBox = SpeechRequestBox(request: request)
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { @Sendable [requestBox] buffer, _ in
requestBox.append(buffer)
}
let tap = SpeechAudioTapFactory.makeAppendTap(requestBox: requestBox)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat, block: tap)
self.audioEngine.prepare()
try self.audioEngine.start()
self.recognitionTask = self.speechRecognizer?.recognitionTask(with: request) { [weak self] result, error in
guard let self else { return }
Task { @MainActor in
self.handleRecognitionCallback(result: result, error: error)
self.recognitionTask = self.speechRecognizer?
.recognitionTask(with: request) { [weak manager = self] result, error in
Task { @MainActor in
manager?.handleRecognitionCallback(result: result, error: error)
}
}
}
}
private func handleRecognitionCallback(result: SFSpeechRecognitionResult?, error: Error?) {