enumerate and list gpus in the whisper dropdown, improve auto gpu (#1142)

* enumerate and list gpus in the whisper dropdown, improve auto gpu
support

* add translations

* move to release transcribe-rs
This commit is contained in:
CJ Pais 2026-03-26 09:00:59 +08:00 committed by GitHub
parent 214e22dc3d
commit a6eec9e628
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 245 additions and 33 deletions

2
src-tauri/Cargo.lock generated
View file

@ -6993,8 +6993,6 @@ dependencies = [
[[package]] [[package]]
name = "transcribe-rs" name = "transcribe-rs"
version = "0.3.2" version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4e2b882795f8cee1a97e70bb8f4265bc159b786421ee525a372ccc6bf990fce"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"derive_builder", "derive_builder",

View file

@ -69,7 +69,7 @@ rusqlite = { version = "0.37", features = ["bundled"] }
tar = "0.4.44" tar = "0.4.44"
flate2 = "1.0" flate2 = "1.0"
sha2 = "0.10" 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" handy-keys = "0.2.4"
ferrous-opencc = "0.2.3" ferrous-opencc = "0.2.3"
clap = { version = "4", features = ["derive"] } clap = { version = "4", features = ["derive"] }
@ -88,7 +88,7 @@ tauri-plugin-single-instance = "2.3.2"
tauri-plugin-updater = "2.10.0" tauri-plugin-updater = "2.10.0"
[target.'cfg(windows)'.dependencies] [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 = [ windows = { version = "0.61.3", features = [
"Win32_Media_Audio_Endpoints", "Win32_Media_Audio_Endpoints",
"Win32_System_Com_StructuredStorage", "Win32_System_Com_StructuredStorage",
@ -100,12 +100,12 @@ winreg = "0.55"
[target.'cfg(target_os = "macos")'.dependencies] [target.'cfg(target_os = "macos")'.dependencies]
tauri-nspanel = { git = "https://github.com/ahkohd/tauri-nspanel", branch = "v2.1" } 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] [target.'cfg(target_os = "linux")'.dependencies]
gtk-layer-shell = { version = "0.8", features = ["v0_6"] } gtk-layer-shell = { version = "0.8", features = ["v0_6"] }
gtk = "0.18" gtk = "0.18"
transcribe-rs = { version = "0.3.2", features = ["whisper-vulkan"] } transcribe-rs = { version = "0.3.3", features = ["whisper-vulkan"] }
[patch.crates-io] [patch.crates-io]
tauri-runtime = { git = "https://github.com/cjpais/tauri.git", branch = "handy-2.10.2" } tauri-runtime = { git = "https://github.com/cjpais/tauri.git", branch = "handy-2.10.2" }

View file

@ -369,6 +369,7 @@ pub fn run(cli_args: CliArgs) {
shortcut::change_show_tray_icon_setting, shortcut::change_show_tray_icon_setting,
shortcut::change_whisper_accelerator_setting, shortcut::change_whisper_accelerator_setting,
shortcut::change_ort_accelerator_setting, shortcut::change_ort_accelerator_setting,
shortcut::change_whisper_gpu_device,
shortcut::get_available_accelerators, shortcut::get_available_accelerators,
shortcut::handy_keys::start_handy_keys_recording, shortcut::handy_keys::start_handy_keys_recording,
shortcut::handy_keys::stop_handy_keys_recording, shortcut::handy_keys::stop_handy_keys_recording,

View file

@ -10,7 +10,7 @@ use serde::Serialize;
use specta::Type; use specta::Type;
use std::panic::{catch_unwind, AssertUnwindSafe}; use std::panic::{catch_unwind, AssertUnwindSafe};
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; 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::thread;
use std::time::{Duration, SystemTime}; use std::time::{Duration, SystemTime};
use tauri::{AppHandle, Emitter, Manager}; use tauri::{AppHandle, Emitter, Manager};
@ -717,7 +717,16 @@ pub fn apply_accelerator_settings(app: &tauri::AppHandle) {
WhisperAcceleratorSetting::Gpu => accel::WhisperAccelerator::Gpu, WhisperAcceleratorSetting::Gpu => accel::WhisperAccelerator::Gpu,
}; };
accel::set_whisper_accelerator(whisper_pref); 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 { let ort_pref = match settings.ort_accelerator {
OrtAcceleratorSetting::Auto => accel::OrtAccelerator::Auto, OrtAcceleratorSetting::Auto => accel::OrtAccelerator::Auto,
@ -730,10 +739,35 @@ pub fn apply_accelerator_settings(app: &tauri::AppHandle) {
info!("ORT accelerator set to: {}", ort_pref); 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<Vec<GpuDeviceOption>> = 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)] #[derive(Serialize, Clone, Debug, Type)]
pub struct AvailableAccelerators { pub struct AvailableAccelerators {
pub whisper: Vec<String>, pub whisper: Vec<String>,
pub ort: Vec<String>, pub ort: Vec<String>,
pub gpu_devices: Vec<GpuDeviceOption>,
} }
/// Return which accelerators are compiled into this build. /// Return which accelerators are compiled into this build.
@ -750,6 +784,7 @@ pub fn get_available_accelerators() -> AvailableAccelerators {
AvailableAccelerators { AvailableAccelerators {
whisper: whisper_options, whisper: whisper_options,
ort: ort_options, ort: ort_options,
gpu_devices: cached_gpu_devices().to_vec(),
} }
} }

View file

@ -65,10 +65,18 @@ impl TranscriptionManager {
/// No-op in CI mock. /// No-op in CI mock.
pub fn apply_accelerator_settings(_app: &tauri::AppHandle) {} 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)] #[derive(Serialize, Clone, Debug, Type)]
pub struct AvailableAccelerators { pub struct AvailableAccelerators {
pub whisper: Vec<String>, pub whisper: Vec<String>,
pub ort: Vec<String>, pub ort: Vec<String>,
pub gpu_devices: Vec<GpuDeviceOption>,
} }
/// Returns empty lists in CI mock. /// Returns empty lists in CI mock.
@ -76,5 +84,6 @@ pub fn get_available_accelerators() -> AvailableAccelerators {
AvailableAccelerators { AvailableAccelerators {
whisper: vec![], whisper: vec![],
ort: vec![], ort: vec![],
gpu_devices: vec![],
} }
} }

View file

@ -397,6 +397,8 @@ pub struct AppSettings {
pub whisper_accelerator: WhisperAcceleratorSetting, pub whisper_accelerator: WhisperAcceleratorSetting,
#[serde(default)] #[serde(default)]
pub ort_accelerator: OrtAcceleratorSetting, pub ort_accelerator: OrtAcceleratorSetting,
#[serde(default = "default_whisper_gpu_device")]
pub whisper_gpu_device: i32,
#[serde(default)] #[serde(default)]
pub extra_recording_buffer_ms: u64, pub extra_recording_buffer_ms: u64,
} }
@ -605,6 +607,10 @@ fn default_post_process_prompts() -> Vec<LLMPrompt> {
}] }]
} }
fn default_whisper_gpu_device() -> i32 {
-1 // auto
}
fn default_typing_tool() -> TypingTool { fn default_typing_tool() -> TypingTool {
TypingTool::Auto TypingTool::Auto
} }
@ -767,6 +773,7 @@ pub fn get_default_settings() -> AppSettings {
custom_filler_words: None, custom_filler_words: None,
whisper_accelerator: WhisperAcceleratorSetting::default(), whisper_accelerator: WhisperAcceleratorSetting::default(),
ort_accelerator: OrtAcceleratorSetting::default(), ort_accelerator: OrtAcceleratorSetting::default(),
whisper_gpu_device: default_whisper_gpu_device(),
extra_recording_buffer_ms: 0, extra_recording_buffer_ms: 0,
} }
} }

