| | |
| | | import { t, setLocale } from '../../lib/i18n' |
| | | import { languageMode, languageID, effectiveLanguageID, uiLocale } from '../../lib/stores/config' |
| | | import type { UILocale } from '../../lib/stores/config' |
| | | import { engineStatus, engineHardwareInfo } from '../../lib/stores/app' |
| | | import { engineStatus } from '../../lib/stores/app' |
| | | |
| | | interface ModelOption { |
| | | modelID: string |
| | |
| | | let modelCancellingID = $state('') |
| | | let modelProgress = $state(0) |
| | | let modelError = $state('') |
| | | let pendingLanguageID = $state('') |
| | | |
| | | const unsub1 = languageMode.subscribe(v => { languageModeVal = v }) |
| | | const unsub2 = languageID.subscribe(v => { languageIDVal = v }) |
| | |
| | | async function syncEngineForCurrentModel() { |
| | | try { |
| | | const current: any = await Call.ByName('voicesnap/services.EngineService.GetCurrentModelStatus') |
| | | if (current?.installed) { |
| | | if (!current?.installed) return |
| | | engineStatus.set('loading') |
| | | } else { |
| | | engineHardwareInfo.set('') |
| | | } |
| | | await Call.ByName('voicesnap/services.EngineService.ReloadCurrentModel') |
| | | } catch {} |
| | | } |
| | | |
| | | async function loadModelOptions() { |
| | | if (pendingLanguageID) { |
| | | await loadModelOptionsForLanguage(pendingLanguageID) |
| | | return |
| | | } |
| | | await loadCurrentModelOptions() |
| | | } |
| | | |
| | | async function loadCurrentModelOptions() { |
| | | try { |
| | | const options: any = await Call.ByName('voicesnap/services.EngineService.ListModelOptions') |
| | | modelOptions = Array.isArray(options) ? options : [] |
| | | } catch { |
| | | modelOptions = [] |
| | | } |
| | | } |
| | | |
| | | async function loadModelOptionsForLanguage(selection: string): Promise<ModelOption[]> { |
| | | try { |
| | | const options: any = await Call.ByName('voicesnap/services.EngineService.ListModelOptionsForLanguage', selection) |
| | | modelOptions = Array.isArray(options) ? options : [] |
| | | return modelOptions |
| | | } catch { |
| | | modelOptions = [] |
| | | return [] |
| | | } |
| | | } |
| | | |
| | |
| | | case 'zipformer-ja-reazonspeech': return t('models.japaneseDesc') |
| | | case 'zipformer-ko': return t('models.koreanDesc') |
| | | case 'qwen3-asr-0.6b': return t('models.qwen3Desc') |
| | | case 'sensevoice-yue-2025-09-09': return t('models.sensevoiceYueDesc') |
| | | default: return option.description || '' |
| | | } |
| | | } |
| | |
| | | try { |
| | | if (option.installed) { |
| | | engineStatus.set('loading') |
| | | if (pendingLanguageID) { |
| | | await Call.ByName('voicesnap/services.EngineService.SelectModelForLanguage', pendingLanguageID, option.modelID) |
| | | pendingLanguageID = '' |
| | | const settings: any = await Call.ByName('voicesnap/services.ConfigService.GetLanguageSettings') |
| | | applyLanguageSettings(settings) |
| | | } else { |
| | | await Call.ByName('voicesnap/services.EngineService.SelectModel', option.modelID) |
| | | } |
| | | } else { |
| | | if (pendingLanguageID) { |
| | | await Call.ByName('voicesnap/services.EngineService.DownloadModelByIDForLanguage', pendingLanguageID, option.modelID) |
| | | pendingLanguageID = '' |
| | | const settings: any = await Call.ByName('voicesnap/services.ConfigService.GetLanguageSettings') |
| | | applyLanguageSettings(settings) |
| | | } else { |
| | | await Call.ByName('voicesnap/services.EngineService.DownloadModelByID', option.modelID) |
| | | } |
| | | engineStatus.set('loading') |
| | | } |
| | | await loadModelOptions() |
| | |
| | | async function onLanguageChange(selection: string) { |
| | | const prevMode = languageModeVal |
| | | const prevID = languageIDVal |
| | | const prevEffectiveID = effectiveLanguageIDVal |
| | | const prevPendingID = pendingLanguageID |
| | | if (selection === 'auto') { |
| | | pendingLanguageID = '' |
| | | languageModeVal = 'auto' |
| | | languageMode.set('auto') |
| | | } else { |
| | | languageModeVal = 'manual' |
| | | languageIDVal = selection |
| | | languageMode.set('manual') |
| | | languageID.set(selection) |
| | | } |
| | | try { |
| | | if (selection !== 'auto') { |
| | | const options = await loadModelOptionsForLanguage(selection) |
| | | const defaultInstalled = options.some(option => option.isDefault && option.installed) |
| | | if (!defaultInstalled) { |
| | | pendingLanguageID = selection |
| | | effectiveLanguageIDVal = selection |
| | | await syncModelDownloadStatus() |
| | | return |
| | | } |
| | | } |
| | | pendingLanguageID = '' |
| | | const settings: any = selection === 'auto' |
| | | ? await Call.ByName('voicesnap/services.ConfigService.SetLanguageAuto') |
| | | : await Call.ByName('voicesnap/services.ConfigService.SetLanguageManual', selection) |
| | |
| | | } catch { |
| | | languageModeVal = prevMode |
| | | languageIDVal = prevID |
| | | effectiveLanguageIDVal = prevEffectiveID |
| | | pendingLanguageID = prevPendingID |
| | | languageMode.set(prevMode) |
| | | languageID.set(prevID) |
| | | } |