import SwiftUI
import Observation
import Speech

@Observable class TranscriberData {
   var finalText = AttributedString("")

   static let shared: TranscriberData = TranscriberData()
   private init() { }

   func transcribeAudio() async {
      guard let fileURL = Bundle.main.url(forResource: "story", withExtension: "mp3") else { return }
      do {
         var final: AttributedString = ""
         let locale = Locale.current
         let transcriber = SpeechTranscriber(locale: locale, preset: .transcription)

         let analyzer = SpeechAnalyzer(modules: [transcriber])
         if let sample = try await analyzer.analyzeSequence(from: AVAudioFile(forReading: fileURL)) {
            try await analyzer.finalizeAndFinish(through: sample)
         } else {
            await analyzer.cancelAndFinishNow()
         }
         for try await response in transcriber.results {
            if response.isFinal {
               final.append(response.text)
            }
         }
         finalText = final
      } catch {
         finalText = AttributedString("Error: \(error)")
      }
   }
}