- CGEvent cghidEventTap 全局监听 Fn 键 - Apple Speech 流式语音识别(zh-CN 默认) - 实时音频 RMS 电平驱动波形动画 - NSPanel 胶囊浮动窗口 - 剪贴板 + Cmd+V 文本注入,CJK 输入法自动切换 - OpenAI 兼容 LLM 纠错(DeepSeek 预设) - LSUIElement 菜单栏运行 - SPM + Makefile 构建
71 lines
2.1 KiB
Swift
71 lines
2.1 KiB
Swift
import Foundation
|
|
|
|
enum RecognitionLanguage: String, CaseIterable {
|
|
case chineseSimplified = "zh-CN"
|
|
case english = "en-US"
|
|
case chineseTraditional = "zh-TW"
|
|
case japanese = "ja-JP"
|
|
case korean = "ko-KR"
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .chineseSimplified: return "简体中文"
|
|
case .english: return "English"
|
|
case .chineseTraditional: return "繁體中文"
|
|
case .japanese: return "日本語"
|
|
case .korean: return "한국어"
|
|
}
|
|
}
|
|
}
|
|
|
|
struct Config {
|
|
static var shared = Config()
|
|
|
|
private let defaults = UserDefaults.standard
|
|
|
|
private enum Keys {
|
|
static let language = "recognition_language"
|
|
static let llmEnabled = "llm_enabled"
|
|
static let llmBaseURL = "llm_base_url"
|
|
static let llmAPIKey = "llm_api_key"
|
|
static let llmModel = "llm_model"
|
|
}
|
|
|
|
var language: RecognitionLanguage {
|
|
get {
|
|
guard let raw = defaults.string(forKey: Keys.language),
|
|
let lang = RecognitionLanguage(rawValue: raw) else {
|
|
return .chineseSimplified
|
|
}
|
|
return lang
|
|
}
|
|
set {
|
|
defaults.set(newValue.rawValue, forKey: Keys.language)
|
|
}
|
|
}
|
|
|
|
var llmEnabled: Bool {
|
|
get { defaults.bool(forKey: Keys.llmEnabled) }
|
|
set { defaults.set(newValue, forKey: Keys.llmEnabled) }
|
|
}
|
|
|
|
var llmBaseURL: String {
|
|
get { defaults.string(forKey: Keys.llmBaseURL) ?? "https://api.deepseek.com" }
|
|
set { defaults.set(newValue, forKey: Keys.llmBaseURL) }
|
|
}
|
|
|
|
var llmAPIKey: String {
|
|
get { defaults.string(forKey: Keys.llmAPIKey) ?? "sk-3457fbc33f0b4aefb2ce1d3101bb2341" }
|
|
set { defaults.set(newValue, forKey: Keys.llmAPIKey) }
|
|
}
|
|
|
|
var llmModel: String {
|
|
get { defaults.string(forKey: Keys.llmModel) ?? "deepseek-v4-flash" }
|
|
set { defaults.set(newValue, forKey: Keys.llmModel) }
|
|
}
|
|
|
|
var isLLMConfigured: Bool {
|
|
!llmBaseURL.isEmpty && !llmAPIKey.isEmpty && !llmModel.isEmpty
|
|
}
|
|
}
|