# type4me_win **Repository Path**: clearmind999/type4me_win ## Basic Information - **Project Name**: type4me_win - **Description**: window语音识别输入法 - **Primary Language**: Rust - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-27 - **Last Updated**: 2026-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # type4me_win Type4Me 的 Windows Rust 重写项目。第一阶段目标是实现 Type4Me 云端 BYOK 版本的 Windows 功能等价:全局热键录音、远端 ASR、远端 LLM 后处理、当前光标文本注入、历史记录和配置管理。 ## 当前阶段 M101 Volcano Cloud Hotwords: - Rust workspace - `type4me-core` 核心领域模型 - ASR/LLM/注入/历史 trait - 假 provider 测试链路 - `type4me-app` smoke binary - CPAL 录音 shell - Windows 剪贴板注入 shell - 热键状态机和 Windows 低级键盘 hook 全局热键入口 - 运行时协调器 - OpenAI-compatible 远端 ASR/LLM provider - Claude (Anthropic) 原生 Messages API 远端 LLM provider - Soniox 异步文件级远端 ASR provider - Deepgram 预录音远端 ASR provider - AssemblyAI 预录音远端 ASR provider - ElevenLabs 预录音远端 ASR provider - 阿里云百炼 WebSocket 远端 ASR provider - 百度智能云 WebSocket 远端 ASR provider - 百度智能云 ASR 支持原版 CUID、LM ID 和标点开关配置;关闭标点时会按原版规则把 `15372` 映射为 `1537`、`17372` 映射为 `1737` - 火山引擎 WebSocket 远端 ASR provider - 火山引擎 ASR 支持手动配置 UID、Boosting Table ID 和 Context History;配置 Boosting Table ID 时会按原版协议使用云端热词表并跳过 inline hotwords - 火山引擎 ASR 支持原版云端热词表同步:在设置页保存 IAM Access Key ID / Secret Access Key 后,可点击 `Sync Cloud Hotwords` 创建、采纳或更新 `type4me-hotwords` Boosting Table,并自动把 table id 写入配置;托盘启动和热词编辑后也会在配置完整时后台同步 - 火山引擎 ASR 在 Resource ID 为 `auto` 时,设置页 `Test ASR` 会先测试 `volc.seedasr.sauc.duration`,失败后自动退到 `volc.bigasr.sauc.duration`,并把探测结果写入配置供托盘运行时复用 - Baidu CUID 或 Volcano UID 为空时,会生成并复用原版风格的 per-install ASR 身份 `type4me-`,保存在 `%APPDATA%\Type4Me\asr-identity.json` - Baidu/Bailian/Volcano WebSocket ASR 进度可上浮到状态浮窗 Processing 预览 - JSON 配置存储 - Windows DPAPI 加密密钥存储 - 热词与片段词库持久化 - `egui/eframe` 设置窗口入口 - 首次打开设置窗口时,如果还没有完成 BYOK 基本配置,会先进入 `Setup` 标签页,引导保存和测试 ASR/LLM 配置 - `Providers` 和 `Setup` 页面提供 LLM/ASR provider 预设;LLM 侧已补齐原版常见厂商目录,包括 TAL Internal、Doubao、MiniMax、百炼、Kimi、OpenRouter、OpenAI、Gemini、DeepSeek、智谱、Claude 和 Ollama;ASR 侧已补齐 OpenAI、Soniox、Deepgram、AssemblyAI、ElevenLabs、Bailian、Baidu 和 Volcano provider - `config.json` 会持久化 ASR/LLM provider 身份,旧配置会按 endpoint/model 推断;运行时历史和后续 provider 扩展使用稳定 provider id;OpenAI ASR 记录为 `openai`,Soniox ASR 记录为 `soniox`,Deepgram ASR 记录为 `deepgram`,AssemblyAI ASR 记录为 `assemblyai`,ElevenLabs ASR 记录为 `elevenlabs`,Bailian ASR 记录为 `bailian`,Baidu ASR 记录为 `baidu`,Volcano ASR 记录为 `volcano`,Claude LLM 记录为 `claude`,Ollama LLM 可不配置 API Key - 设置窗口默认打开 `General` 标签页,用于通用偏好、界面语言、麦克风选择、开机启动、提示音开关与样式、剪贴板保护、去句末标点、系统代理绕过和本地配置路径状态 - `Primary Language` 目前会驱动 `History` 页的日期筛选、日期分组标题、日历标题和统计摘要文案 - Windows 系统托盘入口,可打开设置窗口并退出 - 默认 `Ctrl+Alt+Space` Toggle 热键录音闭环 - 托盘状态行显示 `Idle`、`Recording`、`Processing` 或 `Error` - 托盘可直接 `Start Recording` / `Stop Recording` - 托盘 `Modes` 子菜单可选择当前处理模式,并持久化到 `%APPDATA%\Type4Me\config.json` - 内置模式现已包含快速模式、智能模式、语音润色、英文翻译、代办模式、命令模式和 Prompt 优化 - 托盘提供 `Open History`,可直接打开设置窗口的 `History` 标签页 - 托盘提供 `Open Modes`,可直接打开设置窗口的 `Modes` 标签页 - 成功完成的识别会追加写入 `%APPDATA%\Type4Me\history.jsonl` - CLI 可列出、搜索、删除、清空并导出历史记录 CSV - CLI 可管理热词和片段词库 - CLI 可管理应用专属片段词库 - 设置窗口提供 `History` 标签页,可查看、搜索、按日期过滤、分页加载更多、复制、删除、批量选择删除、清空、导出历史记录,并可从历史记录点选识别错误字符快速新增纠错片段 - `History` 标签页的 `Correct` 编辑器可基于已选错词和正确词调用远端 LLM 生成 snippet / hotword 建议,预览后勾选保存到词库 - 设置窗口提供 `Vocabulary` 标签页,可新增、删除、清空、刷新、搜索、排序、编辑和批量维护热词与片段词库 - 设置窗口 `Vocabulary` 标签页可管理应用专属片段,包括应用 id/显示名、选择应用、增删改查清空和批量维护 - 设置窗口 `Vocabulary` 标签页可延迟捕获当前前台应用 exe 名称,辅助创建或选择应用专属片段范围 - 设置窗口 `Vocabulary` 标签页可从文本文件导入/导出全局热词、全局片段和当前选中应用的专属片段 - 设置窗口 `Vocabulary` 标签页会显示内置热词/片段数量,并可一键重置内置词库 - 设置窗口提供 `About` 标签页,可查看版本、构建 commit、分支、构建时间、平台、许可证和更新状态,并提供 GitHub / Feedback 支持链接 - `About` 标签页可点击 `Check for Updates`,后台读取原版 Type4Me 的 `updates.json` 并显示是否有新版本;当前阶段只做检查和提示,不自动下载、安装或重启 - 可在设置窗口关闭未来历史记录保存,或设置最大保留条数 - 托盘运行时会启动 `--status-ui` 浮窗,显示 Idle、Recording、Processing 和 Error 状态 - 停止录音后,ASR 先完成而 LLM 仍在后处理时,托盘会立即把原始识别文本发布给状态浮窗;浮窗 Processing 阶段会先显示这段原文,减少等待时的黑盒感 - 录音中按 `ESC` 会取消本次录音,丢弃音频且不写入历史 - 可在 `General` 标签页选择录音麦克风;空值表示使用 Windows 系统默认输入设备 - 可在 `General` 标签页开启 `Mic Keep-Alive`,让托盘在空闲时保持麦克风热身流,开始录音前自动挂起、结束或中断后自动恢复,尽量降低蓝牙麦或冷启动设备的首段迟滞/断连概率 - 最终文本会在注入和写入历史前清理 CJK 字符相邻的多余空格,减少 ASR/LLM 在中文、英文、标点边界产生的空格噪声 - 可在 `General` 标签页设置去句末标点:关闭、仅句号、全部标点;该处理会在最终文本注入和写入历史前执行 - 可在 `General` 标签页设置远端 ASR/LLM 是否绕过系统代理:关闭、全部连接、仅 ASR、仅 LLM;对应 provider 会使用直连 HTTP 客户端 - 设置窗口提供 `Modes` 标签页,可为每个模式选择 Toggle 或 Hold 热键行为 - 模式 Prompt 支持原版 Type4Me 风格模板变量:`{text}` 识别文本、`{selected}` 录音开始时的聚焦选中文本、`{clipboard}` 录音开始时的剪贴板文本;当前 Windows 版已打通 `{clipboard}` 运行时注入,并会通过 Windows UI Automation 尽力采集 `{selected}`,采集失败时会自动回退为空文本 - 当前模式为 Hold 时,按住当前全局热键录音,松开主键后停止并处理 - 设置窗口可新增自定义模式、复制默认预设、编辑自定义模式名称/Prompt/处理状态文案,并删除自定义模式 - 设置窗口 `Modes` 标签页可设置原版 `Short Text Skip`:内置 `语音润色` 对短于阈值的文本跳过 LLM 润色,直接使用 ASR 与本地片段修正后的文本 - LLM 后处理调用失败或返回空白文本时,运行时会回退到 ASR 与本地片段修正后的文本继续注入并写入历史,避免丢弃本次录音 - 默认预设模式受保护,不可直接删除;旧配置中默认预设的 `is_builtin=false` 会在设置窗口加载时规范化为受保护预设 - 托盘进程会监听 `%APPDATA%\Type4Me\modes.json`,设置窗口保存模式后无需重启 `--tray` 即可刷新 `Modes` 子菜单和当前模式状态 - 设置窗口提供 `Hotkey` 标签页,可把全局录音热键从默认 `Ctrl+Alt+Space` 改为一个键盘组合 - 托盘进程会监听 `%APPDATA%\Type4Me\config.json`,设置窗口保存热键后无需重启 `--tray` 即可刷新全局热键;如果保存发生在 Recording 或 Processing 期间,会等回到 Idle/Error 后再生效 - 设置窗口 `Modes` 标签页可为单个模式配置独立键盘热键;未配置的模式继续使用全局热键 - 模式独立热键会在 Idle/Error 时先选择对应模式再开始录音;Recording/Processing 中不会切换模式或停止不匹配的录音 - `--status-ui` 浮窗会记住上次位置和尺寸,重启后自动恢复;异常或屏幕外坐标会回退默认位置 - 设置窗口可把全局热键和模式独立热键配置为 `Mouse4` 或 `Mouse5`;匹配到的鼠标侧键事件会被 Type4Me 消费,避免同时触发浏览器后退/前进 - `%APPDATA%\Type4Me\history.jsonl` 新写入的历史记录会用 Windows DPAPI CurrentUser 加密;旧明文历史仍可读取,并会在删除或保留条数修剪时自然迁移为加密行 - 设置窗口可启用或关闭当前用户登录后自动启动 Type4Me tray;CLI 提供 `--startup-status`、`--startup-enable` 和 `--startup-disable` - 设置窗口可开关录音开始、停止处理和错误状态的提示音,并可选择开始提示音样式;开始和停止提示音会使用原版 Type4Me wav 资源,CLI 提供 `--sound-status` 和 `--sound-test` - 设置窗口可为提示音选择输出扬声器;空值表示使用 Windows 系统默认输出设备,选定具体设备后会把内置 wav 提示音直接播放到该设备 - 设置窗口可设置录音期间的系统音量衰减档位:`Off`、`50%`、`40%`、`30%`、`20%`、`10%` 和 `Mute`;运行时会在开始提示音后降低默认输出设备音量,在停止/取消/错误后自动恢复 - 设置窗口可选择录音音量视觉样式,对齐原版 Type4Me 的 `tf_visualStyle`:`Lines`、`Blocks`、`Minimal` - 设置窗口可开关状态浮窗 hover 文本预览,对齐原版 Type4Me 的 `tf_hoverTranscriptPreview`;当前远端 ASR 架构下先显示本次完成后的最终文本,后续接入流式 ASR 后可自然扩展到录音中分段预览 - 停止录音进入 Processing 后,状态浮窗会先显示 ASR 原始识别文本;如果当前模式还需要 LLM 润色、翻译或命令处理,用户可以先看到识别结果,再等待最终注入文本 - 如果当前焦点目标不像可编辑文本框,运行时会放弃直接粘贴,退回为“只写入剪贴板”;History、CLI 和状态浮窗都会区分 `Inserted` 与 `Copied to clipboard` - `--status-ui` 浮窗的紧凑/展开切换改为平滑 hover 缓动,`Timeline/Minimal` 视觉增加粒子尾迹,状态动效更接近原版 Type4Me - `--status-ui` 浮窗现在按录音状态节奏自动显隐:Idle 默认隐藏,Recording/Processing 时显示,处理成功后短暂显示完成反馈再自动消失,错误状态会保留更久后再隐藏,更接近原版浮窗的出现节奏 - `--status-ui` 浮窗继续补齐原版细节:hover 展开增加进入延迟,录音时显示 `mm:ss` 计时,状态颜色带轻微呼吸 glow,Processing/Done 带背景进度感,不同阶段有独立前导指示器,紧凑宽度会随当前内容自适应 - CLI 提供 `--doctor`,可只读检查配置、密钥、模式、历史文件、启动项和当前 exe 路径 - 程序会写入 `%APPDATA%\Type4Me\debug.log`,记录启动 session、运行时错误、托盘刷新错误和状态窗口保存错误,便于排查问题 - 设置窗口提供 `Diagnostics` 标签页,可刷新 `--doctor` 诊断、查看最近 `debug.log`,并导出本地诊断文本包 - CLI 提供 `--hotwords-list`、`--hotwords-add`、`--hotwords-delete`、`--hotwords-clear` 以及 `--snippets-list`、`--snippets-add`、`--snippets-delete`、`--snippets-clear` - 热词和片段分别保存到 `%APPDATA%\Type4Me\hotwords.json` 和 `%APPDATA%\Type4Me\snippets.json` - 内置热词和内置片段分别保存到 `%APPDATA%\Type4Me\builtin-hotwords.json` 和 `%APPDATA%\Type4Me\builtin-snippets.json` - CLI 提供 `--app-snippets-registry`、`--app-snippets-list`、`--app-snippets-add`、`--app-snippets-delete`、`--app-snippets-clear` 和 `--app-snippets-remove-app` - 应用专属片段保存到 `%APPDATA%\Type4Me\app-snippets`,运行时会按当前前台进程 exe 名称加载,例如 `chrome.exe` - 应用专属片段会覆盖同触发词的全局片段;设置窗口和 CLI 都可以管理同一份应用专属片段 - 运行时会合并内置词库和用户词库:用户热词会追加到内置热词之后并去重,用户片段会覆盖同触发词的内置片段 - `Use Current App` 会给用户 3 秒切换到目标窗口,然后捕获前台进程 exe 名称;已注册应用会被选中,新应用会填入 app id/显示名等待保存;如果仍捕获到 Type4Me 自己,会提示重新切换目标窗口 - 词库文件导入会替换当前列表;热词文件为每行一个词,片段文件支持 `trigger => replacement`、制表符分隔,以及 Type4Me 原分组格式 `replacement, trigger1, trigger2` - `scripts/package-release.ps1` 可构建 release exe 并输出到 `dist/type4me-win` - `scripts/package-release.ps1` 会运行打包后 exe 的 `--doctor` 和 `--sound-status`,并把结果写入 `SMOKE.txt` - `scripts/package-release.ps1` 会生成 `MODELS.txt`,记录 SenseVoice、Silero VAD、Qwen3-ASR 是否完整随包 - `scripts/package-release.ps1 -RequireBundledModels` 会强制校验本地模型完整后才产出本地模型版便携包 - `scripts/package-release.ps1` 会生成 `dist/type4me-win.zip`,并校验 zip 内包含 exe、README、VERSION、SMOKE 和 MODELS - `scripts/package-release.ps1` 会为 `dist/type4me-win.zip` 生成 `dist/type4me-win.zip.sha256` - release 包包含无黑框入口 `Start Type4Me Tray.vbs` 和 `Open Type4Me Settings.vbs`,也保留 `.cmd` 兼容启动脚本 - release 包包含 `QUICKSTART.md`,解压后可先看快速开始说明 - `scripts/package-installer.ps1 -Version 1.0.0` 可在 Inno Setup 6 可用时生成 Windows 安装包,详细流程见 `docs/WINDOWS_RELEASE.md` ## Debug Log Type4Me 会在 `%APPDATA%\Type4Me\debug.log` 写入本地调试日志。日志包含进程启动 session、命令参数摘要、运行时错误、托盘刷新错误、状态文件写入错误和提示音播放错误。日志文件超过约 256 KiB 后会在下次启动 session 时轮转重建。 日志用于本机排查,不会主动上传。代码会避免写入 API Key、完整 ASR 文本、完整 LLM 输出和请求体;如果远端 provider 返回错误,日志可能包含该 provider 的错误摘要。 ## Vocabulary 设置窗口的 `Vocabulary` 标签页可直接管理热词和片段词库。热词会传给 ASR provider;片段会在识别文本进入 LLM 后处理或注入前做本地替换。 命令行也可以管理同一份词库: ```powershell type4me-app.exe --hotwords-list type4me-app.exe --hotwords-add "Claude Code" type4me-app.exe --hotwords-delete "Claude Code" type4me-app.exe --hotwords-clear type4me-app.exe --snippets-list type4me-app.exe --snippets-add "Queen 三" "Qwen3" type4me-app.exe --snippets-delete "Queen 三" type4me-app.exe --snippets-clear type4me-app.exe --app-snippets-registry type4me-app.exe --app-snippets-add chrome.exe "Google Chrome" "Queen 三" "Qwen 3 Chrome" type4me-app.exe --app-snippets-list chrome.exe type4me-app.exe --app-snippets-delete chrome.exe "Queen 三" type4me-app.exe --app-snippets-clear chrome.exe type4me-app.exe --app-snippets-remove-app chrome.exe ``` 片段列表输出为单行制表符格式,方便脚本处理。GUI 支持搜索、保存顺序/A-Z 排序、单条编辑、批量文本维护,以及文本文件导入/导出。批量热词格式是每行一个热词;批量片段格式是每行 `trigger => replacement`,也兼容制表符分隔和 Type4Me 原分组格式 `replacement, trigger1, trigger2`。内置词库存放在 `%APPDATA%\Type4Me\builtin-hotwords.json` 和 `%APPDATA%\Type4Me\builtin-snippets.json`,首次使用会自动写入默认 AI/开发相关热词和常见误识别纠正规则;设置窗口可查看内置数量并重置为默认值。运行时先加载内置词库,再叠加用户词库;同触发词片段由用户片段覆盖内置片段,应用专属片段再覆盖前两者。触发词覆盖比较和实际替换一样,会忽略空格并大小写不敏感。`Use Current App` 会延迟 3 秒捕获目标前台应用,方便从真实窗口填入 app id;如果捕获到 Type4Me 自己,会要求重新切换目标窗口。 ## 验证 ```powershell cargo test --workspace cargo run -p type4me-app -- --fake-core-smoke ``` 编译、测试和打包说明见 [BUILD.md](BUILD.md)。 ## M1 Core Loop Smoke ```powershell cargo run -p type4me-app -- --fake-core-smoke cargo run -p type4me-app -- --smoke-inject ``` 无参数启动现在会打开设置窗口,贴近发布版用户双击 `type4me-app.exe` 的行为;旧的模拟 core loop smoke 保留在 `--fake-core-smoke`。 `--smoke-inject` 会把一段测试文本写入剪贴板,用于验证 Windows 注入前置能力。 ## M2 Remote Provider Smoke ```powershell $env:TYPE4ME_LLM_BASE_URL="http://ai-service.tal.com/openai-compatible/v1" $env:TYPE4ME_LLM_API_KEY="..." $env:TYPE4ME_LLM_MODEL="claude-sonnet-4.6" cargo run -p type4me-app -- --smoke-remote-llm $env:TYPE4ME_ASR_BASE_URL="http://speech-internal.tal.com/v1/asr" $env:TYPE4ME_ASR_API_KEY="..." $env:TYPE4ME_ASR_MODEL="tal-internal-asr" $env:TYPE4ME_ASR_LANGUAGE="zh" cargo run -p type4me-app -- --smoke-remote-asr path\to\audio.wav ``` M2 不持久化 API Key;这些 smoke 命令只从当前 shell 的环境变量读取密钥。 ## M3 Settings And Credentials ```powershell cargo run -p type4me-app -- --config-init cargo run -p type4me-app -- --config-set-llm http://ai-service.tal.com/openai-compatible/v1 claude-sonnet-4.6 1 cargo run -p type4me-app -- --config-set-asr http://speech-internal.tal.com/v1/asr tal-internal-asr zh $env:TYPE4ME_SECRET_VALUE="..." cargo run -p type4me-app -- --config-set-secret llm cargo run -p type4me-app -- --smoke-configured-llm cargo run -p type4me-app -- --smoke-configured-asr ``` 配置保存在 `%APPDATA%\Type4Me\config.json`,API Key 使用 Windows DPAPI CurrentUser 加密后保存在 `%APPDATA%\Type4Me\credentials.json`。`--config-set-secret` 从 `TYPE4ME_SECRET_VALUE` 读取密钥,避免把 API Key 作为命令参数写进 shell 历史。默认配置会使用 TAL 内部 ASR/LLM 地址;如果本机已经存在 `config.json`,程序会优先读取已有配置,不会自动覆盖。 ## M4 Settings UI ```powershell cargo run -p type4me-app -- --settings-ui ``` 设置窗口可编辑 LLM/ASR 的 Base URL、模型名、LLM temperature、ASR language 和 API Key。已有 API Key 不会显示;状态只显示 `Stored` 或 `Missing`。API Key 输入框留空并保存时,会保留现有密钥;输入非空值时,会用 Windows DPAPI 加密后替换保存。Providers 页面提供 `Test LLM` 和 `Test ASR` 按钮;`Test ASR` 使用项目内置的 `test-assets/audio/zhutao16_5s.wav` 验证已保存的 ASR 配置和密钥。 ## M5 Tray Shell ```powershell cargo run -p type4me-app -- --tray ``` `--tray` 会启动 Type4Me 的 Windows 系统托盘常驻入口。托盘菜单目前提供 `Open Settings` 和 `Quit`:前者复用 M4 的 `--settings-ui` 设置窗口,且同一时间只跟踪并打开一个设置窗口;后者退出托盘并清理已启动的设置窗口子进程。 ## M6 Hotkey Runtime ```powershell cargo run -p type4me-app -- --tray ``` M6 在托盘常驻进程中注册默认全局热键 `Ctrl+Alt+Space`。第一次按下开始录音,第二次按下停止录音并执行配置中的远端 ASR/LLM 流程,最终通过 Windows 剪贴板粘贴注入到当前光标位置。 使用前需要在设置窗口中保存 ASR Base URL、模型和 API Key。若当前模式包含 Prompt,还需要保存 LLM Base URL、模型和 API Key。M6 只实现单热键 Toggle 闭环;多模式托盘选择、Hold 模式、ESC 取消录音和状态浮窗留给后续里程碑。 ## M7 Tray Control ```powershell cargo run -p type4me-app -- --tray ``` M7 扩展托盘菜单为 Type4Me 的主要控制面板:菜单会显示当前状态和当前模式,可从托盘开始/停止录音,也可在 `Modes` 子菜单中选择快速模式、智能模式、语音润色、英文翻译、代办模式、命令模式或 Prompt 优化。所选模式会保存到 `%APPDATA%\Type4Me\config.json` 的 `active_mode_id` 字段。 `Ctrl+Alt+Space` 继续作为默认 Toggle 热键,但热键事件进入运行时后由运行时真实状态决定开始或停止,因此托盘按钮和热键可以混用。 ## M8 Persistent History ```powershell cargo run -p type4me-app -- --tray ``` M8 将托盘运行时历史从内存仓库切换为 JSONL 文件仓库。每次成功完成 ASR/LLM、文本注入和 session 写入后,会在 `%APPDATA%\Type4Me\history.jsonl` 追加一行 `HistoryRecord` JSON。历史文件当前不加密、不提供 UI,也不做删除或搜索;这些属于后续历史 UI 和隐私设置里程碑。 ## M9 History Management ```powershell cargo run -p type4me-app -- --history-list 20 cargo run -p type4me-app -- --history-search "关键词" 20 cargo run -p type4me-app -- --history-delete cargo run -p type4me-app -- --history-clear cargo run -p type4me-app -- --history-export-csv "$env:TEMP\type4me-history.csv" ``` M9 在 `history.jsonl` 上增加历史记录管理能力:列表、搜索、按 id 删除、清空和 CSV 导出。删除和清空不可撤销;历史内容仍以明文保存在 `%APPDATA%\Type4Me\history.jsonl`,导出的 CSV 也可能包含敏感口述内容。 ## M10 History UI ```powershell cargo run -p type4me-app -- --settings-ui ``` M10 在设置窗口增加 `History` 标签页。该页面读取 `%APPDATA%\Type4Me\history.jsonl`,默认显示最近 100 条记录,支持搜索、复制最终文本、按条删除、清空全部记录和导出 CSV。删除和清空需要确认但不可撤销;历史文件和 CSV 仍为明文。 ## M11 History Privacy And Retention ```powershell cargo run -p type4me-app -- --settings-ui ``` M11 在 `History` 标签页增加历史隐私设置。`Save completed recognition history` 关闭后,新的识别结果仍会注入到当前光标位置,但不会追加写入 `history.jsonl`;已存在的历史不会自动删除。`Max records` 为空表示不限数量,填写正整数后,每次成功写入历史都会保留最新 N 条记录。 ## M12 Floating Status UI ```powershell cargo run -p type4me-app -- --tray cargo run -p type4me-app -- --status-ui ``` M12 增加一个轻量状态浮窗。托盘进程会把最新 `RuntimeStatusSnapshot` 写入 `%APPDATA%\Type4Me\runtime_status.json`,并启动 `--status-ui` 辅助进程读取该文件。浮窗显示当前 Idle、Recording、Processing 或 Error 状态和当前模式;M12 暂不保存窗口位置,也不做自动隐藏或动画。 ## M13 ESC Abort Recording ```powershell cargo run -p type4me-app -- --tray ``` M13 增加全局 `ESC` 取消录音能力。托盘运行时继续使用 `Ctrl+Alt+Space` Toggle 开始或停止并处理录音;录音中按 `ESC` 会停止 recorder、丢弃音频并回到 Idle,不执行 ASR/LLM、不注入文本、不追加历史记录。M13 不取消已经进入 Processing 的远端请求。 ## M14 Hold Mode ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --tray ``` M14 让模式里的 `hotkey_style` 真正生效。设置窗口新增 `Modes` 标签页,可把每个处理模式设置为 `Toggle` 或 `Hold`。托盘运行时会按当前模式的样式处理 `Ctrl+Alt+Space`:Toggle 模式按一次开始、再按一次停止;Hold 模式按住开始录音、松开 Space 后停止并处理。`ESC` 取消录音继续可用。 ## M15 Mode Management UI ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --tray ``` M15 将设置窗口的 `Modes` 标签页扩展为模式管理页:左侧选择模式,右侧编辑选中模式。默认预设可复制为自定义模式,也可调整 Toggle/Hold;自定义模式可编辑名称、Prompt、处理状态文案和 Toggle/Hold,并可删除。保存后完整写入 `%APPDATA%\Type4Me\modes.json`。托盘菜单仍在托盘进程启动时读取模式列表,因此新增、删除或重命名模式后需要重启 `--tray` 才会刷新托盘菜单。 ## M16 Live Tray Mode Refresh ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --tray ``` M16 让托盘进程在运行时监听 `modes.json` 的变化。设置窗口保存新增、删除、重命名或编辑后的模式后,托盘 `Modes` 子菜单会自动重建;runtime 会在 Idle 或 Error 状态下重新加载当前 active mode,同步最新名称、Prompt、处理状态文案和 Toggle/Hold。若当前模式被删除,runtime 会回退到第一个可用模式并持久化新的 `active_mode_id`。如果保存发生在 Recording 或 Processing 期间,托盘菜单会先刷新,runtime active mode 会等回到 Idle/Error 后再同步。 ## M17 Configurable Global Hotkey ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --tray ``` M17 在设置窗口增加 `Hotkey` 标签页。全局录音热键默认是 `Ctrl+Alt+Space`,可改为 `Ctrl`、`Alt`、`Shift`、`Win` 与 `Space`、`Enter`、`Tab`、`A-Z`、`0-9` 或 `F1-F24` 组成的单一键盘组合。当前模式仍决定 Toggle 或 Hold 行为;`ESC` 仍固定用于取消录音。托盘运行时会监听 `config.json`,保存后无需重启即可刷新热键;录音或处理过程中保存的新热键会延迟到 Idle/Error 后安装。 ## M18 Per-Mode Keyboard Hotkeys ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --tray ``` M18 在 `Modes` 标签页为每个模式增加可选独立键盘热键。选择 `Use Global` 的模式继续使用全局热键;选择 `Custom` 后可配置 `Ctrl`、`Alt`、`Shift`、`Win` 与 `Space`、`Enter`、`Tab`、`A-Z`、`0-9` 或 `F1-F24` 组成的单一键盘组合。模式热键不能与全局热键或其他模式热键重复。 当运行时处于 Idle 或 Error 时,按下模式独立热键会先切换并持久化对应模式,再按该模式的 Toggle/Hold 规则开始录音。Recording 或 Processing 期间,模式独立热键不会切换当前模式;只有启动本次录音的同一个热键目标才能停止录音,避免错误松键停止不相关录音。 ## M19 Floating Status Window Placement ```powershell cargo run -p type4me-app -- --status-ui cargo run -p type4me-app -- --tray ``` M19 让 `--status-ui` 浮窗记住上次位置和尺寸。状态窗口退出时会把最后可用的窗口位置写入 `%APPDATA%\Type4Me\status_window.json`;下次启动时会恢复该位置和尺寸。缺失、损坏、非法尺寸或明显异常的坐标会被忽略,窗口回退到默认位置。 ## M20 Mouse Button Hotkeys ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --tray ``` M20 让全局录音热键和每个模式的独立热键都可以选择 `Keyboard` 或 `Mouse`。鼠标热键当前支持 Windows 侧键 `Mouse4` 和 `Mouse5`;不支持左键、右键、中键、滚轮、双击或键盘加鼠标组合。运行时会继续按 Active Mode 或指定模式处理 Toggle/Hold 录音逻辑;匹配到的 `Mouse4`/`Mouse5` 按下和松开事件会被全局 mouse hook 消费,避免应用程序同时收到浏览器后退/前进等默认侧键行为。 ## M21 History Encryption ```powershell cargo run -p type4me-app -- --tray cargo run -p type4me-app -- --settings-ui ``` M21 将历史记录从明文 JSONL 改为每行 DPAPI 加密 envelope。新完成的识别历史会加密写入 `%APPDATA%\Type4Me\history.jsonl`,历史 UI、搜索、删除、清空、保留条数和 CSV 导出继续通过仓库读取解密后的 `HistoryRecord`。旧明文 JSONL 行仍可读取;删除记录或触发保留条数修剪时,保留下来的旧记录会被重写成加密行。用户主动导出的 CSV 仍是明文文件。 ## M22 Startup Registration ```powershell cargo run -p type4me-app -- --startup-status cargo run -p type4me-app -- --startup-enable cargo run -p type4me-app -- --startup-disable cargo run -p type4me-app -- --settings-ui ``` M22 通过当前用户的 `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` 注册表项管理开机启动,写入的命令格式为当前 `type4me-app.exe` 路径加 `--tray`。设置窗口 `Providers` 标签页增加 `Start Type4Me when Windows starts` 复选框;如果已有 Type4Me 启动项但指向旧路径,保持勾选并保存会更新到当前程序路径。 ## M23 本地诊断 Doctor ```powershell cargo run -p type4me-app -- --doctor ``` M23 增加只读诊断命令。`--doctor` 会输出脚本友好的 `doctor.=ok|warn|error` 行,用于检查当前 Type4Me 配置目录、exe 路径、配置文件、LLM/ASR 配置、DPAPI 密钥、模式文件、历史文件和开机启动状态。该命令不调用远端模型、不录音、不注入文本、不修改文件,也不会写注册表。 ## M24 Release Build 输出 ```powershell powershell -ExecutionPolicy Bypass -File scripts\package-release.ps1 .\dist\type4me-win\type4me-app.exe --doctor ``` M24 增加本地 release 打包脚本。脚本会执行 `cargo build --release -p type4me-app`,清理并重建 `dist/type4me-win`,复制 `type4me-app.exe`、`README.md`、`README.en.md`,并生成包含构建时间、git commit 和分支信息的 `VERSION.txt`。M24 不生成安装包、不签名、不发布,也不做自动更新。 ## M25 Sound Feedback 声音反馈 ```powershell cargo run -p type4me-app -- --sound-status cargo run -p type4me-app -- --sound-test start cargo run -p type4me-app -- --sound-test stop cargo run -p type4me-app -- --sound-test error cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --tray ``` M25 增加可关闭的 Windows 系统提示音。默认启用,录音真正开始后播放 start 提示,接受停止并进入处理时播放 stop 提示,运行时错误会播放 error 提示。设置保存在 `%APPDATA%\Type4Me\config.json` 的 `sound.enabled` 字段;设置窗口 `Providers` 标签页提供开关。当前使用 Windows `MessageBeep`,不支持自定义 wav、输出设备或音量。 ## M26 Release Package Smoke ```powershell powershell -ExecutionPolicy Bypass -File scripts\package-release.ps1 Get-Content dist\type4me-win\SMOKE.txt .\dist\type4me-win\type4me-app.exe --doctor .\dist\type4me-win\type4me-app.exe --sound-status ``` M26 让 release 包生成后自动做只读 smoke。脚本会运行包内 `type4me-app.exe --doctor` 和 `type4me-app.exe --sound-status`,校验输出包含预期 key,并把退出码和输出写入 `dist/type4me-win/SMOKE.txt`。M26 不启动托盘、不打开 UI、不播放声音,也不生成安装包或签名。 ## M27 Release Archive ```powershell powershell -ExecutionPolicy Bypass -File scripts\package-release.ps1 Test-Path dist\type4me-win.zip [System.IO.Compression.ZipFile]::OpenRead((Resolve-Path dist\type4me-win.zip)).Entries.FullName ``` M27 在 release 目录之外生成 `dist/type4me-win.zip`。脚本会先完成 M26 的包内 smoke,再用包目录内容创建 zip,并校验 zip 中包含 `type4me-app.exe`、`README.md`、`README.en.md`、`VERSION.txt` 和 `SMOKE.txt`。M27 仍不生成安装包、不签名、不发布。 ## M28 Release Checksum ```powershell powershell -ExecutionPolicy Bypass -File scripts\package-release.ps1 Get-Content dist\type4me-win.zip.sha256 ``` M28 为 release zip 生成 SHA256 校验文件 `dist/type4me-win.zip.sha256`,格式为 `hash type4me-win.zip`。这用于手动分发后的完整性校验;M28 不做代码签名、GPG 签名、发布上传或自动更新。 ## M29 Portable Launchers ```powershell powershell -ExecutionPolicy Bypass -File scripts\package-release.ps1 Get-ChildItem dist\type4me-win\* -Include *.vbs,*.cmd -File ``` M29 在便携 release 包中加入双击入口:`Start Type4Me Tray.vbs` 启动 `type4me-app.exe --tray`,`Open Type4Me Settings.vbs` 打开设置窗口,并避免 Windows 双击 `.cmd` 时出现的黑色控制台窗口。`.cmd` 入口仍保留给批处理兼容场景。脚本使用相对自身目录的 exe 路径,所以解压后的文件夹可以移动。M29 不创建安装包、开始菜单快捷方式、桌面快捷方式或签名。 ## M30 Package Quickstart ```powershell powershell -ExecutionPolicy Bypass -File scripts\package-release.ps1 Get-Content dist\type4me-win\QUICKSTART.md ``` M30 在便携 release 包中加入 `QUICKSTART.md`,用很短的步骤说明先打开设置、配置远端 ASR/LLM、启动托盘、使用默认 `Ctrl+Alt+Space` 录音,以及查看 `SMOKE.txt`、`VERSION.txt` 和 `.sha256` 校验文件。M30 不改变运行时行为,也不创建安装包或快捷方式。 ## M44 Tray Modes Shortcut ```powershell cargo run -p type4me-app -- --tray ``` M44 在托盘菜单中增加 `Open Modes`。点击后会打开同一个设置窗口,并直接进入 `Modes` 标签页,方便管理模式、Prompt、Toggle/Hold 和模式独立热键。这个入口对齐原版 Type4Me 菜单中点击模式快捷提示后跳转到模式设置的行为。 ## M45 General Settings Tab ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --settings-ui --settings-tab general ``` M45 增加原版 Type4Me 对应的 `General` 设置标签页,并让设置窗口默认打开它。`General` 目前承载本地配置路径状态、开机启动和提示音反馈;`Providers` 标签页继续负责远端 LLM/ASR 模型、Base URL、API Key 和测试按钮。 ## M46 Clipboard Preservation ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --tray ``` M46 在 `General` 标签页增加剪贴板保护设置。默认开启时,Windows 注入会临时写入最终文本并发送粘贴,然后恢复原来的文本剪贴板;关闭后,最终文本会保留在剪贴板,便于手动再次粘贴。这对齐原版 Type4Me 的 `Copy to Clipboard` / `preserveClipboard` 行为。当前 Windows 实现只恢复文本剪贴板,不完整恢复图片、文件列表或富文本格式。 ## M47 Strip Trailing Punctuation ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --tray ``` M47 在 `General` 标签页增加 `Strip trailing punctuation` 设置,对齐原版 Type4Me 的 `去句末标点` / `tf_stripTrailingPunctuation`。可选 `Off`、`Periods only` 和 `All punctuation`;处理发生在热词片段替换、LLM 后处理之后,注入和写入历史之前,所以直接模式和 LLM 模式的最终输出会保持一致。 ## M48 CJK Space Cleanup ```powershell cargo run -p type4me-app -- --tray ``` M48 对齐原版 Type4Me `removingCJKLatinSpaces` 最终文本清理。直接模式和 LLM 模式都会在注入与历史写入前移除 CJK 字符相邻的多余空格,例如 `请 使用 Qwen 3, 明天 处理` 会变成 `请使用Qwen 3,明天处理`;纯英文空格如 `ship it tomorrow` 会保持不变。 ## M49 Bypass System Proxy ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --tray ``` M49 在 `General` 标签页增加 `Bypass system proxy` 设置,对齐原版 Type4Me 的 `tf_bypassProxy`。可选 `Off`、`All connections`、`ASR only` 和 `LLM only`;保存后运行时会按配置分别为远端 ASR 和远端 LLM 构造绕过系统代理的 HTTP 客户端,适合需要直连内网 ASR 或直连 LLM 服务的环境。 ## M50 Microphone Selection ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --tray ``` M50 在 `General` 标签页增加 `Microphone` 下拉框,对齐原版 Type4Me 的麦克风选择。设置窗口会列出 CPAL 在 Windows 上可见的输入设备;选择 `System default` 时继续使用系统默认麦克风,选择具体设备后,下一次启动 `--tray` 会用该设备录音。若保存的设备名已经不可用,设置窗口会回退到系统默认。 ## M51 Start Sound Style ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --tray ``` M51 在 `General` 标签页增加 `Start sound` 样式下拉框,对齐原版 Type4Me 的 `tf_startSound`。可选 `Off`、`Chime`、`Pluck`、`Submerge`、`Pong`、`Water Drop 1`、`Water Drop 2` 和 `Keyboard`;`Off` 会跳过开始和停止提示音但不影响错误提示音。 ## M52 Bundled Sound Assets ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --sound-test start cargo run -p type4me-app -- --sound-test stop ``` M52 将原版 Type4Me 的 wav 提示音资源嵌入 Windows 可执行文件,并在 portable release 的 `assets\sounds` 目录中携带一份可检查副本。`Chime` 会分别使用 `chime-start.wav` 和 `chime-end.wav`,`Keyboard` 会分别使用 `keyboard-start.wav` 和 `keyboard-end.wav`,`Pluck`、`Submerge`、`Pong`、`Water Drop 1`、`Water Drop 2` 的开始/停止使用对应同一个 wav;错误提示音仍回退到 Windows 系统错误 beep。 ## M53 Recording Visual Style ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --status-ui ``` M53 在 `General` 标签页增加 `Recording visual style` 设置,对齐原版 Type4Me 的 `tf_visualStyle`。可选 `Lines`、`Blocks` 和 `Minimal`,保存到 `%APPDATA%\Type4Me\config.json` 的 `visual.audio_visual_style`。状态浮窗录音时会按配置绘制线条、块状粒子或最小电平条;这一步先补可配置的视觉风格和状态窗呈现,尚未完整复刻原版浮动条的 hover、粒子时间轴和处理进度动画。 ## M54 History Correction Snippets ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M54 在 `History` 标签页为每条记录增加 `Correct` 入口,对齐原版 Type4Me 从历史记录创建纠错词条的核心流程。用户可基于 raw text 或 final text 填写误识别文本和正确文本,点击 `Add Correction` 后写入全局 snippet 词库;误识别触发词会去除空白并做大小写无关的重复检测,已有触发词不会被覆盖。新增规则会在后续识别结果的词库替换阶段生效。更接近原版 QuickCorrectionSheet 的逐字选择器、拖拽选区和完成后自动跳转词库详情属于后续精细交互。 ## M55 History Date Filters And Statistics ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M55 在 `History` 标签页增加日期过滤和统计摘要,对齐原版 Type4Me History 的筛选/统计能力。日期过滤支持 `All`、`Today`、`Yesterday`、`This Week` 和 `This Month`,会影响历史列表、统计摘要和 `Export CSV` 导出的记录范围;统计摘要显示过滤后记录数、总录音时长、总字符数和平均字符/分钟。底层 `JsonlHistoryRepository` 增加范围查询、过滤导出和统计接口,继续兼容 DPAPI 加密历史与旧明文历史。原版的自定义日期范围弹窗和批量选择删除仍属于后续 History parity 任务。 ## M56 History Custom Date Range ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M56 在 `History` 标签页增加自定义日期范围输入,对齐原版 Type4Me History 的 Custom range 筛选能力。用户可输入 `YYYY-MM-DD` 格式的起止日期并点击 `Apply Range`,该范围会包含结束日期当天整天,并同步影响历史列表、统计摘要和 `Export CSV`;`Clear Range` 会回到 `All`。当前实现使用轻量文本输入而不是原版 macOS 日期选择弹窗;批量选择删除仍属于后续 History parity 任务。 ## M57 History Batch Selection ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M57 在 `History` 标签页增加批量选择和批量删除,对齐原版 Type4Me History 的 selection mode。点击 `Select` 后,每条可见记录会显示选择框,并可使用 `Select Visible` / `Deselect Visible` 管理当前筛选结果中的可见记录;`Delete Selected` 会一次删除选中的历史记录并刷新列表和统计。底层 `JsonlHistoryRepository` 增加 `delete_many_sync`,保留 DPAPI 加密重写行为。原版更细的确认弹窗视觉仍属于后续 History parity 任务。 ## M58 History Load More Pagination ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M58 将 `History` 标签页从固定最近 100 条改为 50 条分页加载,对齐原版 Type4Me History 的 load-more 行为。首次打开或筛选变化时加载第一页,底部 `Load More` 会在当前筛选条件下继续追加下一页;搜索、日期范围、统计摘要、导出 CSV 和批量选择仍沿用同一筛选范围。底层 `HistoryQuery` 增加 `offset` 支持;当前 JSONL/DPAPI 历史仓库仍采用“先解密过滤,再 offset/limit 分页”的实现,统计与导出则显式忽略分页参数,避免只统计或导出当前页。 ## M59 History Correction Character Picker ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M59 将 `History` 标签页里的 `Correct` 编辑器从手工填写误识别文本升级为逐字点选模式,更接近原版 Type4Me `QuickCorrectionSheet`。点击 `Correct` 后,面板会优先展示 raw text(若 raw 与 final 不同),去除空白后按字符拆分,用户可直接点选或拖拽选择识别错误字符,底部输入正确词,再写入全局 snippet 词库。当前实现已支持字符级选择、拖拽连续选区、清空选择、按钮禁用校验、去空白触发词保存,以及保存成功后自动跳转 `Vocabulary` 并聚焦新增纠错词条;更完整的 sheet 视觉仍属于后续 parity 打磨。 ## M60 History Day Grouping ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M60 将 `History` 列表从平铺记录升级为按天分组展示,更接近原版 Type4Me History 的阅读方式。历史页会把当前过滤结果按 `created_at` 所在日期分组,并为每组显示标题与摘要:当天显示 `Today`,前一天显示 `Yesterday`,7 天内同年日期显示星期标题,更早日期显示月日或带年份的完整日期;同组摘要还会展示该组记录数和总录音时长。分页 `Load More` 仍然沿用现有过滤条件,新增记录会自然落到对应日期分组下。 ## M61 History Custom Date Picker ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M61 将 `History` 顶部的自定义日期范围从纯文本输入升级为更接近原版 Type4Me 的日期选择面板。点击范围按钮后会弹出月份面板,可切换前后月份并直接点选起始日期和结束日期;选中起始日期后会自动切换到结束日期选择,若新选择越过另一端则会自动夹紧范围,避免非法日期区间。`Apply Range`、统计摘要、列表筛选、CSV 导出和 `Load More` 仍沿用现有自定义范围过滤链路,`Clear Range` 则回到 `All` 并恢复默认近 30 天日期。 ## M62 Status Processing Animation ```powershell cargo run -p type4me-app -- --status-ui ``` M62 补上了状态浮窗在 `Processing` 阶段的动态视觉反馈,进一步靠近原版 Type4Me 的处理中体验。此前浮窗只有 `Recording` 时会展示音量视觉,`Processing` 仅显示静态标题;现在 `Processing` 会复用当前设置的视觉风格,在状态窗中持续渲染一组随时间变化的忙碌动画,让用户更容易感知“正在处理中而不是卡住了”。该动画目前采用轻量波动条/块状节奏实现,优先补足可感知反馈;原版更完整的浮动条 hover、粒子时间轴和更复杂的动效仍属于后续 parity 打磨。 ## M63 Floating Status Bar Chrome ```powershell cargo run -p type4me-app -- --status-ui ``` M63 继续把状态浮窗往原版 Type4Me 的“浮动条”形态推进。状态窗现在改成无边框、透明背景、自绘圆角卡片,并默认以更紧凑的悬浮条形态展示;鼠标悬停时会自动展开到更完整的信息布局,移开后再收回紧凑状态。浮动条头部支持直接拖拽移动窗口,视觉层仍沿用当前状态色和录音/处理中动画。这个里程碑先补齐最显眼的窗口 chrome 和悬停节奏,原版更细的 hover 细节、粒子时间轴和更复杂的浮动行为仍属于后续 parity 打磨。 ## M64 Timeline Particle Motion ```powershell cargo run -p type4me-app -- --status-ui ``` M64 继续收敛状态浮窗的 `Timeline` 视觉,让它更接近原版 Type4Me 的“时间轴 + 流动粒子”感觉。`Minimal` 风格不再只是简单的几根高度条,而是改成一条稳定基线,再叠加沿时间轴流动的亮点粒子;粒子位置会随着动画相位持续推进,透明度和大小也会按前后层次变化。这样在 `Processing` 阶段会更像原版那种“状态在流动”的感觉,而不是纯粹的忙碌电平条。更复杂的粒子尾迹、hover 联动和原版更完整的动效编排仍属于后续 parity 打磨。 ## M74 Microphone Keep-Alive ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --tray ``` M74 在 `General` 标签页增加 `Mic Keep-Alive`,对齐原版 Type4Me 的 `tf_micKeepAlive`。开启后,托盘空闲时会在后台维持一个轻量麦克风热身流,尽量减少蓝牙麦克风或冷启动输入设备首段掉字、延迟拉起和偶发断连。正式录音开始前会自动挂起保活流,停止、取消或错误返回后再恢复;具体录音输入设备仍沿用当前 `General -> Microphone` 的选择或系统默认设备。 ## M75 Smart Correction Suggestions ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M75 把 `History -> Correct` 从纯手工纠错继续补到更接近原版 Type4Me `SmartCorrectionSheet` 的智能建议流程。用户先在历史文本里点选误识别字符、输入正确词,然后点击 `Generate Variants`;Windows 版会复用当前 LLM 配置调用远端模型,生成一组 snippet 替换建议和可选 hotword 建议,并在同一编辑器里给出可勾选预览。已有内置或用户词条会被标记为 `exists` 并默认取消选中;确认后点击 `Add Selected`,选中的 snippet / hotword 会写入本地词库,snippet 保存后仍会沿用现有跳转逻辑聚焦到 `Vocabulary`。 ## M76 Status Hover Transcript Preview ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --tray ``` M76 补齐原版 Type4Me `tf_hoverTranscriptPreview` 对应的状态浮窗预览开关。`General -> Visuals` 里新增 `Show transcript preview when hovering the status bar`,默认开启;运行时完成一次识别/处理后,会把本次最终注入文本写入 `RuntimeStatusSnapshot.preview_text`,状态浮窗 hover 展开时会显示可选中的完整预览。由于当前 Windows 版 ASR 是远端一次性返回,M76 不伪造录音中的流式分段,只先提供完成后的 hover 预览闭环。 ## M77 Short Text Skip ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab modes cargo run -p type4me-app -- --tray ``` M77 补齐原版 Type4Me `tf_shortTextExemption` 对应的短文本跳过能力。`Modes` 标签页现在提供 `Short Text Skip` 下拉框,可选 `Off`、`Under 10/20/30/40/50 chars`;保存后写入 `%APPDATA%\Type4Me\config.json`。运行时只对内置 `语音润色` 生效:当片段替换后的识别文本短于阈值时跳过 LLM,直接注入 ASR/片段结果,并在历史里保持 `processed_text = null`。翻译、命令、代办和自定义 Prompt 不受该阈值影响。 ## M78 First-Run Setup ```powershell cargo run -p type4me-app -- --settings-ui cargo run -p type4me-app -- --settings-ui --settings-tab setup ``` M78 为 Windows 版补上一个轻量的首次配置闭环,对齐原版 Type4Me 首次启动会先进入 Setup 的思路。现在当 `%APPDATA%\\Type4Me\\config.json` 已存在但 ASR/LLM 的必需字段或密钥还没准备好时,设置窗口默认会先落到 `Setup` 标签页;该页复用现有 Providers 表单和 `Test LLM` / `Test ASR` 能力,用户可以直接保存配置、测试连通性,并在条件满足后点击 `Complete` 进入 `General`。这个版本先聚焦 BYOK 初始化,不实现原版会员登录、本地 ASR 下载或权限向导。 ## M79 Provider Presets ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers cargo run -p type4me-app -- --settings-ui --settings-tab setup ``` M79 在 `Providers` 和 `Setup` 页面增加轻量 provider 预设层,让首次配置更接近原版 Type4Me 的 provider 选择体验。默认配置会识别为 `TAL Internal`;非默认 endpoint/model 会识别为 `Custom OpenAI-Compatible`。选择 `TAL Internal` 会自动填入当前项目默认 LLM/ASR Base URL、模型名,以及缺省 temperature/language;选择自定义 OpenAI-compatible 不会覆盖用户已填写的 endpoint 或模型。 ## M80 History Language Formatting ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab general cargo run -p type4me-app -- --settings-ui --settings-tab history ``` M80 让 `General -> Primary Language` 不再只是保存偏好,而是先驱动 `History` 页中最明显的系统文案格式:日期筛选项、日期分组标题、日历月份/星期标题、自定义日期范围按钮和统计摘要会随 `English` / `中文` 切换。该阶段先聚焦 History 的日期和统计信息,避免一次性翻译全设置窗口;后续可继续把 Providers、Modes、About 等页面的系统文案接入同一语言设置。 ## M81 About Update Check ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab about ``` M81 补齐原版 Type4Me `About` 页里的手动检查更新入口。Windows 版现在会在点击 `Check for Updates` 后用后台线程读取 `https://raw.githubusercontent.com/joewongjc/type4me/main/updates.json`,解析 release manifest,按语义版本号比较当前版本和新版本,并在 About 页显示 `Update available` 或 `You're up to date`。该阶段不自动下载、不安装、不重启,也不改变便携包分发方式;真正的自动下载更新仍然需要安装包、签名和发布流程配合。 ## M82 Diagnostics Panel ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab diagnostics ``` M82 补齐设置窗口里的排障入口。`Diagnostics` 标签页会在本机刷新 `--doctor` 诊断结果,显示最近的 `%APPDATA%\Type4Me\debug.log`,并可导出 `type4me-diagnostics.txt`。导出内容包含配置/密钥是否存在、模式/历史/启动项检查结果和最近日志摘要;程序仍避免写入 API Key、完整 ASR 文本、完整 LLM 输出或请求体。 ## M83 Provider Identity Foundation ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers ``` M83 把 M79 的 provider 预设从“只影响表单”推进为正式配置字段。`config.json` 现在会保存 LLM/ASR 的 `provider`,支持 `tal_internal` 和 `openai_compatible`;旧配置没有该字段时,会按 base URL/model 推断并继续兼容读取。运行时构建 provider 后会把稳定 provider id 写入 session/history,而不是固定写成笼统的 configured-openai-compatible。这个阶段仍复用现有 OpenAI-compatible/TAL HTTP 实现,不一次性新增 Deepgram、Soniox、Bailian 等原版专有协议。 ## M84 LLM Provider Preset Catalog ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers ``` M84 对齐原版 Type4Me 的 LLM provider 选择体验:`Providers` 和 `Setup` 页面不再只有 `TAL Internal` 与 `Custom OpenAI-Compatible`,而是提供 Doubao、MiniMax China、MiniMax Global、Bailian、Kimi、OpenRouter、OpenAI、Gemini、DeepSeek、Zhipu 和 Ollama 等常见厂商预设。选择厂商会填入默认 Base URL 和常用模型;有固定模型列表的厂商会显示模型下拉,自定义、OpenRouter 和 Ollama 仍保留自由输入。运行时继续复用 OpenAI-compatible LLM 通道,并按厂商补充禁用 thinking/reasoning 的请求字段;Ollama 作为本地 OpenAI-compatible 网关时不强制要求 API Key。M84 不新增 Claude 原生 Messages API,也不新增原版多厂商 ASR 流式协议。 ## M85 LLM Failure Fallback ```powershell cargo run -p type4me-app -- --tray ``` M85 对齐原版 Type4Me 的 LLM 容错行为:当当前模式需要 LLM 后处理,但远端 LLM 调用失败,或调用成功却返回空白文本时,Windows 版不再丢弃本次录音,也不会把最终文本清空。运行时会回退到热词/片段处理后的 ASR 文本,继续注入和写入历史;历史中的 `processed_text` 保持为空。ASR 失败、录音过短/过静音、文本注入失败仍按错误处理,并会进入 Error 状态。 ## M86 OpenAI ASR Provider Preset ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers ``` M86 把 ASR provider 目录从 `TAL Internal` / `Custom OpenAI-Compatible` 往原版 Type4Me 的 ASR 选择体验推进一步:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `OpenAI`,会自动填入 `https://api.openai.com/v1` 和 `gpt-4o-transcribe`,并提供 `gpt-4o-transcribe`、`gpt-4o-mini-transcribe`、`whisper-1` 模型下拉。旧配置中 OpenAI ASR endpoint/model 会推断为稳定 provider id `openai`,运行时历史也会记录该 id。M86 仍复用当前 OpenAI-compatible REST 转写通道,不实现 Deepgram、Soniox、AssemblyAI、ElevenLabs、百炼、火山等原版专有/流式 ASR 协议。 ## M87 Soniox Async ASR Provider ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers ``` M87 补齐一个真正可工作的原版 ASR provider 协议:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `Soniox`,默认填入 `https://api.soniox.com`、`stt-async-v4` 和 `zh,en` language hints。运行时会按 Soniox 异步文件级接口执行“上传 wav -> 创建 transcription -> 轮询状态 -> 读取 transcript -> 清理远端文件/任务”,并把热词写入 Soniox `context.terms`。这是批量转写 provider,适配当前 Windows 版录完一段音频再处理的架构;原版实时 Soniox 流式识别、Deepgram/AssemblyAI/ElevenLabs 等 WebSocket 流式协议仍是后续大项。 ## M88 Deepgram ASR Provider ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers ``` M88 继续补原版 ASR provider 目录:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `Deepgram`,默认填入 `https://api.deepgram.com/v1/listen`、`nova-3` 和 `zh`,并提供 `nova-3`、`nova-2`、`nova-2-general`、`nova-2-meeting`、`nova-2-phonecall` 模型下拉。运行时会把停止录音后的 PCM16LE 音频发送到 Deepgram prerecorded REST `/v1/listen`,使用 `Authorization: Token ...` 鉴权,并按原版规则把热词作为 `nova-3` 的 `keyterm` 或旧模型的 `keywords=:2` query 参数传入。当前实现是录完再转写的批量 provider;原版 Deepgram WebSocket 实时流式识别仍属于后续流式 ASR 架构项。 ## M89 AssemblyAI ASR Provider ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers ``` M89 继续补齐原版 ASR provider 目录:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `AssemblyAI`,默认填入 `https://api.assemblyai.com/v2`、`universal-2` 和 `zh`,并提供预录音 REST 转写模型下拉。运行时会把停止录音后的 WAV 上传到 AssemblyAI `/v2/upload`,再创建 `/v2/transcript` 任务、轮询 transcript 状态并读取最终 `text`;热词会作为 `keyterms_prompt` 传入。当前实现是录完再转写的批量 provider;原版 AssemblyAI WebSocket 实时流式识别仍属于后续流式 ASR 架构项。 ## M90 ElevenLabs ASR Provider ```powershell cargo run -p type4me-app -- --settings-ui --settings-tab providers ``` M90 继续补齐原版 ASR provider 目录:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `ElevenLabs`,默认填入 `https://api.elevenlabs.io/v1`、`scribe_v1` 和 `zh`。运行时会把停止录音后的 WAV 作为 multipart 上传到 ElevenLabs `/v1/speech-to-text`,使用 `xi-api-key` 鉴权,并读取返回的 `text`。当前实现是录完再转写的批量 provider;原版 ElevenLabs WebSocket 实时流式识别仍属于后续流式 ASR 架构项。 ## M91 Bailian ASR Provider M91 开始补原版的 WebSocket ASR 大块差异:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `Bailian`,默认填入 `wss://dashscope.aliyuncs.com/api-ws/v1/inference`、`fun-asr-realtime` 和 `zh`。运行时会在停止录音后连接百炼 WebSocket,发送 `run-task`、PCM16LE 音频块和 `finish-task`,再读取 `result-generated` / `task-finished` 事件拼出最终文本。当前仍适配 Windows 版“录完再处理”的主流程,不做录音中的实时字幕预览。 ## M92 Baidu ASR Provider M92 继续补原版 WebSocket ASR provider:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `Baidu AI Cloud`,默认填入 `wss://vop.baidu.com/realtime_asr`、Dev PID `15372` 和 `zh`。百度 ASR 需要额外填写 `App ID`,API Key 仍保存在 DPAPI credentials 中;运行时会在停止录音后连接百度实时 ASR WebSocket,URL 带 `sn` 请求号,发送 `START`、PCM16LE 音频块和 `FINISH`,再读取 `MID_TEXT`、`FIN_TEXT`、`ERROR` 事件拼出最终文本。 ## M93 Volcano ASR Provider M93 继续补原版默认 ASR 大块差异:`Providers` 和 `Setup` 页面的 ASR preset 现在提供 `Volcano (Doubao)`,默认填入 `wss://openspeech.bytedance.com/api/v3/sauc/bigmodel_async`、Resource ID `auto` 和 `zh`。火山 ASR 需要额外填写 `App ID`,API Key 字段保存火山 `Access Token`;运行时会在停止录音后连接火山 WebSocket,带 `X-Api-App-Key`、`X-Api-Access-Key`、`X-Api-Resource-Id` 和 `X-Api-Connect-Id` 请求头,发送原版 `full_client_request` 二进制首包、PCM16LE 音频块和最后空音频包,并读取火山 final response 拼出最终文本。当前已支持 inline hotwords 和基础 Resource ID 选择。 ## M94 Claude Native LLM Provider M94 补齐原版 Type4Me 已存在的 Claude (Anthropic) 原生 LLM provider:`Providers` 和 `Setup` 页面的 LLM preset 现在提供 `Claude (Anthropic)`,默认填入 `https://api.anthropic.com/v1` 和 `claude-sonnet-4-6`,模型下拉包含原版常用 Claude Sonnet/Opus/Haiku 选项。运行时、设置页 `Test LLM`、历史纠错建议和 `--smoke-configured-llm` 会按 provider id 选择原生 `ClaudeLlm`,通过 Anthropic Messages API `/messages` 发送 streaming 请求,使用 `x-api-key` 与 `anthropic-version: 2023-06-01` 鉴权/版本头,并解析 SSE `content_block_delta` 文本。OpenAI-compatible 厂商仍走原有 `/chat/completions` 通道。 ## M95 Processing Raw Transcript Preview M95 补齐一个更接近原版 Type4Me 的状态浮窗体感:会话层现在会在 ASR 文本可用后、LLM 后处理开始前发出 `RawTextReady` 进度;托盘运行时会把该进度即时写入 `RuntimeStatusSnapshot.preview_text`,并通过状态通道立刻发送给 `--status-ui`。状态浮窗在 Processing 阶段会把这段原始识别文本作为正文显示,所以用户不必等 LLM 完成后才知道 ASR 是否识别正确。当前能力是“录音停止后的 ASR 原文预览”,还不是录音中的实时 partial 字幕;后续接入真正流式 ASR 后可以沿用同一条进度/状态通道继续扩展。 ## M96 ASR Transcript Progress Preview M96 继续把原版 Type4Me 的转写体感往前推了一步:`SpeechRecognizer` 现在支持可选的 `recognize_with_progress`,`RecognitionSession` 会把 ASR 进度上浮成 `SessionProgress::AsrTranscript`,托盘运行时再把这些中间 transcript 写入 `RuntimeStatusSnapshot.preview_text` 并立即推送给 `--status-ui`。当前已让 Baidu、Bailian 和 Volcano 这几个 WebSocket ASR provider 在处理过程中发出中间文本,状态浮窗的 Processing 预览会随之更新。它仍然是停止录音后的处理态,不是录音中的实时 partial 字幕。 ## M97 Baidu ASR Customization M97 补齐原版 Baidu ASR 配置细节:`Providers` 和 `Setup` 页面的 `Baidu AI Cloud` preset 除了 App ID、Dev PID 和 API Key,现在还会显示 `CUID`、`LM ID` 和 `Punctuation`。CUID 为空时会使用稳定 per-install ASR 身份;LM ID 为空时不发送;关闭 Punctuation 时会按原版协议把带标点 Dev PID `15372` 映射为 `1537`、`17372` 映射为 `1737`。这些字段会写入 `%APPDATA%\Type4Me\config.json`,API Key 仍只保存在 DPAPI credentials 中。 ## M98 Volcano ASR Bias Settings M98 补齐一组原版 Volcano ASR 配置细节:`Providers` 和 `Setup` 页面的 `Volcano (Doubao)` preset 除了 App ID、Access Token 和 Resource ID,现在还会显示 `UID`、`Boosting Table ID` 和 `Context History`。UID 为空时会使用稳定 per-install ASR 身份;填写 Boosting Table ID 时,运行时会发送 `request.corpus.boosting_table_id` 并按原版逻辑跳过 inline hotwords;Context History 大于 0 时会发送 `request.context_history_length`。这些非密钥字段会写入 `%APPDATA%\Type4Me\config.json`,Access Token 仍只保存在 DPAPI credentials 中。 ## M99 Volcano ASR Auto Resource Detection M99 补齐原版 Volcano ASR 的 Resource ID `auto` 探测逻辑。设置页 `Test ASR` 在 Volcano + `auto` 且尚无已探测 Resource ID 时,会先用 `volc.seedasr.sauc.duration` 测试;如果 seed 资源失败,会再试 `volc.bigasr.sauc.duration`。测试成功后,探测出的 Resource ID 会写入 `%APPDATA%\Type4Me\config.json` 的 `asr.volcano_resolved_resource_id`,托盘运行时在 `model = "auto"` 时优先使用该值;没有探测值时仍默认使用 seed 资源。 ## M100 Stable ASR Identity M100 补齐原版 Type4Me 风格的稳定 ASR 身份。Baidu 的 CUID 或 Volcano 的 UID 为空时,设置页 `Test ASR` 和托盘运行时会生成 `type4me-`,保存到 `%APPDATA%\Type4Me\asr-identity.json`;设置页会把生成值更新到当前表单,托盘运行时会写回当前 ASR 配置。之后 Baidu 和 Volcano 会复用同一个 per-install 身份;如果用户手动填写 CUID/UID,则优先使用用户值。 ## M101 Volcano Cloud Hotwords M101 补齐原版 Type4Me 的火山云端热词表管理。`Volcano (Doubao)` preset 现在除了 Access Token 以外,还可填写 IAM Access Key ID 和 IAM Secret Access Key;它们会和其他密钥一样保存在 DPAPI credentials 中,不写入明文配置。点击 `Sync Cloud Hotwords` 会通过火山 OpenAPI `ListBoostingTable` / `CreateBoostingTable` / `UpdateBoostingTable` 创建、采纳或更新名为 `type4me-hotwords` 的 Boosting Table,并把返回的 table id 写入 `%APPDATA%\Type4Me\config.json` 的 `asr.volcano_boosting_table_id`。托盘启动时、以及设置窗口里热词或内置热词变化后,如果当前 ASR provider 是 Volcano 且 IAM 信息已保存,也会后台同步一次。云端表只上传火山兼容热词:去空白、去重、长度不超过 10 个字符,字符限定为字母/数字/空白/CJK 统一汉字。 ## 范围说明 V1 不实现本地 ASR,只预留 provider 接口。本地模型、SenseVoice、Qwen3-ASR、SherpaOnnx、自动下载安装更新、安装包签名、自定义提示音包、录音中的实时 ASR 字幕预览和完整原版浮动条动效仍不属于当前 M101 范围。