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