Added support for preserving the prompt used during enhancement on

This commit is contained in:
Beingpax 2025-08-26 21:34:54 +05:45
parent 4dc50ec9ee
commit 2aac1020f8
7 changed files with 27 additions and 9 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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)

View File

@ -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)

View File

@ -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)
}

View File

@ -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
}

View File

@ -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)