diff --git a/VoiceInk/Models/Transcription.swift b/VoiceInk/Models/Transcription.swift index 3893b4c..0ee5512 100644 --- a/VoiceInk/Models/Transcription.swift +++ b/VoiceInk/Models/Transcription.swift @@ -11,10 +11,11 @@ final class Transcription { var audioFileURL: String? var transcriptionModelName: String? var aiEnhancementModelName: String? + var promptName: String? var transcriptionDuration: TimeInterval? var enhancementDuration: TimeInterval? - init(text: String, duration: TimeInterval, enhancedText: String? = nil, audioFileURL: String? = nil, transcriptionModelName: String? = nil, aiEnhancementModelName: String? = nil, transcriptionDuration: TimeInterval? = nil, enhancementDuration: TimeInterval? = nil) { + init(text: String, duration: TimeInterval, enhancedText: String? = nil, audioFileURL: String? = nil, transcriptionModelName: String? = nil, aiEnhancementModelName: String? = nil, promptName: String? = nil, transcriptionDuration: TimeInterval? = nil, enhancementDuration: TimeInterval? = nil) { self.id = UUID() self.text = text self.enhancedText = enhancedText @@ -23,6 +24,7 @@ final class Transcription { self.audioFileURL = audioFileURL self.transcriptionModelName = transcriptionModelName self.aiEnhancementModelName = aiEnhancementModelName + self.promptName = promptName self.transcriptionDuration = transcriptionDuration self.enhancementDuration = enhancementDuration } diff --git a/VoiceInk/Services/AIEnhancementService.swift b/VoiceInk/Services/AIEnhancementService.swift index 9c53d84..663ef34 100644 --- a/VoiceInk/Services/AIEnhancementService.swift +++ b/VoiceInk/Services/AIEnhancementService.swift @@ -325,15 +325,16 @@ class AIEnhancementService: ObservableObject { } } - func enhance(_ text: String) async throws -> (String, TimeInterval) { + func enhance(_ text: String) async throws -> (String, TimeInterval, String?) { let startTime = Date() let enhancementPrompt: EnhancementPrompt = .transcriptionEnhancement + let promptName = activePrompt?.title do { let result = try await makeRequest(text: text, mode: enhancementPrompt) let endTime = Date() let duration = endTime.timeIntervalSince(startTime) - return (result, duration) + return (result, duration, promptName) } catch { throw error } diff --git a/VoiceInk/Services/AudioFileTranscriptionManager.swift b/VoiceInk/Services/AudioFileTranscriptionManager.swift index 28e8b97..c80e0b2 100644 --- a/VoiceInk/Services/AudioFileTranscriptionManager.swift +++ b/VoiceInk/Services/AudioFileTranscriptionManager.swift @@ -124,7 +124,7 @@ class AudioTranscriptionManager: ObservableObject { enhancementService.isConfigured { processingPhase = .enhancing do { - let (enhancedText, enhancementDuration) = try await enhancementService.enhance(text) + let (enhancedText, enhancementDuration, promptName) = try await enhancementService.enhance(text) let transcription = Transcription( text: text, duration: duration, @@ -132,6 +132,7 @@ class AudioTranscriptionManager: ObservableObject { audioFileURL: permanentURL.absoluteString, transcriptionModelName: currentModel.displayName, aiEnhancementModelName: enhancementService.getAIService()?.currentModel, + promptName: promptName, transcriptionDuration: transcriptionDuration, enhancementDuration: enhancementDuration ) @@ -146,6 +147,7 @@ class AudioTranscriptionManager: ObservableObject { duration: duration, audioFileURL: permanentURL.absoluteString, transcriptionModelName: currentModel.displayName, + promptName: nil, transcriptionDuration: transcriptionDuration ) modelContext.insert(transcription) @@ -159,6 +161,7 @@ class AudioTranscriptionManager: ObservableObject { duration: duration, audioFileURL: permanentURL.absoluteString, transcriptionModelName: currentModel.displayName, + promptName: nil, transcriptionDuration: transcriptionDuration ) modelContext.insert(transcription) diff --git a/VoiceInk/Services/AudioFileTranscriptionService.swift b/VoiceInk/Services/AudioFileTranscriptionService.swift index f19a5de..f43f112 100644 --- a/VoiceInk/Services/AudioFileTranscriptionService.swift +++ b/VoiceInk/Services/AudioFileTranscriptionService.swift @@ -95,7 +95,7 @@ class AudioTranscriptionService: ObservableObject { enhancementService.isEnhancementEnabled, enhancementService.isConfigured { do { - let (enhancedText, enhancementDuration) = try await enhancementService.enhance(text) + let (enhancedText, enhancementDuration, promptName) = try await enhancementService.enhance(text) let newTranscription = Transcription( text: text, @@ -104,6 +104,7 @@ class AudioTranscriptionService: ObservableObject { audioFileURL: permanentURLString, transcriptionModelName: model.displayName, aiEnhancementModelName: enhancementService.getAIService()?.currentModel, + promptName: promptName, transcriptionDuration: transcriptionDuration, enhancementDuration: enhancementDuration ) @@ -126,6 +127,7 @@ class AudioTranscriptionService: ObservableObject { duration: duration, audioFileURL: permanentURLString, transcriptionModelName: model.displayName, + promptName: nil, transcriptionDuration: transcriptionDuration ) modelContext.insert(newTranscription) @@ -148,6 +150,7 @@ class AudioTranscriptionService: ObservableObject { duration: duration, audioFileURL: permanentURLString, transcriptionModelName: model.displayName, + promptName: nil, transcriptionDuration: transcriptionDuration ) modelContext.insert(newTranscription) diff --git a/VoiceInk/Services/VoiceInkCSVExportService.swift b/VoiceInk/Services/VoiceInkCSVExportService.swift index 5396898..74ffd5e 100644 --- a/VoiceInk/Services/VoiceInkCSVExportService.swift +++ b/VoiceInk/Services/VoiceInkCSVExportService.swift @@ -24,19 +24,20 @@ class VoiceInkCSVExportService { } private func generateCSV(for transcriptions: [Transcription]) -> String { - var csvString = "Original Transcript,Enhanced Transcript,Enhancement Model,Transcription Model,Enhancement Time,Transcription Time,Timestamp,Duration\n" + var csvString = "Original Transcript,Enhanced Transcript,Enhancement Model,Prompt Name,Transcription Model,Enhancement Time,Transcription Time,Timestamp,Duration\n" for transcription in transcriptions { let originalText = escapeCSVString(transcription.text) let enhancedText = escapeCSVString(transcription.enhancedText ?? "") let enhancementModel = escapeCSVString(transcription.aiEnhancementModelName ?? "") + let promptName = escapeCSVString(transcription.promptName ?? "") let transcriptionModel = escapeCSVString(transcription.transcriptionModelName ?? "") let enhancementTime = transcription.enhancementDuration ?? 0 let transcriptionTime = transcription.transcriptionDuration ?? 0 let timestamp = transcription.timestamp.ISO8601Format() let duration = transcription.duration - let row = "\(originalText),\(enhancedText),\(enhancementModel),\(transcriptionModel),\(enhancementTime),\(transcriptionTime),\(timestamp),\(duration)\n" + let row = "\(originalText),\(enhancedText),\(enhancementModel),\(promptName),\(transcriptionModel),\(enhancementTime),\(transcriptionTime),\(timestamp),\(duration)\n" csvString.append(row) } diff --git a/VoiceInk/Views/TranscriptionCard.swift b/VoiceInk/Views/TranscriptionCard.swift index 99e0c5b..608825b 100644 --- a/VoiceInk/Views/TranscriptionCard.swift +++ b/VoiceInk/Views/TranscriptionCard.swift @@ -99,6 +99,9 @@ struct TranscriptionCard: View { if let aiModel = transcription.aiEnhancementModelName { metadataRow(icon: "sparkles", label: "Enhancement Model", value: aiModel) } + if let promptName = transcription.promptName { + metadataRow(icon: "text.bubble.fill", label: "Prompt Used", value: promptName) + } if let duration = transcription.transcriptionDuration { metadataRow(icon: "clock.fill", label: "Transcription Time", value: formatTiming(duration)) } @@ -139,6 +142,7 @@ struct TranscriptionCard: View { private var hasMetadata: Bool { transcription.transcriptionModelName != nil || transcription.aiEnhancementModelName != nil || + transcription.promptName != nil || transcription.transcriptionDuration != nil || transcription.enhancementDuration != nil } diff --git a/VoiceInk/Whisper/WhisperState.swift b/VoiceInk/Whisper/WhisperState.swift index 627d1b1..50126d0 100644 --- a/VoiceInk/Whisper/WhisperState.swift +++ b/VoiceInk/Whisper/WhisperState.swift @@ -297,7 +297,7 @@ class WhisperState: NSObject, ObservableObject { await MainActor.run { self.recordingState = .enhancing } let textForAI = promptDetectionResult?.processedText ?? text - let (enhancedText, enhancementDuration) = try await enhancementService.enhance(textForAI) + let (enhancedText, enhancementDuration, promptName) = try await enhancementService.enhance(textForAI) let newTranscription = Transcription( text: originalText, duration: actualDuration, @@ -305,6 +305,7 @@ class WhisperState: NSObject, ObservableObject { audioFileURL: url.absoluteString, transcriptionModelName: model.displayName, aiEnhancementModelName: enhancementService.getAIService()?.currentModel, + promptName: promptName, transcriptionDuration: transcriptionDuration, enhancementDuration: enhancementDuration ) @@ -319,6 +320,7 @@ class WhisperState: NSObject, ObservableObject { enhancedText: "Enhancement failed: \(error)", audioFileURL: url.absoluteString, transcriptionModelName: model.displayName, + promptName: nil, transcriptionDuration: transcriptionDuration ) modelContext.insert(newTranscription) @@ -338,6 +340,7 @@ class WhisperState: NSObject, ObservableObject { duration: actualDuration, audioFileURL: url.absoluteString, transcriptionModelName: model.displayName, + promptName: nil, transcriptionDuration: transcriptionDuration ) modelContext.insert(newTranscription) @@ -391,7 +394,8 @@ class WhisperState: NSObject, ObservableObject { text: "Transcription Failed: \(fullErrorText)", duration: duration, enhancedText: nil, - audioFileURL: url.absoluteString + audioFileURL: url.absoluteString, + promptName: nil ) modelContext.insert(failedTranscription)