From 43b8a890ec4ec8e57781142de494f06cd6e1af3f Mon Sep 17 00:00:00 2001 From: Alcahest Date: Mon, 9 Mar 2026 20:51:43 +0100 Subject: [PATCH 1/4] feat: add dictation mode toggle in transcription settings --- src/components/SettingsPage.tsx | 54 ++++++++++++++++++++++++++++++ src/helpers/audioManager.js | 1 + src/hooks/useSettings.ts | 3 ++ src/locales/de/translation.json | 7 ++++ src/locales/en/translation.json | 7 ++++ src/locales/es/translation.json | 7 ++++ src/locales/fr/translation.json | 7 ++++ src/locales/it/translation.json | 7 ++++ src/locales/ja/translation.json | 7 ++++ src/locales/pt/translation.json | 7 ++++ src/locales/ru/translation.json | 7 ++++ src/locales/zh-CN/translation.json | 7 ++++ src/locales/zh-TW/translation.json | 7 ++++ src/stores/settingsStore.ts | 6 ++++ 14 files changed, 134 insertions(+) diff --git a/src/components/SettingsPage.tsx b/src/components/SettingsPage.tsx index 83410a84..d4ed5d15 100644 --- a/src/components/SettingsPage.tsx +++ b/src/components/SettingsPage.tsx @@ -26,6 +26,7 @@ import { RotateCw, BookOpen, Copy, + Zap, } from "lucide-react"; import { useAuth } from "../hooks/useAuth"; import { NEON_AUTH_URL, signOut } from "../lib/neonAuth"; @@ -172,6 +173,8 @@ interface TranscriptionSectionProps { setCustomTranscriptionApiKey: (key: string) => void; cloudTranscriptionBaseUrl?: string; setCloudTranscriptionBaseUrl: (url: string) => void; + dictationMode: "normal" | "fast"; + setDictationMode: (mode: string) => void; toast: (opts: { title: string; description: string; @@ -207,6 +210,8 @@ function TranscriptionSection({ setCustomTranscriptionApiKey, cloudTranscriptionBaseUrl, setCloudTranscriptionBaseUrl, + dictationMode, + setDictationMode, toast, }: TranscriptionSectionProps) { const { t } = useTranslation(); @@ -346,6 +351,51 @@ function TranscriptionSection({ )} + {/* Dictation mode selector — visible for all cloud modes, signed in or not */} + {!useLocalWhisper && ( + + +

+ {t("settingsPage.transcription.dictationMode.title")} +

+
+ + +
+
+
+ )} + {/* Custom Setup model picker — shown when Custom Setup is active or not signed in */} {(isCustomMode || !isSignedIn) && ( ); diff --git a/src/helpers/audioManager.js b/src/helpers/audioManager.js index 4d49b91f..e5fe35d2 100644 --- a/src/helpers/audioManager.js +++ b/src/helpers/audioManager.js @@ -2003,6 +2003,7 @@ registerProcessor("pcm-streaming-processor", PCMStreamingProcessor); shouldUseStreaming(isSignedInOverride) { const s = getSettings(); + if (s.dictationMode === "normal") return false; if (s.useLocalWhisper) return false; if (REALTIME_MODELS.has(s.cloudTranscriptionModel)) { diff --git a/src/hooks/useSettings.ts b/src/hooks/useSettings.ts index 56d0c62f..a91070b0 100644 --- a/src/hooks/useSettings.ts +++ b/src/hooks/useSettings.ts @@ -20,6 +20,7 @@ export interface TranscriptionSettings { cloudTranscriptionMode: string; customDictionary: string[]; assemblyAiStreaming: boolean; + dictationMode: "normal" | "fast"; } export interface ReasoningSettings { @@ -179,6 +180,8 @@ function useSettingsInternal() { customDictionary: store.customDictionary, assemblyAiStreaming: store.assemblyAiStreaming, setAssemblyAiStreaming: store.setAssemblyAiStreaming, + dictationMode: store.dictationMode, + setDictationMode: store.setDictationMode, useReasoningModel: store.useReasoningModel, reasoningModel: store.reasoningModel, reasoningProvider: store.reasoningProvider, diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json index 455e9ae9..11e73435 100644 --- a/src/locales/de/translation.json +++ b/src/locales/de/translation.json @@ -1272,6 +1272,13 @@ "description": "Konfigurieren Sie Ihren eigenen Anbieter und API-Schlüssel.", "title": "Zu benutzerdefinierter Einrichtung gewechselt" } + }, + "dictationMode": { + "title": "Diktiermodus", + "normal": "Normal", + "normalDescription": "Beste Genauigkeit. Braucht einen Moment zur Verarbeitung nach der Aufnahme.", + "fast": "Schnell", + "fastDescription": "Schnellere Ergebnisse, aber möglicherweise weniger genau." } } }, diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 479e258f..fc8f8a5b 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -1348,6 +1348,13 @@ "description": "Configure your own provider and API key.", "title": "Switched to Custom Setup" } + }, + "dictationMode": { + "title": "Dictation Mode", + "normal": "Normal", + "normalDescription": "Best accuracy. Takes a moment to process after recording.", + "fast": "Fast", + "fastDescription": "Faster results, but may be less accurate." } } }, diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 27ac8658..60863a84 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -1276,6 +1276,13 @@ "description": "Configura tu propio proveedor y clave API.", "title": "Cambiado a configuración personalizada" } + }, + "dictationMode": { + "title": "Modo de dictado", + "normal": "Normal", + "normalDescription": "Máxima precisión. Tarda un momento en procesar tras la grabación.", + "fast": "Rápido", + "fastDescription": "Resultados más rápidos, pero puede ser menos preciso." } } }, diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json index 5af8a2c5..4f51e3da 100644 --- a/src/locales/fr/translation.json +++ b/src/locales/fr/translation.json @@ -1276,6 +1276,13 @@ "description": "Configurez votre propre fournisseur et clé API.", "title": "Basculé vers la configuration personnalisée" } + }, + "dictationMode": { + "title": "Mode de dictée", + "normal": "Normal", + "normalDescription": "Meilleure précision. Prend un moment pour traiter après l'enregistrement.", + "fast": "Rapide", + "fastDescription": "Résultats plus rapides, mais peut être moins précis." } } }, diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json index f296b3ca..32e24872 100644 --- a/src/locales/it/translation.json +++ b/src/locales/it/translation.json @@ -1276,6 +1276,13 @@ "description": "Configura il tuo provider e la tua chiave API.", "title": "Passato a configurazione personalizzata" } + }, + "dictationMode": { + "title": "Modalità dettatura", + "normal": "Normale", + "normalDescription": "Massima accuratezza. Richiede un momento per elaborare dopo la registrazione.", + "fast": "Veloce", + "fastDescription": "Risultati più rapidi, ma potrebbe essere meno accurata." } } }, diff --git a/src/locales/ja/translation.json b/src/locales/ja/translation.json index f95c5ea8..f815153b 100644 --- a/src/locales/ja/translation.json +++ b/src/locales/ja/translation.json @@ -1272,6 +1272,13 @@ "description": "独自のプロバイダーと API キーを設定してください。", "title": "カスタム設定に切り替えました" } + }, + "dictationMode": { + "title": "ディクテーションモード", + "normal": "通常", + "normalDescription": "最高の精度。録音後に処理するため少し時間がかかります。", + "fast": "高速", + "fastDescription": "より速い結果が得られますが、精度が低い場合があります。" } } }, diff --git a/src/locales/pt/translation.json b/src/locales/pt/translation.json index 208cde04..cc2954f9 100644 --- a/src/locales/pt/translation.json +++ b/src/locales/pt/translation.json @@ -1248,6 +1248,13 @@ "description": "Configure seu próprio provedor e chave API.", "title": "Mudou para configuração personalizada" } + }, + "dictationMode": { + "title": "Modo de ditado", + "normal": "Normal", + "normalDescription": "Melhor precisão. Leva um momento para processar após a gravação.", + "fast": "Rápido", + "fastDescription": "Resultados mais rápidos, mas pode ser menos preciso." } } }, diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json index d449103a..caf4f9a3 100644 --- a/src/locales/ru/translation.json +++ b/src/locales/ru/translation.json @@ -1276,6 +1276,13 @@ "description": "Настройте собственного провайдера и API-ключ.", "title": "Переключено на пользовательскую настройку" } + }, + "dictationMode": { + "title": "Режим диктовки", + "normal": "Обычный", + "normalDescription": "Лучшая точность. Требуется момент на обработку после записи.", + "fast": "Быстрый", + "fastDescription": "Результаты быстрее, но может быть менее точным." } } }, diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json index 314ebb29..4992e673 100644 --- a/src/locales/zh-CN/translation.json +++ b/src/locales/zh-CN/translation.json @@ -1272,6 +1272,13 @@ "description": "请配置你的服务商和 API Key。", "title": "已切换到自定义设置" } + }, + "dictationMode": { + "title": "听写模式", + "normal": "普通", + "normalDescription": "最佳准确度。录音后需要片刻处理。", + "fast": "快速", + "fastDescription": "结果更快,但可能准确度较低。" } } }, diff --git a/src/locales/zh-TW/translation.json b/src/locales/zh-TW/translation.json index c969a5aa..01e8a8f9 100644 --- a/src/locales/zh-TW/translation.json +++ b/src/locales/zh-TW/translation.json @@ -1272,6 +1272,13 @@ "description": "設定你自己的供應商和 API Key。", "title": "已切換至自訂設定" } + }, + "dictationMode": { + "title": "聽寫模式", + "normal": "一般", + "normalDescription": "最佳準確度。錄音後需要片刻處理。", + "fast": "快速", + "fastDescription": "結果更快,但可能準確度較低。" } } }, diff --git a/src/stores/settingsStore.ts b/src/stores/settingsStore.ts index bfb84313..87a34418 100644 --- a/src/stores/settingsStore.ts +++ b/src/stores/settingsStore.ts @@ -121,6 +121,7 @@ export interface SettingsState setCloudReasoningBaseUrl: (value: string) => void; setCustomDictionary: (words: string[]) => void; setAssemblyAiStreaming: (value: boolean) => void; + setDictationMode: (value: string) => void; setUseReasoningModel: (value: boolean) => void; setReasoningModel: (value: string) => void; setReasoningProvider: (value: string) => void; @@ -242,6 +243,9 @@ export const useSettingsStore = create()((set, get) => ({ cloudReasoningBaseUrl: readString("cloudReasoningBaseUrl", API_ENDPOINTS.OPENAI_BASE), customDictionary: readStringArray("customDictionary", []), assemblyAiStreaming: readBoolean("assemblyAiStreaming", true), + dictationMode: (readString("dictationMode", "normal") === "fast" ? "fast" : "normal") as + | "normal" + | "fast", useReasoningModel: readBoolean("useReasoningModel", true), reasoningModel: readString("reasoningModel", ""), @@ -330,6 +334,7 @@ export const useSettingsStore = create()((set, get) => ({ setCloudReasoningMode: createStringSetter("cloudReasoningMode"), setCloudReasoningBaseUrl: createStringSetter("cloudReasoningBaseUrl"), setAssemblyAiStreaming: createBooleanSetter("assemblyAiStreaming"), + setDictationMode: createStringSetter("dictationMode"), setUseReasoningModel: createBooleanSetter("useReasoningModel"), setReasoningModel: createStringSetter("reasoningModel"), setReasoningProvider: createStringSetter("reasoningProvider"), @@ -524,6 +529,7 @@ export const useSettingsStore = create()((set, get) => ({ if (settings.customDictionary !== undefined) s.setCustomDictionary(settings.customDictionary); if (settings.assemblyAiStreaming !== undefined) s.setAssemblyAiStreaming(settings.assemblyAiStreaming); + if (settings.dictationMode !== undefined) s.setDictationMode(settings.dictationMode); }, updateReasoningSettings: (settings: Partial) => { From 807247c1bf5203eed7e7d96991bfe439027f56bd Mon Sep 17 00:00:00 2001 From: Alcahest Date: Mon, 9 Mar 2026 21:21:57 +0100 Subject: [PATCH 2/4] update dictation mode descriptions to be more technical --- src/locales/de/translation.json | 4 ++-- src/locales/en/translation.json | 4 ++-- src/locales/es/translation.json | 4 ++-- src/locales/fr/translation.json | 4 ++-- src/locales/it/translation.json | 4 ++-- src/locales/ja/translation.json | 4 ++-- src/locales/pt/translation.json | 4 ++-- src/locales/ru/translation.json | 4 ++-- src/locales/zh-CN/translation.json | 4 ++-- src/locales/zh-TW/translation.json | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json index 11e73435..9593a091 100644 --- a/src/locales/de/translation.json +++ b/src/locales/de/translation.json @@ -1276,9 +1276,9 @@ "dictationMode": { "title": "Diktiermodus", "normal": "Normal", - "normalDescription": "Beste Genauigkeit. Braucht einen Moment zur Verarbeitung nach der Aufnahme.", + "normalDescription": "File-basierte Transkription. Verarbeitet Audio nach der Aufnahme.", "fast": "Schnell", - "fastDescription": "Schnellere Ergebnisse, aber möglicherweise weniger genau." + "fastDescription": "WebSocket-Streaming über OpenAI Realtime API. Live-Transkription während Sie sprechen." } } }, diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index fc8f8a5b..d30f9a84 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -1352,9 +1352,9 @@ "dictationMode": { "title": "Dictation Mode", "normal": "Normal", - "normalDescription": "Best accuracy. Takes a moment to process after recording.", + "normalDescription": "File-based transcription. Processes audio after recording.", "fast": "Fast", - "fastDescription": "Faster results, but may be less accurate." + "fastDescription": "WebSocket streaming via OpenAI Realtime API. Live transcription as you speak." } } }, diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 60863a84..6972301f 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -1280,9 +1280,9 @@ "dictationMode": { "title": "Modo de dictado", "normal": "Normal", - "normalDescription": "Máxima precisión. Tarda un momento en procesar tras la grabación.", + "normalDescription": "Transcripción file-based. Procesa el audio después de grabar.", "fast": "Rápido", - "fastDescription": "Resultados más rápidos, pero puede ser menos preciso." + "fastDescription": "Streaming WebSocket a través de OpenAI Realtime API. Transcripción en tiempo real." } } }, diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json index 4f51e3da..e304187e 100644 --- a/src/locales/fr/translation.json +++ b/src/locales/fr/translation.json @@ -1280,9 +1280,9 @@ "dictationMode": { "title": "Mode de dictée", "normal": "Normal", - "normalDescription": "Meilleure précision. Prend un moment pour traiter après l'enregistrement.", + "normalDescription": "Transcription file-based. Traite l'audio après l'enregistrement.", "fast": "Rapide", - "fastDescription": "Résultats plus rapides, mais peut être moins précis." + "fastDescription": "Streaming WebSocket via OpenAI Realtime API. Transcription en temps réel." } } }, diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json index 32e24872..7020d0d4 100644 --- a/src/locales/it/translation.json +++ b/src/locales/it/translation.json @@ -1280,9 +1280,9 @@ "dictationMode": { "title": "Modalità dettatura", "normal": "Normale", - "normalDescription": "Massima accuratezza. Richiede un momento per elaborare dopo la registrazione.", + "normalDescription": "Trascrizione file-based. Elabora l'audio dopo la registrazione.", "fast": "Veloce", - "fastDescription": "Risultati più rapidi, ma potrebbe essere meno accurata." + "fastDescription": "Streaming WebSocket tramite OpenAI Realtime API. Trascrizione in tempo reale." } } }, diff --git a/src/locales/ja/translation.json b/src/locales/ja/translation.json index f815153b..93cffa91 100644 --- a/src/locales/ja/translation.json +++ b/src/locales/ja/translation.json @@ -1276,9 +1276,9 @@ "dictationMode": { "title": "ディクテーションモード", "normal": "通常", - "normalDescription": "最高の精度。録音後に処理するため少し時間がかかります。", + "normalDescription": "ファイルベースの文字起こし。録音後にオーディオを処理します。", "fast": "高速", - "fastDescription": "より速い結果が得られますが、精度が低い場合があります。" + "fastDescription": "OpenAI Realtime API経由のWebSocketストリーミング。リアルタイム文字起こし。" } } }, diff --git a/src/locales/pt/translation.json b/src/locales/pt/translation.json index cc2954f9..ec8980ed 100644 --- a/src/locales/pt/translation.json +++ b/src/locales/pt/translation.json @@ -1252,9 +1252,9 @@ "dictationMode": { "title": "Modo de ditado", "normal": "Normal", - "normalDescription": "Melhor precisão. Leva um momento para processar após a gravação.", + "normalDescription": "Transcrição file-based. Processa o áudio após a gravação.", "fast": "Rápido", - "fastDescription": "Resultados mais rápidos, mas pode ser menos preciso." + "fastDescription": "Streaming WebSocket via OpenAI Realtime API. Transcrição em tempo real." } } }, diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json index caf4f9a3..80e33e94 100644 --- a/src/locales/ru/translation.json +++ b/src/locales/ru/translation.json @@ -1280,9 +1280,9 @@ "dictationMode": { "title": "Режим диктовки", "normal": "Обычный", - "normalDescription": "Лучшая точность. Требуется момент на обработку после записи.", + "normalDescription": "File-based транскрипция. Обрабатывает аудио после записи.", "fast": "Быстрый", - "fastDescription": "Результаты быстрее, но может быть менее точным." + "fastDescription": "WebSocket-стриминг через OpenAI Realtime API. Транскрипция в реальном времени." } } }, diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json index 4992e673..92c03a7c 100644 --- a/src/locales/zh-CN/translation.json +++ b/src/locales/zh-CN/translation.json @@ -1276,9 +1276,9 @@ "dictationMode": { "title": "听写模式", "normal": "普通", - "normalDescription": "最佳准确度。录音后需要片刻处理。", + "normalDescription": "基于文件的转录。录音后处理音频。", "fast": "快速", - "fastDescription": "结果更快,但可能准确度较低。" + "fastDescription": "通过 OpenAI Realtime API 进行 WebSocket 流式传输。实时转录。" } } }, diff --git a/src/locales/zh-TW/translation.json b/src/locales/zh-TW/translation.json index 01e8a8f9..430ff878 100644 --- a/src/locales/zh-TW/translation.json +++ b/src/locales/zh-TW/translation.json @@ -1276,9 +1276,9 @@ "dictationMode": { "title": "聽寫模式", "normal": "一般", - "normalDescription": "最佳準確度。錄音後需要片刻處理。", + "normalDescription": "基於檔案的轉錄。錄音後處理音訊。", "fast": "快速", - "fastDescription": "結果更快,但可能準確度較低。" + "fastDescription": "透過 OpenAI Realtime API 進行 WebSocket 串流。即時轉錄。" } } }, From 66f6d9cac0cc9eb24f04f5cdc3c3623566fd5714 Mon Sep 17 00:00:00 2001 From: Alcahest Date: Mon, 9 Mar 2026 23:00:29 +0100 Subject: [PATCH 3/4] update normal dictation mode description --- src/locales/de/translation.json | 2 +- src/locales/en/translation.json | 2 +- src/locales/es/translation.json | 2 +- src/locales/fr/translation.json | 2 +- src/locales/it/translation.json | 2 +- src/locales/ja/translation.json | 2 +- src/locales/pt/translation.json | 2 +- src/locales/ru/translation.json | 2 +- src/locales/zh-CN/translation.json | 2 +- src/locales/zh-TW/translation.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json index 9593a091..18c7f296 100644 --- a/src/locales/de/translation.json +++ b/src/locales/de/translation.json @@ -1276,7 +1276,7 @@ "dictationMode": { "title": "Diktiermodus", "normal": "Normal", - "normalDescription": "File-basierte Transkription. Verarbeitet Audio nach der Aufnahme.", + "normalDescription": "Beste Genauigkeit, braucht aber einen Moment zur Verarbeitung nach der Aufnahme.", "fast": "Schnell", "fastDescription": "WebSocket-Streaming über OpenAI Realtime API. Live-Transkription während Sie sprechen." } diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index d30f9a84..275512ee 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -1352,7 +1352,7 @@ "dictationMode": { "title": "Dictation Mode", "normal": "Normal", - "normalDescription": "File-based transcription. Processes audio after recording.", + "normalDescription": "Best accuracy, but takes a moment to process after recording.", "fast": "Fast", "fastDescription": "WebSocket streaming via OpenAI Realtime API. Live transcription as you speak." } diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 6972301f..063ea879 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -1280,7 +1280,7 @@ "dictationMode": { "title": "Modo de dictado", "normal": "Normal", - "normalDescription": "Transcripción file-based. Procesa el audio después de grabar.", + "normalDescription": "Máxima precisión, pero tarda un momento en procesar tras la grabación.", "fast": "Rápido", "fastDescription": "Streaming WebSocket a través de OpenAI Realtime API. Transcripción en tiempo real." } diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json index e304187e..20eb3291 100644 --- a/src/locales/fr/translation.json +++ b/src/locales/fr/translation.json @@ -1280,7 +1280,7 @@ "dictationMode": { "title": "Mode de dictée", "normal": "Normal", - "normalDescription": "Transcription file-based. Traite l'audio après l'enregistrement.", + "normalDescription": "Meilleure précision, mais prend un moment pour traiter après l'enregistrement.", "fast": "Rapide", "fastDescription": "Streaming WebSocket via OpenAI Realtime API. Transcription en temps réel." } diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json index 7020d0d4..f264630d 100644 --- a/src/locales/it/translation.json +++ b/src/locales/it/translation.json @@ -1280,7 +1280,7 @@ "dictationMode": { "title": "Modalità dettatura", "normal": "Normale", - "normalDescription": "Trascrizione file-based. Elabora l'audio dopo la registrazione.", + "normalDescription": "Massima accuratezza, ma richiede un momento per elaborare dopo la registrazione.", "fast": "Veloce", "fastDescription": "Streaming WebSocket tramite OpenAI Realtime API. Trascrizione in tempo reale." } diff --git a/src/locales/ja/translation.json b/src/locales/ja/translation.json index 93cffa91..9deab9f8 100644 --- a/src/locales/ja/translation.json +++ b/src/locales/ja/translation.json @@ -1276,7 +1276,7 @@ "dictationMode": { "title": "ディクテーションモード", "normal": "通常", - "normalDescription": "ファイルベースの文字起こし。録音後にオーディオを処理します。", + "normalDescription": "最高の精度ですが、録音後に処理に少し時間がかかります。", "fast": "高速", "fastDescription": "OpenAI Realtime API経由のWebSocketストリーミング。リアルタイム文字起こし。" } diff --git a/src/locales/pt/translation.json b/src/locales/pt/translation.json index ec8980ed..41748c5c 100644 --- a/src/locales/pt/translation.json +++ b/src/locales/pt/translation.json @@ -1252,7 +1252,7 @@ "dictationMode": { "title": "Modo de ditado", "normal": "Normal", - "normalDescription": "Transcrição file-based. Processa o áudio após a gravação.", + "normalDescription": "Melhor precisão, mas leva um momento para processar após a gravação.", "fast": "Rápido", "fastDescription": "Streaming WebSocket via OpenAI Realtime API. Transcrição em tempo real." } diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json index 80e33e94..de7cbf1c 100644 --- a/src/locales/ru/translation.json +++ b/src/locales/ru/translation.json @@ -1280,7 +1280,7 @@ "dictationMode": { "title": "Режим диктовки", "normal": "Обычный", - "normalDescription": "File-based транскрипция. Обрабатывает аудио после записи.", + "normalDescription": "Лучшая точность, но требуется момент на обработку после записи.", "fast": "Быстрый", "fastDescription": "WebSocket-стриминг через OpenAI Realtime API. Транскрипция в реальном времени." } diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json index 92c03a7c..77c4dab0 100644 --- a/src/locales/zh-CN/translation.json +++ b/src/locales/zh-CN/translation.json @@ -1276,7 +1276,7 @@ "dictationMode": { "title": "听写模式", "normal": "普通", - "normalDescription": "基于文件的转录。录音后处理音频。", + "normalDescription": "最佳准确度,但录音后需要片刻处理。", "fast": "快速", "fastDescription": "通过 OpenAI Realtime API 进行 WebSocket 流式传输。实时转录。" } diff --git a/src/locales/zh-TW/translation.json b/src/locales/zh-TW/translation.json index 430ff878..9b1462e0 100644 --- a/src/locales/zh-TW/translation.json +++ b/src/locales/zh-TW/translation.json @@ -1276,7 +1276,7 @@ "dictationMode": { "title": "聽寫模式", "normal": "一般", - "normalDescription": "基於檔案的轉錄。錄音後處理音訊。", + "normalDescription": "最佳準確度,但錄音後需要片刻處理。", "fast": "快速", "fastDescription": "透過 OpenAI Realtime API 進行 WebSocket 串流。即時轉錄。" } From eb0d2979edea38c5f99c460ddefc248e7b850de7 Mon Sep 17 00:00:00 2001 From: Alcahest Date: Thu, 12 Mar 2026 03:04:23 +0100 Subject: [PATCH 4/4] add dictation mode logging --- src/components/SettingsPage.tsx | 10 ++++++++-- src/helpers/audioManager.js | 7 +++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/SettingsPage.tsx b/src/components/SettingsPage.tsx index d4ed5d15..6f13b104 100644 --- a/src/components/SettingsPage.tsx +++ b/src/components/SettingsPage.tsx @@ -360,7 +360,10 @@ function TranscriptionSection({