Skip to content

Commit ea30a54

Browse files
committed
Fix SenseVoice finalization and settings copy
1 parent 60edbac commit ea30a54

24 files changed

Lines changed: 365 additions & 151 deletions

Voxt/App/AppDelegate+PreferencesAndHistory.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,6 @@ extension AppDelegate {
115115
)
116116
}
117117

118-
var translateSelectedTextOnTranslationHotkey: Bool {
119-
defaults.bool(forKey: AppPreferenceKey.translateSelectedTextOnTranslationHotkey)
120-
}
121-
122118
var showSelectedTextTranslationResultWindow: Bool {
123119
defaults.object(forKey: AppPreferenceKey.showSelectedTextTranslationResultWindow) as? Bool ?? true
124120
}

Voxt/App/AppDelegate+RecordingSessionCapture.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,15 @@ extension AppDelegate {
376376
}
377377
}
378378

379+
func consumeActiveRecordingRuntimeFailureMessage() -> String? {
380+
switch transcriptionEngine {
381+
case .mlxAudio:
382+
return mlxTranscriber?.consumePendingRuntimeFailureMessage()
383+
case .whisperKit, .remote, .dictation:
384+
return nil
385+
}
386+
}
387+
379388
func setActiveRecordingTranscriberEnhancingState(_ isEnhancing: Bool) {
380389
switch transcriptionEngine {
381390
case .mlxAudio:

Voxt/App/AppDelegate+RecordingSessionTextRouting.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,18 @@ extension AppDelegate {
7777
)
7878
let text = sanitizedFinalTranscriptionText(displayText)
7979
guard !text.isEmpty else {
80+
if let runtimeFailureMessage = consumeActiveRecordingRuntimeFailureMessage() {
81+
if isCurrentTranscriptionNoteSessionActive {
82+
_ = captureTrailingVoxtNoteIfNeeded(finalRawText: currentSessionRawTranscribedText())
83+
}
84+
VoxtLog.warning(
85+
"Transcription result is empty because runtime inference failed. message=\(runtimeFailureMessage)"
86+
)
87+
showOverlayStatus(runtimeFailureMessage, clearAfter: 2.4)
88+
setEnhancingState(false)
89+
finishSession(after: 2.4)
90+
return
91+
}
8092
if isCurrentTranscriptionNoteSessionActive {
8193
_ = captureTrailingVoxtNoteIfNeeded(finalRawText: currentSessionRawTranscribedText())
8294
} else {

Voxt/App/AppDelegate+TranslationFlow.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ extension AppDelegate {
8888
}
8989

9090
func beginSelectedTextTranslationIfPossible() -> Bool {
91-
guard translateSelectedTextOnTranslationHotkey else { return false }
9291
guard !isSessionActive else { return false }
9392
guard let selectedText = selectedTextFromSystemSelection(),
9493
!selectedText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty

Voxt/Settings/FeatureSettings.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,22 +273,19 @@ struct TranslationFeatureSettings: Codable, Hashable, Sendable {
273273
var modelSelectionID: FeatureModelSelectionID
274274
var targetLanguageRawValue: String
275275
var prompt: String
276-
var replaceSelectedText: Bool
277276
var showResultWindow: Bool
278277

279278
init(
280279
asrSelectionID: FeatureModelSelectionID,
281280
modelSelectionID: FeatureModelSelectionID,
282281
targetLanguageRawValue: String,
283282
prompt: String,
284-
replaceSelectedText: Bool,
285283
showResultWindow: Bool = true
286284
) {
287285
self.asrSelectionID = asrSelectionID
288286
self.modelSelectionID = modelSelectionID
289287
self.targetLanguageRawValue = targetLanguageRawValue
290288
self.prompt = prompt
291-
self.replaceSelectedText = replaceSelectedText
292289
self.showResultWindow = showResultWindow
293290
}
294291

@@ -301,7 +298,6 @@ struct TranslationFeatureSettings: Codable, Hashable, Sendable {
301298
case modelSelectionID
302299
case targetLanguageRawValue
303300
case prompt
304-
case replaceSelectedText
305301
case showResultWindow
306302
}
307303

@@ -312,7 +308,6 @@ struct TranslationFeatureSettings: Codable, Hashable, Sendable {
312308
modelSelectionID: try container.decode(FeatureModelSelectionID.self, forKey: .modelSelectionID),
313309
targetLanguageRawValue: try container.decode(String.self, forKey: .targetLanguageRawValue),
314310
prompt: try container.decode(String.self, forKey: .prompt),
315-
replaceSelectedText: try container.decode(Bool.self, forKey: .replaceSelectedText),
316311
showResultWindow: try container.decodeIfPresent(Bool.self, forKey: .showResultWindow) ?? true
317312
)
318313
}

Voxt/Settings/FeatureSettingsStore.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Foundation
33
enum FeatureSettingsStore {
44
static func migrateIfNeeded(defaults: UserDefaults = .standard) {
55
removeObsoleteLatencyProfileKeys(defaults: defaults)
6+
enforceAlwaysOnLegacyFlags(defaults: defaults)
67
guard loadRaw(defaults: defaults) == nil else {
78
return
89
}
@@ -11,6 +12,7 @@ enum FeatureSettingsStore {
1112

1213
static func load(defaults: UserDefaults = .standard) -> FeatureSettings {
1314
removeObsoleteLatencyProfileKeys(defaults: defaults)
15+
enforceAlwaysOnLegacyFlags(defaults: defaults)
1416
if let raw = loadRaw(defaults: defaults),
1517
let data = raw.data(using: .utf8),
1618
let decoded = try? JSONDecoder().decode(FeatureSettings.self, from: data) {
@@ -23,6 +25,7 @@ enum FeatureSettingsStore {
2325

2426
static func save(_ settings: FeatureSettings, defaults: UserDefaults = .standard) {
2527
removeObsoleteLatencyProfileKeys(defaults: defaults)
28+
enforceAlwaysOnLegacyFlags(defaults: defaults)
2629
let sanitized = sanitize(settings, defaults: defaults)
2730
let storageReady = storageRepresentation(for: sanitized)
2831
if let data = try? JSONEncoder().encode(storageReady),
@@ -67,6 +70,11 @@ enum FeatureSettingsStore {
6770
defaults.removeObject(forKey: "rewriteLatencyProfile")
6871
}
6972

73+
private static func enforceAlwaysOnLegacyFlags(defaults: UserDefaults) {
74+
defaults.set(true, forKey: AppPreferenceKey.translateSelectedTextOnTranslationHotkey)
75+
defaults.set(true, forKey: AppPreferenceKey.appEnhancementEnabled)
76+
}
77+
7078
static func deriveFromLegacy(defaults: UserDefaults = .standard) -> FeatureSettings {
7179
let transcriptionASR = legacyASRSelection(defaults: defaults)
7280
let transcriptionText = legacyTranscriptionTextSelection(defaults: defaults)
@@ -100,7 +108,6 @@ enum FeatureSettingsStore {
100108
kind: .translation,
101109
defaults: defaults
102110
),
103-
replaceSelectedText: true,
104111
showResultWindow: defaults.object(forKey: AppPreferenceKey.showSelectedTextTranslationResultWindow) as? Bool ?? true
105112
),
106113
rewrite: RewriteFeatureSettings(
@@ -189,7 +196,7 @@ enum FeatureSettingsStore {
189196
forKey: AppPreferenceKey.translationSystemPrompt
190197
)
191198
defaults.set(settings.targetLanguage.rawValue, forKey: AppPreferenceKey.translationTargetLanguage)
192-
defaults.set(settings.replaceSelectedText, forKey: AppPreferenceKey.translateSelectedTextOnTranslationHotkey)
199+
defaults.set(true, forKey: AppPreferenceKey.translateSelectedTextOnTranslationHotkey)
193200
defaults.set(settings.showResultWindow, forKey: AppPreferenceKey.showSelectedTextTranslationResultWindow)
194201

195202
switch settings.modelSelectionID.translationSelection {
@@ -256,7 +263,6 @@ enum FeatureSettingsStore {
256263
kind: .translation,
257264
defaults: defaults
258265
),
259-
replaceSelectedText: true,
260266
showResultWindow: settings.translation.showResultWindow
261267
),
262268
rewrite: RewriteFeatureSettings(
@@ -287,7 +293,6 @@ enum FeatureSettingsStore {
287293
modelSelectionID: settings.translation.modelSelectionID,
288294
targetLanguageRawValue: settings.translation.targetLanguageRawValue,
289295
prompt: AppPromptDefaults.canonicalStoredText(settings.translation.prompt, kind: .translation),
290-
replaceSelectedText: true,
291296
showResultWindow: settings.translation.showResultWindow
292297
),
293298
rewrite: RewriteFeatureSettings(

Voxt/Settings/OnboardingSettingsView+Data.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,6 @@ extension OnboardingSettingsView {
274274
existingSelection: settings.translation.modelSelectionID
275275
)
276276
settings.translation.targetLanguageRawValue = translationTargetLanguageRaw
277-
settings.translation.replaceSelectedText = translateSelectedTextOnTranslationHotkey
278277

279278
settings.rewrite.asrSelectionID = asrSelection
280279
settings.rewrite.llmSelectionID = llmSelection

Voxt/Settings/OnboardingSettingsView+Steps.swift

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -495,11 +495,6 @@ extension OnboardingSettingsView {
495495
Text(localized("When enabled, translated text is kept in the clipboard in addition to being inserted into the current input."))
496496
.font(.caption)
497497
.foregroundStyle(.secondary)
498-
499-
Toggle(localized("Translate selected text with translation shortcut"), isOn: $translateSelectedTextOnTranslationHotkey)
500-
Text(localized("If text is selected, the translation shortcut translates the selection directly instead of starting a recording."))
501-
.font(.caption)
502-
.foregroundStyle(.secondary)
503498
}
504499

505500
GeneralSettingsCard(title: "Test Translation") {
@@ -857,17 +852,12 @@ extension OnboardingSettingsView {
857852
}
858853

859854
var translationShortcutTestLines: [String] {
860-
var lines = [
855+
let lines = [
861856
AppLocalization.format("Current preset: %@", hotkeyPresetSelection.wrappedValue.title),
862-
AppLocalization.format("Translation shortcut: %@", formattedTranslationHotkey)
857+
AppLocalization.format("Translation shortcut: %@", formattedTranslationHotkey),
858+
AppLocalization.format("Select text in the textarea below, then press %@ to translate the selection directly.", formattedTranslationHotkey)
863859
]
864860

865-
if translateSelectedTextOnTranslationHotkey {
866-
lines.append(AppLocalization.format("Select text in the textarea below, then press %@ to translate the selection directly.", formattedTranslationHotkey))
867-
} else {
868-
lines.append(localized("Enable “Translate selected text with translation shortcut” above if you want the shortcut to act on selected text in this textarea."))
869-
}
870-
871861
return lines
872862
}
873863

Voxt/Settings/OnboardingSettingsView.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ struct OnboardingSettingsView: View {
2525
@AppStorage(AppPreferenceKey.featureSettings) var featureSettingsRaw = ""
2626
@AppStorage(AppPreferenceKey.translationTargetLanguage) var translationTargetLanguageRaw = TranslationTargetLanguage.english.rawValue
2727
@AppStorage(AppPreferenceKey.userMainLanguageCodes) var userMainLanguageCodesRaw = UserMainLanguageOption.defaultStoredSelectionValue
28-
@AppStorage(AppPreferenceKey.translateSelectedTextOnTranslationHotkey) var translateSelectedTextOnTranslationHotkey = true
2928
@AppStorage(AppPreferenceKey.autoCopyWhenNoFocusedInput) var autoCopyWhenNoFocusedInput = false
3029
@AppStorage(AppPreferenceKey.modelStorageRootPath) var modelStorageRootPath = ""
3130
@AppStorage(AppPreferenceKey.useHfMirror) var useHfMirror = false
@@ -288,10 +287,7 @@ struct OnboardingSettingsView: View {
288287
let targetLanguageObserved = AnyView(remoteLLMObserved.onChange(of: translationTargetLanguageRaw) { _, _ in
289288
syncOnboardingFeatureSelections()
290289
})
291-
let translationSelectionObserved = AnyView(targetLanguageObserved.onChange(of: translateSelectedTextOnTranslationHotkey) { _, _ in
292-
syncOnboardingFeatureSelections()
293-
})
294-
let stepObserved = AnyView(translationSelectionObserved.onChange(of: currentStep) { _, newValue in
290+
let stepObserved = AnyView(targetLanguageObserved.onChange(of: currentStep) { _, newValue in
295291
OnboardingPreferenceManager.saveLastStep(newValue)
296292
prepareDemoPlayerIfNeeded(for: newValue)
297293
})

Voxt/Settings/VoiceEndCommandSettingsSection.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ struct VoiceEndCommandSettingsSection: View {
4343
Text("Instruction")
4444
.font(.body.weight(.semibold))
4545
.foregroundStyle(.primary.opacity(0.92))
46-
Text("Say this phrase at the end, then pause briefly to stop voice input automatically.")
46+
Text("Say this command at the end to end automatically.")
4747
.font(.caption)
4848
.foregroundStyle(.secondary)
4949
.fixedSize(horizontal: false, vertical: true)

0 commit comments

Comments
 (0)