diff --git a/VoiceInk/PowerMode/ActiveWindowService.swift b/VoiceInk/PowerMode/ActiveWindowService.swift index d093af5..c67d4d3 100644 --- a/VoiceInk/PowerMode/ActiveWindowService.swift +++ b/VoiceInk/PowerMode/ActiveWindowService.swift @@ -10,7 +10,7 @@ class ActiveWindowService: ObservableObject { private var whisperState: WhisperState? private let logger = Logger( - subsystem: "com.prakashjoshipax.VoiceInk", + subsystem: "com.prakashjoshipax.voiceink", category: "browser.detection" ) diff --git a/VoiceInk/PowerMode/BrowserURLService.swift b/VoiceInk/PowerMode/BrowserURLService.swift index a595ea1..fd10975 100644 --- a/VoiceInk/PowerMode/BrowserURLService.swift +++ b/VoiceInk/PowerMode/BrowserURLService.swift @@ -87,7 +87,7 @@ class BrowserURLService { static let shared = BrowserURLService() private let logger = Logger( - subsystem: "com.prakashjoshipax.VoiceInk", + subsystem: "com.prakashjoshipax.voiceink", category: "browser.applescript" ) diff --git a/VoiceInk/Services/AIEnhancementService.swift b/VoiceInk/Services/AIEnhancementService.swift index 2db112d..ea2fbd3 100644 --- a/VoiceInk/Services/AIEnhancementService.swift +++ b/VoiceInk/Services/AIEnhancementService.swift @@ -9,7 +9,7 @@ enum EnhancementPrompt { } class AIEnhancementService: ObservableObject { - private let logger = Logger(subsystem: "com.voiceink.enhancement", category: "AIEnhancementService") + private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink", category: "AIEnhancementService") @Published var isEnhancementEnabled: Bool { didSet { diff --git a/VoiceInk/Services/CloudTranscription/DeepgramTranscriptionService.swift b/VoiceInk/Services/CloudTranscription/DeepgramTranscriptionService.swift index 905aa9f..8d0a4fc 100644 --- a/VoiceInk/Services/CloudTranscription/DeepgramTranscriptionService.swift +++ b/VoiceInk/Services/CloudTranscription/DeepgramTranscriptionService.swift @@ -2,7 +2,7 @@ import Foundation import os class DeepgramTranscriptionService { - private let logger = Logger(subsystem: "com.voiceink.transcription", category: "DeepgramService") + private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink", category: "DeepgramService") func transcribe(audioURL: URL, model: any TranscriptionModel) async throws -> String { let config = try getAPIConfig(for: model) diff --git a/VoiceInk/Services/CloudTranscription/GeminiTranscriptionService.swift b/VoiceInk/Services/CloudTranscription/GeminiTranscriptionService.swift index 2babeef..543a773 100644 --- a/VoiceInk/Services/CloudTranscription/GeminiTranscriptionService.swift +++ b/VoiceInk/Services/CloudTranscription/GeminiTranscriptionService.swift @@ -2,7 +2,7 @@ import Foundation import os class GeminiTranscriptionService { - private let logger = Logger(subsystem: "com.voiceink.transcription", category: "GeminiService") + private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink", category: "GeminiService") func transcribe(audioURL: URL, model: any TranscriptionModel) async throws -> String { let config = try getAPIConfig(for: model) diff --git a/VoiceInk/Services/CloudTranscription/GroqTranscriptionService.swift b/VoiceInk/Services/CloudTranscription/GroqTranscriptionService.swift index a7587f7..3a1c90a 100644 --- a/VoiceInk/Services/CloudTranscription/GroqTranscriptionService.swift +++ b/VoiceInk/Services/CloudTranscription/GroqTranscriptionService.swift @@ -2,7 +2,7 @@ import Foundation import os class GroqTranscriptionService { - private let logger = Logger(subsystem: "com.voiceink.transcription", category: "GroqService") + private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink", category: "GroqService") func transcribe(audioURL: URL, model: any TranscriptionModel) async throws -> String { let config = try getAPIConfig(for: model) diff --git a/VoiceInk/Services/CloudTranscription/OpenAICompatibleTranscriptionService.swift b/VoiceInk/Services/CloudTranscription/OpenAICompatibleTranscriptionService.swift index 57d0325..90ed648 100644 --- a/VoiceInk/Services/CloudTranscription/OpenAICompatibleTranscriptionService.swift +++ b/VoiceInk/Services/CloudTranscription/OpenAICompatibleTranscriptionService.swift @@ -2,7 +2,7 @@ import Foundation import os class OpenAICompatibleTranscriptionService { - private let logger = Logger(subsystem: "com.voiceink.transcription", category: "OpenAICompatibleService") + private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink", category: "OpenAICompatibleService") func transcribe(audioURL: URL, model: CustomCloudModel) async throws -> String { let config = APIConfig( diff --git a/VoiceInk/Services/ParakeetTranscriptionService.swift b/VoiceInk/Services/ParakeetTranscriptionService.swift index b7ebb8d..042f53c 100644 --- a/VoiceInk/Services/ParakeetTranscriptionService.swift +++ b/VoiceInk/Services/ParakeetTranscriptionService.swift @@ -8,7 +8,7 @@ class ParakeetTranscriptionService: TranscriptionService { private var asrManager: AsrManager? private var vadManager: VadManager? private let customModelsDirectory: URL? - private let logger = Logger(subsystem: "com.voiceink.app", category: "ParakeetTranscriptionService") + private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink.parakeet", category: "ParakeetTranscriptionService") init(customModelsDirectory: URL? = nil) { self.customModelsDirectory = customModelsDirectory @@ -16,20 +16,25 @@ class ParakeetTranscriptionService: TranscriptionService { func loadModel() async throws { guard asrManager == nil else { + logger.notice("🦜 Parakeet models already loaded, skipping") return } - - guard let customModelsDirectory else { - throw ASRError.modelLoadFailed - } - + let manager = AsrManager(config: .default) - let models = try await AsrModels.load(from: customModelsDirectory) - try await manager.initialize(models: models) - - self.asrManager = manager - logger.notice("🦜 Parakeet ASR models loaded successfully") - } + let models: AsrModels + + if let customModelsDirectory = customModelsDirectory { + models = try await AsrModels.load(from: customModelsDirectory) + } else { + // Fallback to FluidAudio's default directory + logger.notice("🦜 Loading Parakeet models from FluidAudio default directory") + models = try await AsrModels.downloadAndLoad() + } + + try await manager.initialize(models: models) + + self.asrManager = manager + } func transcribe(audioURL: URL, model: any TranscriptionModel) async throws -> String { try await loadModel() @@ -73,7 +78,7 @@ class ParakeetTranscriptionService: TranscriptionService { } } - let result = try await asrManager.transcribe(speechAudio, source: .system) + let result = try await asrManager.transcribe(speechAudio) logger.notice("🦜 Parakeet transcription result: \(result.text)") @@ -100,10 +105,9 @@ class ParakeetTranscriptionService: TranscriptionService { } } - func cleanup() { - asrManager?.cleanup() - asrManager = nil - vadManager = nil - logger.notice("🦜 Parakeet ASR models cleaned up from memory") + func cleanup() { + asrManager?.cleanup() + asrManager = nil + vadManager = nil } -} \ No newline at end of file +} diff --git a/VoiceInk/Services/PromptDetectionService.swift b/VoiceInk/Services/PromptDetectionService.swift index 4e11c79..ac448b7 100644 --- a/VoiceInk/Services/PromptDetectionService.swift +++ b/VoiceInk/Services/PromptDetectionService.swift @@ -3,7 +3,7 @@ import os class PromptDetectionService { private let logger = Logger( - subsystem: "com.prakashjoshipax.VoiceInk", + subsystem: "com.prakashjoshipax.voiceink", category: "promptdetection" ) diff --git a/VoiceInk/Services/ScreenCaptureService.swift b/VoiceInk/Services/ScreenCaptureService.swift index 17b47ad..c2a7938 100644 --- a/VoiceInk/Services/ScreenCaptureService.swift +++ b/VoiceInk/Services/ScreenCaptureService.swift @@ -8,7 +8,7 @@ class ScreenCaptureService: ObservableObject { @Published var lastCapturedText: String? private let logger = Logger( - subsystem: "com.prakashjoshipax.VoiceInk", + subsystem: "com.prakashjoshipax.voiceink", category: "aienhancement" ) diff --git a/VoiceInk/Services/VoiceActivityDetector.swift b/VoiceInk/Services/VoiceActivityDetector.swift index 67cd0f3..3459dc6 100644 --- a/VoiceInk/Services/VoiceActivityDetector.swift +++ b/VoiceInk/Services/VoiceActivityDetector.swift @@ -18,7 +18,7 @@ fileprivate typealias WhisperVADSegments = OpaquePointer class VoiceActivityDetector { private var vadContext: WhisperVADContext - private let logger = Logger(subsystem: "com.voiceink.app", category: "VoiceActivityDetector") + private let logger = Logger(subsystem: "com.prakashjoshipax.voiceink", category: "VoiceActivityDetector") init?(modelPath: String) { var contextParams = whisper_vad_default_context_params() diff --git a/VoiceInk/VoiceInk.swift b/VoiceInk/VoiceInk.swift index 9ff43c2..4b852c1 100644 --- a/VoiceInk/VoiceInk.swift +++ b/VoiceInk/VoiceInk.swift @@ -4,6 +4,7 @@ import Sparkle import AppKit import OSLog import AppIntents +import FluidAudio @main struct VoiceInkApp: App { @@ -27,6 +28,9 @@ struct VoiceInkApp: App { private let transcriptionAutoCleanupService = TranscriptionAutoCleanupService.shared init() { + // Configure FluidAudio logging subsystem + AppLogger.defaultSubsystem = "com.prakashjoshipax.voiceink.parakeet" + do { let schema = Schema([ Transcription.self