clawdbot-workspace/voiceink-streaming-code/TranscriptionServiceRegistry.swift
2026-02-06 23:01:30 -05:00

47 lines
1.7 KiB
Swift

import Foundation
import SwiftUI
import os
@MainActor
class TranscriptionServiceRegistry {
private let whisperState: WhisperState
private let modelsDirectory: URL
private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink", category: "TranscriptionServiceRegistry")
private(set) lazy var localTranscriptionService = LocalTranscriptionService(
modelsDirectory: modelsDirectory,
whisperState: whisperState
)
private(set) lazy var cloudTranscriptionService = CloudTranscriptionService(modelContext: whisperState.modelContext)
private(set) lazy var nativeAppleTranscriptionService = NativeAppleTranscriptionService()
private(set) lazy var parakeetTranscriptionService = ParakeetTranscriptionService()
init(whisperState: WhisperState, modelsDirectory: URL) {
self.whisperState = whisperState
self.modelsDirectory = modelsDirectory
}
func service(for provider: ModelProvider) -> TranscriptionService {
switch provider {
case .local:
return localTranscriptionService
case .parakeet:
return parakeetTranscriptionService
case .nativeApple:
return nativeAppleTranscriptionService
default:
return cloudTranscriptionService
}
}
func transcribe(audioURL: URL, model: any TranscriptionModel) async throws -> String {
let service = service(for: model.provider)
logger.debug("Transcribing with \(model.displayName) using \(String(describing: type(of: service)))")
return try await service.transcribe(audioURL: audioURL, model: model)
}
func cleanup() {
parakeetTranscriptionService.cleanup()
}
}