TM-SGNL-iOS/Signal/Accessibility/SpeechManager.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

54 lines
1.7 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
public import AVFAudio
import SignalServiceKit
public class SpeechManager: NSObject, AVSpeechSynthesizerDelegate {
nonisolated(unsafe) private let speechSynthesizer = AVSpeechSynthesizer()
override init() {
super.init()
speechSynthesizer.delegate = self
SwiftSingletons.register(self)
}
deinit {
stopListeningToEvents()
}
public var isSpeaking: Bool {
speechSynthesizer.isSpeaking
}
public func speak(_ utterance: AVSpeechUtterance) {
stop()
speechSynthesizer.speak(utterance)
}
@objc
public func stop() {
speechSynthesizer.stopSpeaking(at: .immediate)
}
public func speechSynthesizer(_: AVSpeechSynthesizer, didStart: AVSpeechUtterance) { listenToApplicationDidEnterBackgroundEvent() }
public func speechSynthesizer(_: AVSpeechSynthesizer, didPause: AVSpeechUtterance) { stopListeningToEvents() }
public func speechSynthesizer(_: AVSpeechSynthesizer, didContinue: AVSpeechUtterance) { listenToApplicationDidEnterBackgroundEvent() }
public func speechSynthesizer(_: AVSpeechSynthesizer, didFinish: AVSpeechUtterance) { stopListeningToEvents() }
public func speechSynthesizer(_: AVSpeechSynthesizer, didCancel: AVSpeechUtterance) { stopListeningToEvents() }
private func listenToApplicationDidEnterBackgroundEvent() {
NotificationCenter.default.addObserver(
self,
selector: #selector(stop),
name: .OWSApplicationDidEnterBackground,
object: nil
)
}
private func stopListeningToEvents() {
NotificationCenter.default.removeObserver(self)
}
}