diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 0f1fc4e..3bf3699 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -6993,8 +6993,6 @@ dependencies = [ [[package]] name = "transcribe-rs" version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e2b882795f8cee1a97e70bb8f4265bc159b786421ee525a372ccc6bf990fce" dependencies = [ "base64 0.22.1", "derive_builder", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 08af028..119ea74 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -69,7 +69,7 @@ rusqlite = { version = "0.37", features = ["bundled"] } tar = "0.4.44" flate2 = "1.0" sha2 = "0.10" -transcribe-rs = { version = "0.3.2", features = ["whisper-cpp", "onnx"] } +transcribe-rs = { version = "0.3.3", features = ["whisper-cpp", "onnx"] } handy-keys = "0.2.4" ferrous-opencc = "0.2.3" clap = { version = "4", features = ["derive"] } @@ -88,7 +88,7 @@ tauri-plugin-single-instance = "2.3.2" tauri-plugin-updater = "2.10.0" [target.'cfg(windows)'.dependencies] -transcribe-rs = { version = "0.3.2", features = ["whisper-vulkan", "ort-directml"] } +transcribe-rs = { version = "0.3.3", features = ["whisper-vulkan", "ort-directml"] } windows = { version = "0.61.3", features = [ "Win32_Media_Audio_Endpoints", "Win32_System_Com_StructuredStorage", @@ -100,12 +100,12 @@ winreg = "0.55" [target.'cfg(target_os = "macos")'.dependencies] tauri-nspanel = { git = "https://github.com/ahkohd/tauri-nspanel", branch = "v2.1" } -transcribe-rs = { version = "0.3.2", features = ["whisper-metal"] } +transcribe-rs = { version = "0.3.3", features = ["whisper-metal"] } [target.'cfg(target_os = "linux")'.dependencies] gtk-layer-shell = { version = "0.8", features = ["v0_6"] } gtk = "0.18" -transcribe-rs = { version = "0.3.2", features = ["whisper-vulkan"] } +transcribe-rs = { version = "0.3.3", features = ["whisper-vulkan"] } [patch.crates-io] tauri-runtime = { git = "https://github.com/cjpais/tauri.git", branch = "handy-2.10.2" } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 5d1ca10..74472b7 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -369,6 +369,7 @@ pub fn run(cli_args: CliArgs) { shortcut::change_show_tray_icon_setting, shortcut::change_whisper_accelerator_setting, shortcut::change_ort_accelerator_setting, + shortcut::change_whisper_gpu_device, shortcut::get_available_accelerators, shortcut::handy_keys::start_handy_keys_recording, shortcut::handy_keys::stop_handy_keys_recording, diff --git a/src-tauri/src/managers/transcription.rs b/src-tauri/src/managers/transcription.rs index ae995dc..32dd42c 100644 --- a/src-tauri/src/managers/transcription.rs +++ b/src-tauri/src/managers/transcription.rs @@ -10,7 +10,7 @@ use serde::Serialize; use specta::Type; use std::panic::{catch_unwind, AssertUnwindSafe}; use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; -use std::sync::{Arc, Condvar, Mutex, MutexGuard}; +use std::sync::{Arc, Condvar, Mutex, MutexGuard, OnceLock}; use std::thread; use std::time::{Duration, SystemTime}; use tauri::{AppHandle, Emitter, Manager}; @@ -717,7 +717,16 @@ pub fn apply_accelerator_settings(app: &tauri::AppHandle) { WhisperAcceleratorSetting::Gpu => accel::WhisperAccelerator::Gpu, }; accel::set_whisper_accelerator(whisper_pref); - info!("Whisper accelerator set to: {}", whisper_pref); + accel::set_whisper_gpu_device(settings.whisper_gpu_device); + info!( + "Whisper accelerator set to: {}, gpu_device: {}", + whisper_pref, + if settings.whisper_gpu_device == accel::GPU_DEVICE_AUTO { + "auto".to_string() + } else { + settings.whisper_gpu_device.to_string() + } + ); let ort_pref = match settings.ort_accelerator { OrtAcceleratorSetting::Auto => accel::OrtAccelerator::Auto, @@ -730,10 +739,35 @@ pub fn apply_accelerator_settings(app: &tauri::AppHandle) { info!("ORT accelerator set to: {}", ort_pref); } +#[derive(Serialize, Clone, Debug, Type)] +pub struct GpuDeviceOption { + pub id: i32, + pub name: String, + pub total_vram_mb: usize, +} + +static GPU_DEVICES: OnceLock> = OnceLock::new(); + +fn cached_gpu_devices() -> &'static [GpuDeviceOption] { + use transcribe_rs::whisper_cpp::gpu::list_gpu_devices; + + GPU_DEVICES.get_or_init(|| { + list_gpu_devices() + .into_iter() + .map(|d| GpuDeviceOption { + id: d.id, + name: d.name, + total_vram_mb: d.total_vram / (1024 * 1024), + }) + .collect() + }) +} + #[derive(Serialize, Clone, Debug, Type)] pub struct AvailableAccelerators { pub whisper: Vec, pub ort: Vec, + pub gpu_devices: Vec, } /// Return which accelerators are compiled into this build. @@ -750,6 +784,7 @@ pub fn get_available_accelerators() -> AvailableAccelerators { AvailableAccelerators { whisper: whisper_options, ort: ort_options, + gpu_devices: cached_gpu_devices().to_vec(), } } diff --git a/src-tauri/src/managers/transcription_mock.rs b/src-tauri/src/managers/transcription_mock.rs index 7dcdf2a..9e1f051 100644 --- a/src-tauri/src/managers/transcription_mock.rs +++ b/src-tauri/src/managers/transcription_mock.rs @@ -65,10 +65,18 @@ impl TranscriptionManager { /// No-op in CI mock. pub fn apply_accelerator_settings(_app: &tauri::AppHandle) {} +#[derive(Serialize, Clone, Debug, Type)] +pub struct GpuDeviceOption { + pub id: i32, + pub name: String, + pub total_vram_mb: usize, +} + #[derive(Serialize, Clone, Debug, Type)] pub struct AvailableAccelerators { pub whisper: Vec, pub ort: Vec, + pub gpu_devices: Vec, } /// Returns empty lists in CI mock. @@ -76,5 +84,6 @@ pub fn get_available_accelerators() -> AvailableAccelerators { AvailableAccelerators { whisper: vec![], ort: vec![], + gpu_devices: vec![], } } diff --git a/src-tauri/src/settings.rs b/src-tauri/src/settings.rs index e0588d3..6bf657b 100644 --- a/src-tauri/src/settings.rs +++ b/src-tauri/src/settings.rs @@ -397,6 +397,8 @@ pub struct AppSettings { pub whisper_accelerator: WhisperAcceleratorSetting, #[serde(default)] pub ort_accelerator: OrtAcceleratorSetting, + #[serde(default = "default_whisper_gpu_device")] + pub whisper_gpu_device: i32, #[serde(default)] pub extra_recording_buffer_ms: u64, } @@ -605,6 +607,10 @@ fn default_post_process_prompts() -> Vec { }] } +fn default_whisper_gpu_device() -> i32 { + -1 // auto +} + fn default_typing_tool() -> TypingTool { TypingTool::Auto } @@ -767,6 +773,7 @@ pub fn get_default_settings() -> AppSettings { custom_filler_words: None, whisper_accelerator: WhisperAcceleratorSetting::default(), ort_accelerator: OrtAcceleratorSetting::default(), + whisper_gpu_device: default_whisper_gpu_device(), extra_recording_buffer_ms: 0, } } diff --git a/src-tauri/src/shortcut/mod.rs b/src-tauri/src/shortcut/mod.rs index ac0c677..6d179f1 100644 --- a/src-tauri/src/shortcut/mod.rs +++ b/src-tauri/src/shortcut/mod.rs @@ -1133,7 +1133,16 @@ pub fn change_ort_accelerator_setting( Ok(()) } -/// Return which ORT accelerators are compiled into this build. +#[tauri::command] +#[specta::specta] +pub fn change_whisper_gpu_device(app: AppHandle, device: i32) -> Result<(), String> { + let mut s = settings::get_settings(&app); + s.whisper_gpu_device = device; + apply_and_reload_accelerator(&app, s); + Ok(()) +} + +/// Return which accelerators and GPU devices are available for this build. #[tauri::command] #[specta::specta] pub fn get_available_accelerators() -> crate::managers::transcription::AvailableAccelerators { diff --git a/src/bindings.ts b/src/bindings.ts index c405954..14d98b3 100644 --- a/src/bindings.ts +++ b/src/bindings.ts @@ -379,8 +379,16 @@ async changeOrtAcceleratorSetting(accelerator: OrtAcceleratorSetting) : Promise< else return { status: "error", error: e as any }; } }, +async changeWhisperGpuDevice(device: number) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("change_whisper_gpu_device", { device }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, /** - * Return which ORT accelerators are compiled into this build. + * Return which accelerators and GPU devices are available for this build. */ async getAvailableAccelerators() : Promise { return await TAURI_INVOKE("get_available_accelerators"); @@ -819,14 +827,15 @@ historyUpdatePayload: "history-update-payload" /** user-defined types **/ -export type AppSettings = { bindings: Partial<{ [key in string]: ShortcutBinding }>; push_to_talk: boolean; audio_feedback: boolean; audio_feedback_volume?: number; sound_theme?: SoundTheme; start_hidden?: boolean; autostart_enabled?: boolean; update_checks_enabled?: boolean; selected_model?: string; always_on_microphone?: boolean; selected_microphone?: string | null; clamshell_microphone?: string | null; selected_output_device?: string | null; translate_to_english?: boolean; selected_language?: string; overlay_position?: OverlayPosition; debug_mode?: boolean; log_level?: LogLevel; custom_words?: string[]; model_unload_timeout?: ModelUnloadTimeout; word_correction_threshold?: number; history_limit?: number; recording_retention_period?: RecordingRetentionPeriod; paste_method?: PasteMethod; clipboard_handling?: ClipboardHandling; auto_submit?: boolean; auto_submit_key?: AutoSubmitKey; post_process_enabled?: boolean; post_process_provider_id?: string; post_process_providers?: PostProcessProvider[]; post_process_api_keys?: Partial<{ [key in string]: string }>; post_process_models?: Partial<{ [key in string]: string }>; post_process_prompts?: LLMPrompt[]; post_process_selected_prompt_id?: string | null; mute_while_recording?: boolean; append_trailing_space?: boolean; app_language?: string; experimental_enabled?: boolean; lazy_stream_close?: boolean; keyboard_implementation?: KeyboardImplementation; show_tray_icon?: boolean; paste_delay_ms?: number; typing_tool?: TypingTool; external_script_path: string | null; custom_filler_words?: string[] | null; whisper_accelerator?: WhisperAcceleratorSetting; ort_accelerator?: OrtAcceleratorSetting; extra_recording_buffer_ms?: number } +export type AppSettings = { bindings: Partial<{ [key in string]: ShortcutBinding }>; push_to_talk: boolean; audio_feedback: boolean; audio_feedback_volume?: number; sound_theme?: SoundTheme; start_hidden?: boolean; autostart_enabled?: boolean; update_checks_enabled?: boolean; selected_model?: string; always_on_microphone?: boolean; selected_microphone?: string | null; clamshell_microphone?: string | null; selected_output_device?: string | null; translate_to_english?: boolean; selected_language?: string; overlay_position?: OverlayPosition; debug_mode?: boolean; log_level?: LogLevel; custom_words?: string[]; model_unload_timeout?: ModelUnloadTimeout; word_correction_threshold?: number; history_limit?: number; recording_retention_period?: RecordingRetentionPeriod; paste_method?: PasteMethod; clipboard_handling?: ClipboardHandling; auto_submit?: boolean; auto_submit_key?: AutoSubmitKey; post_process_enabled?: boolean; post_process_provider_id?: string; post_process_providers?: PostProcessProvider[]; post_process_api_keys?: Partial<{ [key in string]: string }>; post_process_models?: Partial<{ [key in string]: string }>; post_process_prompts?: LLMPrompt[]; post_process_selected_prompt_id?: string | null; mute_while_recording?: boolean; append_trailing_space?: boolean; app_language?: string; experimental_enabled?: boolean; lazy_stream_close?: boolean; keyboard_implementation?: KeyboardImplementation; show_tray_icon?: boolean; paste_delay_ms?: number; typing_tool?: TypingTool; external_script_path: string | null; custom_filler_words?: string[] | null; whisper_accelerator?: WhisperAcceleratorSetting; ort_accelerator?: OrtAcceleratorSetting; whisper_gpu_device?: number; extra_recording_buffer_ms?: number } export type AudioDevice = { index: string; name: string; is_default: boolean } export type AutoSubmitKey = "enter" | "ctrl_enter" | "cmd_enter" -export type AvailableAccelerators = { whisper: string[]; ort: string[] } +export type AvailableAccelerators = { whisper: string[]; ort: string[]; gpu_devices: GpuDeviceOption[] } export type BindingResponse = { success: boolean; binding: ShortcutBinding | null; error: string | null } export type ClipboardHandling = "dont_modify" | "copy_to_clipboard" export type CustomSounds = { start: boolean; stop: boolean } export type EngineType = "Whisper" | "Parakeet" | "Moonshine" | "MoonshineStreaming" | "SenseVoice" | "GigaAM" | "Canary" +export type GpuDeviceOption = { id: number; name: string; total_vram_mb: number } export type HistoryEntry = { id: number; file_name: string; timestamp: number; saved: boolean; title: string; transcription_text: string; post_processed_text: string | null; post_process_prompt: string | null; post_process_requested: boolean } export type HistoryUpdatePayload = { action: "added"; entry: HistoryEntry } | { action: "updated"; entry: HistoryEntry } | { action: "deleted"; id: number } | { action: "toggled"; id: number } /** diff --git a/src/components/settings/AccelerationSelector.tsx b/src/components/settings/AccelerationSelector.tsx index 888777d..f67e7c2 100644 --- a/src/components/settings/AccelerationSelector.tsx +++ b/src/components/settings/AccelerationSelector.tsx @@ -9,12 +9,6 @@ import type { OrtAcceleratorSetting, } from "@/bindings"; -const WHISPER_LABELS: Record = { - auto: "Auto", - cpu: "CPU", - gpu: "GPU", -}; - const ORT_LABELS: Record = { auto: "Auto", cpu: "CPU", @@ -28,6 +22,34 @@ interface AccelerationSelectorProps { grouped?: boolean; } +/** + * Whisper dropdown encodes accelerator + device in a single value: + * "auto" → accelerator=auto, gpu_device=-1 + * "cpu" → accelerator=cpu, gpu_device=-1 + * "gpu:0" → accelerator=gpu, gpu_device=0 + * "gpu:1" → accelerator=gpu, gpu_device=1 + */ +function encodeWhisperValue( + accelerator: WhisperAcceleratorSetting, + gpuDevice: number, +): string { + if (accelerator === "cpu") return "cpu"; + if (accelerator === "gpu" && gpuDevice >= 0) return `gpu:${gpuDevice}`; + return "auto"; +} + +function decodeWhisperValue(value: string): { + accelerator: WhisperAcceleratorSetting; + gpuDevice: number; +} { + if (value === "cpu") return { accelerator: "cpu", gpuDevice: -1 }; + if (value.startsWith("gpu:")) { + const id = parseInt(value.slice(4), 10); + return { accelerator: "gpu", gpuDevice: id }; + } + return { accelerator: "auto", gpuDevice: -1 }; +} + export const AccelerationSelector: FC = ({ descriptionMode = "tooltip", grouped = false, @@ -40,13 +62,29 @@ export const AccelerationSelector: FC = ({ useEffect(() => { commands.getAvailableAccelerators().then((available) => { - setWhisperOptions( - available.whisper.map((v) => ({ - value: v, - label: WHISPER_LABELS[v as WhisperAcceleratorSetting] ?? v, - })), - ); - // Always include "auto" for ORT even though available() only returns compiled-in backends + // Build combined Whisper options: Auto, [GPU devices...], CPU + const opts: DropdownOption[] = [ + { + value: "auto", + label: t("settings.advanced.acceleration.gpuDevice.auto"), + }, + ]; + + for (const dev of available.gpu_devices) { + const vramLabel = + dev.total_vram_mb >= 1024 + ? `${(dev.total_vram_mb / 1024).toFixed(1)} GB` + : `${dev.total_vram_mb} MB`; + opts.push({ + value: `gpu:${dev.id}`, + label: `${dev.name} (${vramLabel})`, + }); + } + + opts.push({ value: "cpu", label: "CPU" }); + setWhisperOptions(opts); + + // ORT options (unchanged) const ortVals = available.ort.includes("auto") ? available.ort : ["auto", ...available.ort]; @@ -57,11 +95,22 @@ export const AccelerationSelector: FC = ({ })), ); }); - }, []); + }, [t]); - const currentWhisper = getSetting("whisper_accelerator") ?? "auto"; + const currentAccelerator = getSetting("whisper_accelerator") ?? "auto"; + const currentGpuDevice = getSetting("whisper_gpu_device") ?? -1; + const currentWhisper = encodeWhisperValue( + currentAccelerator as WhisperAcceleratorSetting, + currentGpuDevice as number, + ); const currentOrt = getSetting("ort_accelerator") ?? "auto"; + const handleWhisperChange = async (value: string) => { + const { accelerator, gpuDevice } = decodeWhisperValue(value); + await updateSetting("whisper_accelerator", accelerator); + await updateSetting("whisper_gpu_device", gpuDevice); + }; + return ( <> = ({ - updateSetting( - "whisper_accelerator", - value as WhisperAcceleratorSetting, - ) + onSelect={handleWhisperChange} + disabled={ + isUpdating("whisper_accelerator") || + isUpdating("whisper_gpu_device") } - disabled={isUpdating("whisper_accelerator")} /> {ortOptions.length > 2 && ( diff --git a/src/i18n/locales/ar/translation.json b/src/i18n/locales/ar/translation.json index 910884a..feb641e 100644 --- a/src/i18n/locales/ar/translation.json +++ b/src/i18n/locales/ar/translation.json @@ -237,6 +237,11 @@ "ort": { "title": "تسريع ONNX", "description": "تسريع الأجهزة لنماذج ONNX (Parakeet، Canary، Moonshine، إلخ). DirectML على Windows تجريبي. قد تفشل النماذج في النسخ." + }, + "gpuDevice": { + "title": "جهاز GPU", + "description": "حدد وحدة معالجة الرسومات المستخدمة لاستدلال Whisper. يختار تلقائي وحدة GPU المخصصة.", + "auto": "تلقائي" } }, "startHidden": { diff --git a/src/i18n/locales/bg/translation.json b/src/i18n/locales/bg/translation.json index 54d9922..617da9d 100644 --- a/src/i18n/locales/bg/translation.json +++ b/src/i18n/locales/bg/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Ускорение за ONNX", "description": "Хардуерно ускорение за ONNX модели (Parakeet, Canary, Moonshine и др.). DirectML на Windows е експериментален. Моделите може да не транскрибират." + }, + "gpuDevice": { + "title": "GPU устройство", + "description": "Изберете кой GPU да се използва за Whisper. Автоматично избира специализирания GPU.", + "auto": "Автоматично" } }, "startHidden": { diff --git a/src/i18n/locales/cs/translation.json b/src/i18n/locales/cs/translation.json index f4e6b0c..d73a3c6 100644 --- a/src/i18n/locales/cs/translation.json +++ b/src/i18n/locales/cs/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Akcelerace ONNX", "description": "Hardwarová akcelerace pro modely ONNX (Parakeet, Canary, Moonshine atd.). DirectML na Windows je experimentální. Modely nemusí správně přepisovat." + }, + "gpuDevice": { + "title": "GPU zařízení", + "description": "Vyberte, který GPU použít pro Whisper. Automaticky vybere dedikovaný GPU.", + "auto": "Automaticky" } }, "startHidden": { diff --git a/src/i18n/locales/de/translation.json b/src/i18n/locales/de/translation.json index 30732c3..1f5acdd 100644 --- a/src/i18n/locales/de/translation.json +++ b/src/i18n/locales/de/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX-Beschleunigung", "description": "Hardwarebeschleunigung für ONNX-Modelle (Parakeet, Canary, Moonshine usw.). DirectML unter Windows ist experimentell. Modelle können bei der Transkription fehlschlagen." + }, + "gpuDevice": { + "title": "GPU-Gerät", + "description": "Wählen Sie die GPU für die Whisper-Inferenz. Auto wählt die dedizierte GPU.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/en/translation.json b/src/i18n/locales/en/translation.json index c0cf114..775e33c 100644 --- a/src/i18n/locales/en/translation.json +++ b/src/i18n/locales/en/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX Acceleration", "description": "Hardware acceleration for ONNX models (Parakeet, Canary, Moonshine, etc.). DirectML on Windows is experimental. Models may fail to transcribe." + }, + "gpuDevice": { + "title": "GPU Device", + "description": "Select which GPU to use for Whisper inference. Auto picks the dedicated GPU.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/es/translation.json b/src/i18n/locales/es/translation.json index 9f79927..ac3c7db 100644 --- a/src/i18n/locales/es/translation.json +++ b/src/i18n/locales/es/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Aceleración de ONNX", "description": "Aceleración por hardware para modelos ONNX (Parakeet, Canary, Moonshine, etc.). DirectML en Windows es experimental. Los modelos pueden fallar al transcribir." + }, + "gpuDevice": { + "title": "Dispositivo GPU", + "description": "Seleccione qué GPU usar para la inferencia de Whisper. Auto elige la GPU dedicada.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/fr/translation.json b/src/i18n/locales/fr/translation.json index 6f98550..58c13b4 100644 --- a/src/i18n/locales/fr/translation.json +++ b/src/i18n/locales/fr/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Accélération ONNX", "description": "Accélération matérielle pour les modèles ONNX (Parakeet, Canary, Moonshine, etc.). DirectML sur Windows est expérimental. Les modèles peuvent échouer à transcrire." + }, + "gpuDevice": { + "title": "Appareil GPU", + "description": "Sélectionnez le GPU à utiliser pour l'inférence Whisper. Auto choisit le GPU dédié.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/it/translation.json b/src/i18n/locales/it/translation.json index 3b724f1..c1fb10e 100644 --- a/src/i18n/locales/it/translation.json +++ b/src/i18n/locales/it/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Accelerazione ONNX", "description": "Accelerazione hardware per i modelli ONNX (Parakeet, Canary, Moonshine, ecc.). DirectML su Windows è sperimentale. I modelli potrebbero non riuscire a trascrivere." + }, + "gpuDevice": { + "title": "Dispositivo GPU", + "description": "Seleziona quale GPU utilizzare per l'inferenza Whisper. Auto sceglie la GPU dedicata.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/ja/translation.json b/src/i18n/locales/ja/translation.json index b0d6ded..7aa003a 100644 --- a/src/i18n/locales/ja/translation.json +++ b/src/i18n/locales/ja/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX アクセラレーション", "description": "ONNX モデルのハードウェアアクセラレーション(Parakeet、Canary、Moonshine など)。Windows の DirectML は実験的です。モデルの文字起こしに失敗する場合があります。" + }, + "gpuDevice": { + "title": "GPUデバイス", + "description": "Whisper推論に使用するGPUを選択します。自動は専用GPUを選択します。", + "auto": "自動" } }, "startHidden": { diff --git a/src/i18n/locales/ko/translation.json b/src/i18n/locales/ko/translation.json index fe2219e..b8b2bf2 100644 --- a/src/i18n/locales/ko/translation.json +++ b/src/i18n/locales/ko/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX 가속", "description": "ONNX 모델의 하드웨어 가속 (Parakeet, Canary, Moonshine 등). Windows의 DirectML은 실험적입니다. 모델이 전사에 실패할 수 있습니다." + }, + "gpuDevice": { + "title": "GPU 장치", + "description": "Whisper 추론에 사용할 GPU를 선택합니다. 자동은 전용 GPU를 선택합니다.", + "auto": "자동" } }, "startHidden": { diff --git a/src/i18n/locales/pl/translation.json b/src/i18n/locales/pl/translation.json index 48067a1..c90e0b7 100644 --- a/src/i18n/locales/pl/translation.json +++ b/src/i18n/locales/pl/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Akceleracja ONNX", "description": "Akceleracja sprzętowa dla modeli ONNX (Parakeet, Canary, Moonshine itp.). DirectML na Windows jest eksperymentalne. Modele mogą nie transkrybować poprawnie." + }, + "gpuDevice": { + "title": "Urządzenie GPU", + "description": "Wybierz GPU do inferencji Whisper. Auto wybiera dedykowany GPU.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/pt/translation.json b/src/i18n/locales/pt/translation.json index eee81c9..00c3308 100644 --- a/src/i18n/locales/pt/translation.json +++ b/src/i18n/locales/pt/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Aceleração ONNX", "description": "Aceleração por hardware para modelos ONNX (Parakeet, Canary, Moonshine, etc.). DirectML no Windows é experimental. Os modelos podem falhar na transcrição." + }, + "gpuDevice": { + "title": "Dispositivo GPU", + "description": "Selecione qual GPU usar para inferência do Whisper. Auto escolhe a GPU dedicada.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/ru/translation.json b/src/i18n/locales/ru/translation.json index bb12c5e..359904b 100644 --- a/src/i18n/locales/ru/translation.json +++ b/src/i18n/locales/ru/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Ускорение ONNX", "description": "Аппаратное ускорение для моделей ONNX (Parakeet, Canary, Moonshine и др.). DirectML на Windows является экспериментальным. Модели могут не выполнять транскрипцию." + }, + "gpuDevice": { + "title": "Устройство GPU", + "description": "Выберите GPU для инференса Whisper. Авто выбирает выделенный GPU.", + "auto": "Авто" } }, "startHidden": { diff --git a/src/i18n/locales/sv/translation.json b/src/i18n/locales/sv/translation.json index 16f33b5..413143d 100644 --- a/src/i18n/locales/sv/translation.json +++ b/src/i18n/locales/sv/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX-acceleration", "description": "Hårdvaruacceleration för ONNX-modeller (Parakeet, Canary, Moonshine, etc.). DirectML på Windows är experimentellt. Modeller kan misslyckas med att transkribera." + }, + "gpuDevice": { + "title": "GPU-enhet", + "description": "Välj vilken GPU som ska användas för Whisper-inferens. Auto väljer den dedikerade GPU:n.", + "auto": "Auto" } }, "startHidden": { diff --git a/src/i18n/locales/tr/translation.json b/src/i18n/locales/tr/translation.json index db2982c..5973d23 100644 --- a/src/i18n/locales/tr/translation.json +++ b/src/i18n/locales/tr/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX Hızlandırma", "description": "ONNX modelleri için donanım hızlandırma (Parakeet, Canary, Moonshine vb.). Windows'ta DirectML deneyseldir. Modeller transkripsiyon yapamayabilir." + }, + "gpuDevice": { + "title": "GPU Aygıtı", + "description": "Whisper çıkarımı için hangi GPU'nun kullanılacağını seçin. Otomatik, özel GPU'yu seçer.", + "auto": "Otomatik" } }, "startHidden": { diff --git a/src/i18n/locales/uk/translation.json b/src/i18n/locales/uk/translation.json index 6902c17..6c56dab 100644 --- a/src/i18n/locales/uk/translation.json +++ b/src/i18n/locales/uk/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Прискорення ONNX", "description": "Апаратне прискорення для моделей ONNX (Parakeet, Canary, Moonshine тощо). DirectML на Windows є експериментальним. Моделі можуть не виконувати транскрипцію." + }, + "gpuDevice": { + "title": "Пристрій GPU", + "description": "Виберіть GPU для інференсу Whisper. Автоматично обирає виділений GPU.", + "auto": "Авто" } }, "startHidden": { diff --git a/src/i18n/locales/vi/translation.json b/src/i18n/locales/vi/translation.json index aaaa64c..87c4d16 100644 --- a/src/i18n/locales/vi/translation.json +++ b/src/i18n/locales/vi/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "Tăng tốc ONNX", "description": "Tăng tốc phần cứng cho các mô hình ONNX (Parakeet, Canary, Moonshine, v.v.). DirectML trên Windows là thử nghiệm. Các mô hình có thể không chuyển đổi giọng nói được." + }, + "gpuDevice": { + "title": "Thiết bị GPU", + "description": "Chọn GPU để sử dụng cho suy luận Whisper. Tự động chọn GPU chuyên dụng.", + "auto": "Tự động" } }, "startHidden": { diff --git a/src/i18n/locales/zh-TW/translation.json b/src/i18n/locales/zh-TW/translation.json index 6c2ad52..bc95dfc 100644 --- a/src/i18n/locales/zh-TW/translation.json +++ b/src/i18n/locales/zh-TW/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX 加速", "description": "ONNX 模型的硬體加速(Parakeet、Canary、Moonshine 等)。Windows 上的 DirectML 為實驗性功能。模型可能無法正常轉錄。" + }, + "gpuDevice": { + "title": "GPU 裝置", + "description": "選擇用於 Whisper 推理的 GPU。自動選擇獨立 GPU。", + "auto": "自動" } }, "startHidden": { diff --git a/src/i18n/locales/zh/translation.json b/src/i18n/locales/zh/translation.json index 34605b5..5230568 100644 --- a/src/i18n/locales/zh/translation.json +++ b/src/i18n/locales/zh/translation.json @@ -259,6 +259,11 @@ "ort": { "title": "ONNX 加速", "description": "ONNX 模型的硬件加速(Parakeet、Canary、Moonshine 等)。Windows 上的 DirectML 为实验性功能。模型可能无法正常转录。" + }, + "gpuDevice": { + "title": "GPU 设备", + "description": "选择用于 Whisper 推理的 GPU。自动选择独立 GPU。", + "auto": "自动" } }, "startHidden": { diff --git a/src/stores/settingsStore.ts b/src/stores/settingsStore.ts index 4cbcc47..ef35ebf 100644 --- a/src/stores/settingsStore.ts +++ b/src/stores/settingsStore.ts @@ -151,6 +151,8 @@ const settingUpdaters: { ), ort_accelerator: (value) => commands.changeOrtAcceleratorSetting(value as OrtAcceleratorSetting), + whisper_gpu_device: (value) => + commands.changeWhisperGpuDevice(value as number), extra_recording_buffer_ms: (value) => commands.changeExtraRecordingBufferSetting(value as number), };