c07cf4db9f
Rolls back the v0.2.0 Qwen3 CoreML on-device ASR stack and replaces the
'local engine' UX with iOS 26 SpeechAnalyzer + DictationTranscriber only.
The 'Cloud polish after ASR' toggle (ProviderConfig.localModeCloudPolishEnabled)
lets users opt into a post-ASR DeepSeek round-trip from the local engine.
Defaults to off so the local engine stays genuinely local. New PolishError.missingAPIError
surfaces an inline 'fill in your key' warning when the toggle is on but the
Keychain is empty. DeepSeek preset default model bumped to deepseek-v4-flash.
Deleted:
- OSGKeyboard/ThirdParty/Qwen3Speech/ (74 files, ~16k LoC)
- OSGKeyboard/Services/ModelManager.swift (492)
- OSGKeyboard/Services/OnDeviceModelWarmup.swift (197)
- OSGKeyboard/Services/Qwen3ASRService.swift (257)
- OSGKeyboard/Services/ModelDownloadSourcePicker.swift (126)
- OSGKeyboard/Views/OnDeviceModelsView.swift (184)
- OSGKeyboard/Views/DownloadConfirmSheet.swift (96)
- OSGKeyboardShared/Models/OnDeviceModel.swift (140)
- OSGKeyboardShared/Services/OnDeviceModelStatus.swift (104)
- Qwen3ASRServiceProvider registration in OSGKeyboardApp
- Qwen3Speech package declaration in project.yml
- 5 .qwen3ASR enum / branch reference sites in HomeView, OnboardingView,
LocalEngineSettingsRows, FlowSessionManager, ASRService, EngineServiceLabel
- Two pre-existing Swift 6 strict-concurrency errors in
LiveDictationController + FlowSessionManager (the weak [weak self] in
detached-task MainActor.run blocks) that were blocking clean builds
Added:
- LocalModelsGroup: 'Built-in iOS SpeechAnalyzer' badge + 'Cloud polish
after ASR' Switch toggle
- PolishingService: honour localModeCloudPolishEnabled; new .missingAPIKey
error case with localised warning
- AppGroupStore.localModeCloudPolishEnabled (mirrored into App Group
so the keyboard extension honours the toggle during live dictation)
- SettingsView: show provider/api sections when local-mode cloud polish
is on so the user can paste a DeepSeek key
- FlowSessionManager: route through PolishingService for local + polish-on
flow; translate missingAPIKey into a polished warning
- KeyboardViewController: handle PolishingService.PolishError.missingAPIKey
in the keyboard-side live polish path
- CHANGELOG v0.2.1: documents the rollback + new toggle
- README.md / README.zh.md: engine matrix section, data flow note
Verified: xcodebuild -scheme OSGKeyboard -destination 'generic/platform=iOS Simulator'
build succeeds under SWIFT_STRICT_CONCURRENCY=complete.
33 lines
1.5 KiB
Plaintext
33 lines
1.5 KiB
Plaintext
/* Engine status labels */
|
|
"engine.summary.local" = "本地 · %@";
|
|
"engine.summary.cloud" = "当前:%@";
|
|
"engine.summary.cloudWithModel" = "当前:%1$@ · %2$@";
|
|
"engine.asr.appleSpeech" = "Apple 语音识别";
|
|
|
|
/* v0.2.0: flow-level warnings surfaced alongside the final transcript. */
|
|
"flow.warning.cloudPolishMissingKey" = "已开启云端润色但未填写 API Key,本次以原始识别结果插入。请在设置中填入 DeepSeek API Key 以启用润色。";
|
|
|
|
/* LLM providers */
|
|
"provider.openai" = "OpenAI";
|
|
"provider.deepseek" = "DeepSeek";
|
|
"provider.qwen" = "通义千问";
|
|
"provider.zhipu" = "智谱 GLM";
|
|
"provider.moonshot" = "月之暗面";
|
|
"provider.custom" = "自定义";
|
|
|
|
/* LLM errors */
|
|
"error.llm.invalidURL" = "API 地址无效。请在设置中检查 Base URL。";
|
|
"error.llm.noAPIKey" = "未填写 API Key。";
|
|
"error.llm.http" = "API 返回 HTTP %lld。请稍后重试或联系服务方。";
|
|
"error.llm.decoding" = "解析 API 响应失败。";
|
|
"error.llm.transport" = "网络错误,请检查连接后重试。";
|
|
"error.llm.rateLimited" = "API 调用过于频繁,请稍候再试。";
|
|
"error.llm.cancelled" = "请求已取消。";
|
|
|
|
/* ASR errors */
|
|
"error.asr.localeUnsupported" = "当前系统未分配可用语音语言模型,请稍后重试或切换语言。";
|
|
"error.asr.assetsNotReady" = "语音语言资源未就绪,请稍后重试。";
|
|
"error.asr.formatUnsupported" = "当前设备不支持该语音输入格式。";
|
|
"error.asr.noSpeech" = "未识别到语音内容,请重试。";
|
|
"error.asr.chunkFailed" = "第 %lld 段识别失败:%@";
|