View file

@ -1133,7 +1133,16 @@ pub fn change_ort_accelerator_setting(
Ok(()) 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] #[tauri::command]
#[specta::specta] #[specta::specta]
pub fn get_available_accelerators() -> crate::managers::transcription::AvailableAccelerators { pub fn get_available_accelerators() -> crate::managers::transcription::AvailableAccelerators {

View file

@ -379,8 +379,16 @@ async changeOrtAcceleratorSetting(accelerator: OrtAcceleratorSetting) : Promise<
else return { status: "error", error: e as any }; else return { status: "error", error: e as any };
} }
}, },
async changeWhisperGpuDevice(device: number) : Promise<Result<null, string>> {
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<AvailableAccelerators> { async getAvailableAccelerators() : Promise<AvailableAccelerators> {
return await TAURI_INVOKE("get_available_accelerators"); return await TAURI_INVOKE("get_available_accelerators");
@ -819,14 +827,15 @@ historyUpdatePayload: "history-update-payload"
/** user-defined types **/ /** 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 AudioDevice = { index: string; name: string; is_default: boolean }
export type AutoSubmitKey = "enter" | "ctrl_enter" | "cmd_enter" 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 BindingResponse = { success: boolean; binding: ShortcutBinding | null; error: string | null }
export type ClipboardHandling = "dont_modify" | "copy_to_clipboard" export type ClipboardHandling = "dont_modify" | "copy_to_clipboard"
export type CustomSounds = { start: boolean; stop: boolean } export type CustomSounds = { start: boolean; stop: boolean }
export type EngineType = "Whisper" | "Parakeet" | "Moonshine" | "MoonshineStreaming" | "SenseVoice" | "GigaAM" | "Canary" 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 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 } export type HistoryUpdatePayload = { action: "added"; entry: HistoryEntry } | { action: "updated"; entry: HistoryEntry } | { action: "deleted"; id: number } | { action: "toggled"; id: number }
/** /**

View file

@ -9,12 +9,6 @@ import type {
OrtAcceleratorSetting, OrtAcceleratorSetting,
} from "@/bindings"; } from "@/bindings";
const WHISPER_LABELS: Record<WhisperAcceleratorSetting, string> = {
auto: "Auto",
cpu: "CPU",
gpu: "GPU",
};
const ORT_LABELS: Record<OrtAcceleratorSetting, string> = { const ORT_LABELS: Record<OrtAcceleratorSetting, string> = {
auto: "Auto", auto: "Auto",
cpu: "CPU", cpu: "CPU",
@ -28,6 +22,34 @@ interface AccelerationSelectorProps {
grouped?: boolean; 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<AccelerationSelectorProps> = ({ export const AccelerationSelector: FC<AccelerationSelectorProps> = ({
descriptionMode = "tooltip", descriptionMode = "tooltip",
grouped = false, grouped = false,
@ -40,13 +62,29 @@ export const AccelerationSelector: FC<AccelerationSelectorProps> = ({
useEffect(() => { useEffect(() => {
commands.getAvailableAccelerators().then((available) => { commands.getAvailableAccelerators().then((available) => {
setWhisperOptions( // Build combined Whisper options: Auto, [GPU devices...], CPU
available.whisper.map((v) => ({ const opts: DropdownOption[] = [
value: v, {
label: WHISPER_LABELS[v as WhisperAcceleratorSetting] ?? v, value: "auto",
})), label: t("settings.advanced.acceleration.gpuDevice.auto"),
); },
// Always include "auto" for ORT even though available() only returns compiled-in backends ];
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") const ortVals = available.ort.includes("auto")
? available.ort ? available.ort
: ["auto", ...available.ort]; : ["auto", ...available.ort];
@ -57,11 +95,22 @@ export const AccelerationSelector: FC<AccelerationSelectorProps> = ({
})), })),
); );
}); });
}, []); }, [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 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 ( return (
<> <>
<SettingContainer <SettingContainer
@ -74,13 +123,11 @@ export const AccelerationSelector: FC<AccelerationSelectorProps> = ({
<Dropdown <Dropdown
options={whisperOptions} options={whisperOptions}
selectedValue={currentWhisper} selectedValue={currentWhisper}
onSelect={(value) => onSelect={handleWhisperChange}
updateSetting( disabled={
"whisper_accelerator", isUpdating("whisper_accelerator") ||
value as WhisperAcceleratorSetting, isUpdating("whisper_gpu_device")
)
} }
disabled={isUpdating("whisper_accelerator")}
/> />
</SettingContainer> </SettingContainer>
{ortOptions.length > 2 && ( {ortOptions.length > 2 && (

View file

@ -237,6 +237,11 @@
"ort": { "ort": {
"title": "تسريع ONNX", "title": "تسريع ONNX",
"description": "تسريع الأجهزة لنماذج ONNX (Parakeet، Canary، Moonshine، إلخ). DirectML على Windows تجريبي. قد تفشل النماذج في النسخ." "description": "تسريع الأجهزة لنماذج ONNX (Parakeet، Canary، Moonshine، إلخ). DirectML على Windows تجريبي. قد تفشل النماذج في النسخ."
},
"gpuDevice": {
"title": "جهاز GPU",
"description": "حدد وحدة معالجة الرسومات المستخدمة لاستدلال Whisper. يختار تلقائي وحدة GPU المخصصة.",
"auto": "تلقائي"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Ускорение за ONNX", "title": "Ускорение за ONNX",
"description": "Хардуерно ускорение за ONNX модели (Parakeet, Canary, Moonshine и др.). DirectML на Windows е експериментален. Моделите може да не транскрибират." "description": "Хардуерно ускорение за ONNX модели (Parakeet, Canary, Moonshine и др.). DirectML на Windows е експериментален. Моделите може да не транскрибират."
},
"gpuDevice": {
"title": "GPU устройство",
"description": "Изберете кой GPU да се използва за Whisper. Автоматично избира специализирания GPU.",
"auto": "Автоматично"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Akcelerace ONNX", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX-Beschleunigung", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX Acceleration", "title": "ONNX Acceleration",
"description": "Hardware acceleration for ONNX models (Parakeet, Canary, Moonshine, etc.). DirectML on Windows is experimental. Models may fail to transcribe." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Aceleración de ONNX", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Accélération ONNX", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Accelerazione ONNX", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX アクセラレーション", "title": "ONNX アクセラレーション",
"description": "ONNX モデルのハードウェアアクセラレーションParakeet、Canary、Moonshine など。Windows の DirectML は実験的です。モデルの文字起こしに失敗する場合があります。" "description": "ONNX モデルのハードウェアアクセラレーションParakeet、Canary、Moonshine など。Windows の DirectML は実験的です。モデルの文字起こしに失敗する場合があります。"
},
"gpuDevice": {
"title": "GPUデバイス",
"description": "Whisper推論に使用するGPUを選択します。自動は専用GPUを選択します。",
"auto": "自動"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX 가속", "title": "ONNX 가속",
"description": "ONNX 모델의 하드웨어 가속 (Parakeet, Canary, Moonshine 등). Windows의 DirectML은 실험적입니다. 모델이 전사에 실패할 수 있습니다." "description": "ONNX 모델의 하드웨어 가속 (Parakeet, Canary, Moonshine 등). Windows의 DirectML은 실험적입니다. 모델이 전사에 실패할 수 있습니다."
},
"gpuDevice": {
"title": "GPU 장치",
"description": "Whisper 추론에 사용할 GPU를 선택합니다. 자동은 전용 GPU를 선택합니다.",
"auto": "자동"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Akceleracja ONNX", "title": "Akceleracja ONNX",
"description": "Akceleracja sprzętowa dla modeli ONNX (Parakeet, Canary, Moonshine itp.). DirectML na Windows jest eksperymentalne. Modele mogą nie transkrybować poprawnie." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Aceleração ONNX", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Ускорение ONNX", "title": "Ускорение ONNX",
"description": "Аппаратное ускорение для моделей ONNX (Parakeet, Canary, Moonshine и др.). DirectML на Windows является экспериментальным. Модели могут не выполнять транскрипцию." "description": "Аппаратное ускорение для моделей ONNX (Parakeet, Canary, Moonshine и др.). DirectML на Windows является экспериментальным. Модели могут не выполнять транскрипцию."
},
"gpuDevice": {
"title": "Устройство GPU",
"description": "Выберите GPU для инференса Whisper. Авто выбирает выделенный GPU.",
"auto": "Авто"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX-acceleration", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX Hızlandırma", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Прискорення ONNX", "title": "Прискорення ONNX",
"description": "Апаратне прискорення для моделей ONNX (Parakeet, Canary, Moonshine тощо). DirectML на Windows є експериментальним. Моделі можуть не виконувати транскрипцію." "description": "Апаратне прискорення для моделей ONNX (Parakeet, Canary, Moonshine тощо). DirectML на Windows є експериментальним. Моделі можуть не виконувати транскрипцію."
},
"gpuDevice": {
"title": "Пристрій GPU",
"description": "Виберіть GPU для інференсу Whisper. Автоматично обирає виділений GPU.",
"auto": "Авто"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "Tăng tốc ONNX", "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." "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": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX 加速", "title": "ONNX 加速",
"description": "ONNX 模型的硬體加速Parakeet、Canary、Moonshine 等。Windows 上的 DirectML 為實驗性功能。模型可能無法正常轉錄。" "description": "ONNX 模型的硬體加速Parakeet、Canary、Moonshine 等。Windows 上的 DirectML 為實驗性功能。模型可能無法正常轉錄。"
},
"gpuDevice": {
"title": "GPU 裝置",
"description": "選擇用於 Whisper 推理的 GPU。自動選擇獨立 GPU。",
"auto": "自動"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -259,6 +259,11 @@
"ort": { "ort": {
"title": "ONNX 加速", "title": "ONNX 加速",
"description": "ONNX 模型的硬件加速Parakeet、Canary、Moonshine 等。Windows 上的 DirectML 为实验性功能。模型可能无法正常转录。" "description": "ONNX 模型的硬件加速Parakeet、Canary、Moonshine 等。Windows 上的 DirectML 为实验性功能。模型可能无法正常转录。"
},
"gpuDevice": {
"title": "GPU 设备",
"description": "选择用于 Whisper 推理的 GPU。自动选择独立 GPU。",
"auto": "自动"
} }
}, },
"startHidden": { "startHidden": {

View file

@ -151,6 +151,8 @@ const settingUpdaters: {
), ),
ort_accelerator: (value) => ort_accelerator: (value) =>
commands.changeOrtAcceleratorSetting(value as OrtAcceleratorSetting), commands.changeOrtAcceleratorSetting(value as OrtAcceleratorSetting),
whisper_gpu_device: (value) =>
commands.changeWhisperGpuDevice(value as number),
extra_recording_buffer_ms: (value) => extra_recording_buffer_ms: (value) =>
commands.changeExtraRecordingBufferSetting(value as number), commands.changeExtraRecordingBufferSetting(value as number),
}; };