fix: avoid iOS talk mode audio tap crash

This commit is contained in:
Peter Steinberger
2025-12-30 04:52:57 +01:00
parent 24f8ff7548
commit 05efc3eace
4 changed files with 12 additions and 4 deletions

View File

@@ -253,7 +253,7 @@ private struct CanvasContent: View {
private struct OverlayButton: View {
let systemImage: String
let brighten: Bool
var tint: Color? = nil
var tint: Color?
var isActive: Bool = false
let action: () -> Void

View File

@@ -7,6 +7,7 @@ import Speech
@MainActor
@Observable
final class TalkModeManager: NSObject {
private typealias SpeechRequest = SFSpeechAudioBufferRecognitionRequest
var isEnabled: Bool = false
var isListening: Bool = false
var isSpeaking: Bool = false
@@ -105,9 +106,8 @@ final class TalkModeManager: NSObject {
let input = self.audioEngine.inputNode
let format = input.outputFormat(forBus: 0)
input.removeTap(onBus: 0)
input.installTap(onBus: 0, bufferSize: 2048, format: format) { [weak request] buffer, _ in
request?.append(buffer)
}
let tapBlock = Self.makeAudioTapAppendCallback(request: request)
input.installTap(onBus: 0, bufferSize: 2048, format: format, block: tapBlock)
self.audioEngine.prepare()
try self.audioEngine.start()
@@ -135,6 +135,12 @@ final class TalkModeManager: NSObject {
self.speechRecognizer = nil
}
private nonisolated static func makeAudioTapAppendCallback(request: SpeechRequest) -> AVAudioNodeTapBlock {
{ buffer, _ in
request.append(buffer)
}
}
private func handleTranscript(transcript: String, isFinal: Bool) async {
let trimmed = transcript.trimmingCharacters(in: .whitespacesAndNewlines)
if self.isSpeaking, self.interruptOnSpeech {