diff --git a/VoiceInk/Views/Recorder/MiniRecorderView.swift b/VoiceInk/Views/Recorder/MiniRecorderView.swift index 573b921..5de8c27 100644 --- a/VoiceInk/Views/Recorder/MiniRecorderView.swift +++ b/VoiceInk/Views/Recorder/MiniRecorderView.swift @@ -47,14 +47,26 @@ struct MiniRecorderView: View { .padding(.leading, 8) Group { - if whisperState.isProcessing { - StaticVisualizer(color: .white) - } else { + if whisperState.isEnhancing { + Text("Enhancing") + .foregroundColor(.white) + .font(.system(size: 10, weight: .medium, design: .default)) + .lineLimit(1) + .minimumScaleFactor(0.5) + } else if whisperState.isTranscribing { + Text("Transcribing") + .foregroundColor(.white) + .font(.system(size: 10, weight: .medium, design: .default)) + .lineLimit(1) + .minimumScaleFactor(0.5) + } else if whisperState.isRecording { AudioVisualizer( audioMeter: recorder.audioMeter, color: .white, isActive: whisperState.isRecording ) + } else { + StaticVisualizer(color: .white) } } .frame(maxWidth: .infinity) diff --git a/VoiceInk/Views/Recorder/NotchRecorderView.swift b/VoiceInk/Views/Recorder/NotchRecorderView.swift index 8dc1ed9..ea5c5cb 100644 --- a/VoiceInk/Views/Recorder/NotchRecorderView.swift +++ b/VoiceInk/Views/Recorder/NotchRecorderView.swift @@ -91,21 +91,34 @@ struct NotchRecorderView: View { Spacer() Group { - if whisperState.isProcessing { - StaticVisualizer(color: .white) - } else { + if whisperState.isEnhancing { + Text("Enhancing") + .foregroundColor(.white) + .font(.system(size: 10, weight: .medium, design: .default)) + .lineLimit(1) + .minimumScaleFactor(0.5) + } else if whisperState.isTranscribing { + Text("Transcribing") + .foregroundColor(.white) + .font(.system(size: 10, weight: .medium, design: .default)) + .lineLimit(1) + .minimumScaleFactor(0.5) + } else if whisperState.isRecording { AudioVisualizer( audioMeter: recorder.audioMeter, color: .white, isActive: whisperState.isRecording ) + .scaleEffect(y: min(1.0, (menuBarHeight - 8) / 25), anchor: .center) + } else { + StaticVisualizer(color: .white) + .scaleEffect(y: min(1.0, (menuBarHeight - 8) / 25), anchor: .center) } } - .scaleEffect(y: min(1.0, (menuBarHeight - 8) / 25), anchor: .center) - .frame(width: 30) + .frame(width: 70) .padding(.trailing, 8) } - .frame(width: 64) + .frame(width: 84) .padding(.trailing, 16) } .frame(height: menuBarHeight) diff --git a/VoiceInk/Whisper/WhisperState+UI.swift b/VoiceInk/Whisper/WhisperState+UI.swift index 647db1d..51a7c3c 100644 --- a/VoiceInk/Whisper/WhisperState+UI.swift +++ b/VoiceInk/Whisper/WhisperState+UI.swift @@ -70,6 +70,7 @@ extension WhisperState { isRecording = false isVisualizerActive = false isProcessing = false + isEnhancing = false isTranscribing = false canTranscribe = true isMiniRecorderVisible = false diff --git a/VoiceInk/Whisper/WhisperState.swift b/VoiceInk/Whisper/WhisperState.swift index 8eae29e..4a054d8 100644 --- a/VoiceInk/Whisper/WhisperState.swift +++ b/VoiceInk/Whisper/WhisperState.swift @@ -21,6 +21,7 @@ class WhisperState: NSObject, ObservableObject { @Published var isProcessing = false @Published var shouldCancelRecording = false @Published var isTranscribing = false + @Published var isEnhancing = false @Published var isAutoCopyEnabled: Bool = UserDefaults.standard.object(forKey: "IsAutoCopyEnabled") as? Bool ?? true { didSet { UserDefaults.standard.set(isAutoCopyEnabled, forKey: "IsAutoCopyEnabled") @@ -279,6 +280,8 @@ class WhisperState: NSObject, ObservableObject { var text = try await transcriptionService.transcribe(audioURL: url, model: model) let transcriptionDuration = Date().timeIntervalSince(transcriptionStart) + await MainActor.run { self.isTranscribing = false } + if await checkCancellationAndCleanup() { return } text = text.trimmingCharacters(in: .whitespacesAndNewlines) @@ -304,7 +307,13 @@ class WhisperState: NSObject, ObservableObject { do { if await checkCancellationAndCleanup() { return } + await MainActor.run { self.isEnhancing = true } let textForAI = promptDetectionResult?.processedText ?? text + defer { + Task { @MainActor in + self.isEnhancing = false + } + } let (enhancedText, enhancementDuration) = try await enhancementService.enhance(textForAI) let newTranscription = Transcription( text: originalText,