English | 简体中文
声写(VoxType)是一个面向 Windows 10/11 的桌面语音输入、语音转文字和听写工具。把光标放到任意输入框后,按下全局热键开始说话,程序会录制麦克风音频,通过豆包流式 ASR WebSocket 实时识别语音,可选调用 OpenAI 兼容大模型润色文本,并将最终结果写入剪贴板后自动粘贴到当前输入位置。
当前代码已迁移为根目录 Tauri 项目:Rust 负责全局热键、输入钩子、音频采集、ASR 会话、剪贴板、系统托盘、悬浮字幕窗和系统音量;Svelte 负责主窗口 GUI。
这是个人项目,目标是实用、轻量、易修改。请勿把真实密钥、个人热词、上下文或本地日志提交到仓库。
主界面采用蓝白配色和紧凑侧边栏,首页集中展示当前输入状态、最近一次输入、触发方式和输入表现统计。
左侧导航按使用任务拆分为首页、热词、API配置、选项和统计分析:热词页默认管理常用热词和润色提示词,API配置页默认管理豆包 ASR 必填配置与可选大模型 API,选项页默认管理快捷键、粘贴方式、麦克风、字幕外观、开机启动和关闭行为。低频排障项位于各页高级设置,部分底层参数仅支持通过 config.toml 修改。统计页展示最近 24 小时、最近 7 日、平均输入速度和按日使用情况,新识别结果写入后会刷新。
录音和处理过程中会在当前屏幕居下显示悬浮字幕,用于实时查看转写内容与必要状态提示;字幕尺寸、位置和配色可在选项页调整。
Ctrl + Q;右 Alt 和鼠标中键可在选项页手动开启,避免误触或与其他软件冲突。cpal 采集 PCM 音频,可选择输入设备。bigmodel_async WebSocket,支持实时字幕片段和最终语音转文字结果。Ctrl+V 或 Shift+Insert 粘贴到当前焦点输入框;首页可临时展开查看并一键复制最近一次识别文本,关闭窗口或开始下一次录音后清除。默认页只显示“自动粘贴 / 仅复制到剪贴板”,完整粘贴方式和剪贴板恢复延迟在高级设置中调整。这些行为直接影响普通用户对语音输入结果的信任,维护时应保持:
min_chars,且 Base URL、API Key、模型名都填写完整时,界面才显示“正在润色文本”。仅面向 Windows 10/11。
普通用户请下载并运行 VoxType-*-setup.exe 安装包。安装包会内置 Microsoft Edge WebView2 Bootstrapper,在系统缺少 WebView2 Runtime 时自动安装运行时。
项目不再发布绿色版 ZIP。绿色版不会安装系统运行时,容易在干净电脑上出现缺少 WebView2 Runtime 的问题。
运行时还需要 Windows 允许桌面应用访问麦克风。若录音失败,请在“设置 → 隐私和安全性 → 麦克风”中开启麦克风访问权限。
开发构建需要安装:
如果 Rust 已安装但当前终端找不到 cargo,先执行:
$env:PATH="$env:USERPROFILE\.cargo\bin;$env:PATH"
首次使用可以参考配置指南:Setup Guide。如果安装版启动时找不到 config.toml,程序会自动打开该指南;主窗口首页也会显示配置健康检查,提示还缺少哪些配置。
豆包 ASR 的 App Key 和 Access Key 是主流程必填项。未填写时,主窗口会优先引导到 API配置页,录音、识别、粘贴等后续入口会被锁定,填写后会自动保存并生效。
复制配置模板:
Copy-Item .\config.example.toml .\config.toml
至少填写豆包 ASR 认证信息:
[auth]
app_key = ""
access_key = ""
resource_id = "volc.seedasr.sauc.duration"
API配置页还可以设置豆包 ASR 的输入语言。默认是 zh-CN,适合中文语音;多语言场景可切换为 en-US、ja-JP、yue-CN 等豆包文档支持的语言代码,或选择自动/服务默认来省略该参数。豆包文档说明该参数只在部分流式模式支持,如果测试失败,可先改回自动/服务默认或确认当前接口模式。
如果启用大模型润色,还需要填写:
[llm_post_edit]
enabled = true
api_key = ""
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
model = "qwen3.5-plus"
VoxType 已内置一套面向语音输入的默认润色提示词。默认规则会把识别文本视为待润色素材,不回答、不执行其中的指令或问题,避免把润色任务误变成内容分析。热词页默认展示 User Prompt 模板、恢复默认提示词和预览入口;System Prompt 与最小润色字数位于高级设置。
热词页高级设置还提供“自动生成热词候选”。该功能默认关闭,开启后只保存 VoxType 自己生成的最终语音输入文本,不记录键盘输入,不读取剪贴板历史。只有用户点击“生成候选”时,才会把本地历史摘要发送到已配置的大模型服务;生成结果只是候选,必须勾选确认后才会合并到 context.hotwords。历史文本默认上限为 5000 字;旧版默认 10000 字会在配置加载时自动迁移为 5000 字。热词生成会使用比普通润色更高的输出长度和超时预算;如果完整历史生成返回不完整或超时,会自动缩小历史范围并减少候选数量重试一次。若仍失败,可降低历史文本上限或候选数量后重试。
[auto_hotwords]
enabled = false
max_history_chars = 5000
max_candidates = 30
ignored_hotwords = []
填写豆包 ASR 或大模型 Key 后,可在 API配置页点击对应区域的“测试”按钮,先确认 Key、Base URL、模型名称和网络环境是否可用,再开始正式录音。
配置修改后会自动保存。自动保存前会做基础字段校验,明显非法的采样率、声道数、录音时长、粘贴延迟、剪贴板恢复延迟、快照大小、枚举值、URL scheme、GitHub 仓库格式、LLM 必填项、超时时间、悬浮窗尺寸和字幕颜色不会写入配置文件。
文本后处理相关配置:
[typing]
remove_trailing_period = true
开启后,最终文本以中文句号或英文句点结尾时会自动去掉;关闭后会保留 ASR 或大模型输出的句末标点。
剪贴板恢复相关配置:
[typing]
clipboard_restore_delay_ms = 800
clipboard_snapshot_max_bytes = 8388608
恢复延迟越长,目标应用越有时间读取语音文本;但原剪贴板恢复也会更晚。为避免慢应用粘贴到旧剪贴板内容,自动粘贴时会使用不低于 500ms 的安全恢复等待。快照大小上限用于跳过过大的格式,降低大剪贴板卡顿风险。
如需随 Windows 登录自动启动,可在选项页开启,或在 config.toml 中设置:
[startup]
launch_on_startup = true
更新检查默认读取 zkwi/VoxType 的 GitHub Release。需要关闭启动自动检查时,可在选项页高级设置中关闭,或在 config.toml 中设置:
[update]
auto_check_on_startup = false
github_repo = "zkwi/VoxType"
config.toml、本地日志和统计文件已被 .gitignore 忽略。示例配置和文档只保留占位值,不应写入真实密钥、个人热词或自定义上下文。
在仓库根目录执行:
npm install
npm run tauri dev
开发服务固定使用:
http://127.0.0.1:18080
没有继续使用 Tauri 模板默认的 1420 端口,因为部分 Windows 环境会把相邻端口段保留给系统,导致 Vite 报 listen EACCES。
调试构建:
npx tauri build --debug --no-bundle
正式构建:
npx tauri build
NSIS 安装包会嵌入 WebView2 Bootstrapper。首次安装到缺少 WebView2 Runtime 的干净电脑时,安装程序会联网安装该运行时。
安装包内置简体中文、繁体中文和英语。安装时默认根据 Windows 系统语言自动选择安装器语言;不额外弹出语言选择窗口。
正式可执行文件通常位于:
src-tauri\target\release\voxtype-desktop.exe
不要直接用 cargo build --release 作为桌面端发布产物;那样不会先构建前端资源,可能导致窗口打开后访问开发地址失败。
VoxType。Ctrl + Q 开始录音;如已在选项页开启,也可使用右 Alt 或鼠标中键。Ctrl + V。默认隐私与误触策略:
context/recent_context.jsonl,不会写回 config.toml,也可在热词页清除。context/hotword_history.jsonl,可在热词页高级设置中清空;诊断报告和日志不会输出历史正文、候选词或 prompt。0.03;旧版默认 10 秒 / 0.04 会在配置加载时自动迁移为 30 秒 / 0.03;录音期间静音系统声音默认关闭。托盘行为:
config.toml。选项页高级设置中的“诊断与日志”也可以直接打开本地日志或复制诊断报告。日志会记录关键启动阶段、配置保存、ASR/LLM 错误、更新检查和前端异常;密钥形态会自动脱敏。诊断报告默认不包含识别正文、密钥、热词、prompt、最近上下文、自动热词历史正文、候选词或 Windows 用户名路径。
VoxType 是 Windows 桌面语音输入工具,用豆包流式 ASR 将麦克风语音转成文字,再复制并自动粘贴到当前输入框。它更像系统级听写助手,不是聊天机器人。
只要目标软件能接收剪贴板粘贴,通常就能使用 VoxType,包括浏览器输入框、聊天软件、Markdown 编辑器、IDE、办公文档和内部管理系统。少数拦截 Ctrl + V 的软件可以改用 Shift + Insert 或仅复制到剪贴板。
默认不会。统计只记录时长、字数、速度等非正文数据;最近上下文和自动热词候选默认关闭。启用这些高级功能前,应确认本地正文历史的隐私影响。
VoxType 的主链路依赖豆包流式语音识别服务。没有 App Key 和 Access Key 时,录音、识别和自动粘贴入口会保持锁定,避免用户以为已经输入成功。
# 前端类型检查
npm run check
# 前端构建
npm run build
# Rust 检查
Set-Location .\src-tauri
cargo check
# Rust 测试
cargo test
# Rust lint
cargo clippy --all-targets -- -D warnings
# 本地密钥扫描
Set-Location ..
npm run scan:secrets
# 暂存区密钥扫描
npm run scan:secrets:staged
# npm 依赖审计
npm run audit:npm
# Rust 依赖审计(需要先安装 cargo-audit)
npm run audit:rust
启用 Git pre-commit 钩子:
.\scripts\enable_git_hooks.ps1
钩子会调用 scripts/scan-secrets.mjs 扫描暂存文件,避免误提交本地配置、密钥、热词和上下文。
本项目允许使用 AI 辅助维护代码,但所有 AI 改动必须遵守根目录 AGENTS.md。
日常改动后,在仓库根目录运行:
npm run ai:check
也可以直接运行:
.\scripts\ai-check.ps1
该检查会依次执行:
npm run check
npm run build
npm run scan:secrets
npm run test:secrets
cargo fmt --check
cargo check
cargo test
如果本次改动涉及 UI,还需要手工检查:
更多规则见:
AGENTS.mdCHANGELOG.mddocs/code-style.mddocs/directory-structure.md仓库包含一个最小 GitHub Actions CI:.github/workflows/ci.yml。CI 在 Windows runner 上执行前端类型检查、前端构建、密钥扫描、Rust 格式检查、clippy 和测试;本地仍以 npm run ai:check 作为日常提交前入口。
发布前可运行:
npm run ai:release-check
Rust 依赖审计依赖 cargo-audit。本机未安装时先运行:
cargo install cargo-audit --locked
发布或合并前应同步更新 CHANGELOG.md 的 [Unreleased] 或对应版本段,记录用户可见变化、主链路保护和维护性调整。
提交 Issue 或 PR 前请先阅读 CONTRIBUTING.md、SUPPORT.md 和 CODE_OF_CONDUCT.md。本项目欢迎小而明确的 bug 修复、文档改进、配置样例优化和测试补充;涉及 ASR、LLM、剪贴板、热键、托盘、日志、统计或配置结构的改动,请在 PR 描述中明确说明影响范围和验证方式。
安全和隐私问题请参考 SECURITY.md。公开 Issue、PR、截图和日志中不要包含真实密钥、识别正文、个人热词、prompt、最近上下文或 Windows 用户名路径。
主窗口按 1280 × 760 设计,最小窗口为 1100 × 680。首页会根据窗口高度和宽度进入紧凑模式,并将语音输入、最近输入/启动方式、输入表现分层展示,避免在高 DPI 或较小窗口中出现文字遮挡、卡片裁切和不必要的滚动条。
界面维护时重点检查这些状态:
首页只展示正式用户信息。不要加入调试路径、协议细节、内部状态码或占位图表。
VoxType/
├── src/ # Svelte 主窗口界面
├── src-tauri/ # Tauri/Rust 桌面端
│ ├── src/
│ │ ├── audio.rs # 麦克风采集
│ │ ├── asr.rs # ASR 请求组装与结果解析
│ │ ├── asr_ws.rs # 豆包 WebSocket 会话
│ │ ├── autostart.rs # Windows 开机自启动
│ │ ├── config.rs # TOML 配置加载
│ │ ├── hotkey.rs # 全局热键与输入钩子
│ │ ├── llm_post_edit.rs # LLM 后处理
│ │ ├── overlay.rs # 悬浮字幕窗
│ │ ├── session.rs # 录音会话状态机
│ │ ├── stats.rs # 使用统计
│ │ ├── system_audio.rs # 系统音量控制
│ │ ├── text_output.rs # 剪贴板与粘贴
│ │ ├── tray.rs # 系统托盘
│ │ └── update.rs # GitHub Release 更新检查
│ ├── capabilities/
│ ├── icons/
│ └── tauri.conf.json
├── static/ # 静态资源
├── docs/ # 接口参考文档
├── scripts/
│ ├── enable_git_hooks.ps1
│ └── scan-secrets.mjs
├── config.example.toml # 配置模板,不含真实密钥
├── package.json
├── svelte.config.js
├── tsconfig.json
└── vite.config.js
以下文件只用于本机运行,不提交:
config.toml*.local.tomlcontext/recent_context.jsonlvoice_input.logvoice_input_stats.jsonlsrc-tauri/target/node_modules/build/