vOOice/VoiceInk/Models/TranscriptionModel.swift
2025-07-23 09:30:44 +05:45

123 lines
3.7 KiB
Swift

import Foundation
// Enum to differentiate between model providers
enum ModelProvider: String, Codable, Hashable, CaseIterable {
case local = "Local"
case groq = "Groq"
case elevenLabs = "ElevenLabs"
case deepgram = "Deepgram"
case mistral = "Mistral"
case custom = "Custom"
case nativeApple = "Native Apple"
// Future providers can be added here
}
// A unified protocol for any transcription model
protocol TranscriptionModel: Identifiable, Hashable {
var id: UUID { get }
var name: String { get }
var displayName: String { get }
var description: String { get }
var provider: ModelProvider { get }
// Language capabilities
var isMultilingualModel: Bool { get }
var supportedLanguages: [String: String] { get }
}
extension TranscriptionModel {
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
var language: String {
isMultilingualModel ? "Multilingual" : "English-only"
}
}
// A new struct for Apple's native models
struct NativeAppleModel: TranscriptionModel {
let id = UUID()
let name: String
let displayName: String
let description: String
let provider: ModelProvider = .nativeApple
let isMultilingualModel: Bool
let supportedLanguages: [String: String]
}
// A new struct for cloud models
struct CloudModel: TranscriptionModel {
let id: UUID
let name: String
let displayName: String
let description: String
let provider: ModelProvider
let speed: Double
let accuracy: Double
let isMultilingualModel: Bool
let supportedLanguages: [String: String]
init(id: UUID = UUID(), name: String, displayName: String, description: String, provider: ModelProvider, speed: Double, accuracy: Double, isMultilingual: Bool, supportedLanguages: [String: String]) {
self.id = id
self.name = name
self.displayName = displayName
self.description = description
self.provider = provider
self.speed = speed
self.accuracy = accuracy
self.isMultilingualModel = isMultilingual
self.supportedLanguages = supportedLanguages
}
}
// A new struct for custom cloud models
struct CustomCloudModel: TranscriptionModel, Codable {
let id: UUID
let name: String
let displayName: String
let description: String
let provider: ModelProvider = .custom
let apiEndpoint: String
let apiKey: String
let modelName: String
let isMultilingualModel: Bool
let supportedLanguages: [String: String]
init(id: UUID = UUID(), name: String, displayName: String, description: String, apiEndpoint: String, apiKey: String, modelName: String, isMultilingual: Bool = true, supportedLanguages: [String: String]? = nil) {
self.id = id
self.name = name
self.displayName = displayName
self.description = description
self.apiEndpoint = apiEndpoint
self.apiKey = apiKey
self.modelName = modelName
self.isMultilingualModel = isMultilingual
self.supportedLanguages = supportedLanguages ?? PredefinedModels.getLanguageDictionary(isMultilingual: isMultilingual)
}
}
struct LocalModel: TranscriptionModel {
let id = UUID()
let name: String
let displayName: String
let size: String
let supportedLanguages: [String: String]
let description: String
let speed: Double
let accuracy: Double
let ramUsage: Double
let provider: ModelProvider = .local
var downloadURL: String {
"https://huggingface.co/ggerganov/whisper.cpp/resolve/main/\(filename)"
}
var filename: String {
"\(name).bin"
}
var isMultilingualModel: Bool {
supportedLanguages.count > 1
}
}