# op-input **Repository Path**: hnwlc/op-input ## Basic Information - **Project Name**: op-input - **Description**: AI语音输入法客户端,支持本地和云ASR,支持AI润色 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-06-08 - **Last Updated**: 2026-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OP速记 AI 语音输入法 Windows 客户端。一键语音输入,实时转文字,自动粘贴到当前光标位置。 支持腾讯云、阿里云百炼、火山引擎三种云端 ASR,可配置本地 LLM 润色(支持 API Key 认证与长文本分块)。音频通过麦克风实时采集,VAD 本地切分,转录引擎可选云服务或自建私有服务。 **项目状态:** Phase 2 完成 — 可日常使用 --- ## 截图 ``` ┌──────────────────────────────┐ ┌─── 设置 · OP速记 ────────────┐ │ ● 录音中 00:23 │ │ [✓云服务直连] [私有服务] │ │ ▂▄▆▇▆▄▂▄▆▇ │ │ [腾讯云 ▼] │ │ ✓ 今天下午三点的会议改到 │ │ API Key [••••••••••••••] │ │ 明天上午了。 │ │ ● 服务已连接 │ │ ✓ 张翠山说鲲鹏项目的预算 │ │ ───────────────────────── │ │ 已经批下来了。 │ │ 启用 LLM 润色 [🔵] │ │ ~ 下周需要和腾讯云对接 │ │ API: qwen2.5:7b │ │ │ │ ───────────────────────── │ │ 再按右 Alt 停止 [■ 停止]│ │ 热键: [右 Alt 🖊] │ └──────────────────────────────┘ │ 词库: 张翠山 鲲鹏项目 │ 录音浮层 │ [保存] │ └───────────────────────────┘ 设置弹窗 ``` ## 功能 | 功能 | 说明 | |------|------| | 🎤 **全局热键录音** | 默认右 Alt,支持自定义组合键(Ctrl+Alt+F2 等) | | 🎙️ **麦克风采集** | 直接通过麦克风实时录音,非系统音频环回 | | 🧠 **本地 VAD 切分** | Silero VAD 实时检测语音起止,智能分段 | | ⚡ **流式 ASR** | WebSocket 直连云服务,实时返回识别结果(腾讯云/阿里云百炼/火山引擎) | | ✨ **LLM 润色** | 可选 AI 润色(Ollama / OpenAI 兼容),支持 API Key 认证与 5000 字自动分块 | | 📋 **自动粘贴** | 识别完成后自动 Ctrl+V 粘贴到当前窗口 | | 📚 **用户词库** | 自定义热词注入 ASR,提高识别率 | | 🔒 **隐私可控** | 录音本地处理,ASR 可选云服务或自建服务 | | 🖼️ **自定义图标** | 托盘与任务栏自定义应用图标 | | 📝 **日志系统** | Serilog 文件日志,按天滚动保留 7 天 | | 🔧 **配置导入导出** | JSON 格式备份和恢复所有设置 + 词库 | ## 快速开始 ### 1. 环境要求 - Windows 10+ - [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) - 一个云 ASR 服务账号(任选其一): - [腾讯云语音识别](https://cloud.tencent.com/product/asr) - [阿里云百炼](https://help.aliyun.com/zh/model-studio/asr-model/) - [火山引擎豆包语音](https://www.volcengine.com/docs/6561/1354869) ### 2. 下载 VAD 模型 Silero VAD ONNX 模型用于本地语音活动检测(约 90MB): ```powershell # 自动下载 cd scripts ./download-vad-model.ps1 ``` 或手动下载到 `models/` 目录: https://github.com/snakers4/silero-vad/raw/master/files/silero_vad.onnx ### 3. 开发 ```bash # 还原 dotnet restore # 构建 dotnet build # 运行 dotnet run --project src/OPSpeed # 测试 dotnet test ``` ### 4. 打包 ```powershell # 一键构建(还原→构建→测试→发布) cd scripts ./build.ps1 # 或使用 bat 脚本 .\scripts\build.bat # 或手动 dotnet publish src/OPSpeed/OPSpeed.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o dist ``` ### 5. 配置 首次运行后右键系统托盘图标 → 设置: 1. **语音服务** — 选择厂商并填写 API Key 2. **AI 润色** — 填写 LLM 地址(如 `http://localhost:11434/v1`)和模型名 3. **常规** — 设置用户名、自定义热键 4. **词库管理** — 添加常见人名、项目名等热词 ## 架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ OP速记 Windows Tray │ │ .NET 8 + C# WPF │ │ │ │ 系统托盘常驻 │ │ ┌────────────────┐ ┌──────────────────┐ │ │ │ HotkeyService │────▶ AudioCapture │ │ │ │ (User32 热键) │ │ (NAudio 麦克风) │ │ │ └────────────────┘ └────────┬─────────┘ │ │ │ PCM 16kHz │ │ ▼ │ │ ┌────────────────┐ ┌──────────────────┐ │ │ │ Serilog 日志 │ │ VadService │ │ │ │ (%APPDATA%/log) │ │ (Silero ONNX) │ │ │ └────────────────┘ └────────┬─────────┘ │ │ │ 音频段 │ │ ▼ │ │ ┌──────────────────────────────────────────┐ │ │ │ AsrService (WebSocket) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ 腾讯云 │ │ 阿里云 │ │ 火山引擎 │ │ │ │ │ │ HMAC-SHA1│ │ Bearer │ │ Header │ │ │ │ │ │ +热词注入 │ │ │ │ │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └──────────────────┬───────────────────────┘ │ │ │ 流式文本 │ │ ▼ │ │ ┌────────────────┐ ┌──────────────────┐ │ │ │ OverlayWindow │ │ LlmService │ │ │ │ (浮层+标题栏) │ │ (HttpClient) │ │ │ │ (重置/关闭按钮) │ │ (API Key 认证) │ │ │ └────────────────┘ │ (5000字分块) │ │ │ └──────────────────┘ │ │ │ │ ┌────────────────┐ ┌──────────────────┐ │ │ │ ClipboardService│ │ ConfigService │ │ │ │ (粘贴+复制) │ │ (JSON + SQLite) │ │ │ └────────────────┘ └──────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ SettingsWindow (模态设置弹窗) │ │ │ │ 语音服务|AI润色|常规|词库管理|导入导出 │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ## 完整工作流 ``` 按右 Alt │ ▼ 弹出浮层 + 开始录音 │ ▼ VAD 实时检测 → 每 30ms 判断说话/静音 │ ├── 说话中 → 缓存音频 → 推送到 ASR WebSocket │ ↓ │ 收到 partial 结果 → 浮层实时更新 │ ├── 450ms 静音 → 段结束 → ASR 返回 final 结果 │ ↓ │ 浮层追加完成句子 + 追加到全文 │ └── [循环直到再按右 Alt] │ ▼ 停止录音 │ ├── LLM 润色(可选)→ 润色全文 ├── 复制到剪贴板 ├── 模拟 Ctrl+V 粘贴到当前窗口 └── 3 秒后浮层自动收起 ``` ## 项目结构 ``` op-input/ ├── OPSpeed.sln ├── src/ │ ├── OPSpeed/ # WPF 主项目 │ │ ├── App.xaml / .cs # 应用入口 + Serilog 初始化 │ │ ├── MainWindow.xaml / .cs # 隐藏宿主窗口 + 服务编排 │ │ │ │ │ ├── Windows/ │ │ │ ├── OverlayWindow.* # 录音浮层(透明置顶,含标题栏按钮) │ │ │ └── SettingsWindow.* # 设置弹窗(模态) │ │ │ │ │ ├── ViewModels/ │ │ │ ├── OverlayViewModel.cs # 浮层状态机 │ │ │ └── SettingsViewModel.cs # 设置数据映射 │ │ │ │ │ ├── Services/ │ │ │ ├── HotkeyService.cs # 全局热键 (User32) │ │ │ ├── TrayService.cs # 系统托盘 (NotifyIcon) │ │ │ ├── AudioCaptureService # 麦克风录音 (NAudio) │ │ │ ├── VadService.cs # VAD 切分 (Silero ONNX) │ │ │ ├── AsrService.cs # ASR 客户端 (腾讯/阿里/火山/私有) │ │ │ ├── LlmService.cs # LLM 润色 (OpenAI 兼容) │ │ │ ├── ClipboardService.cs # 剪贴板 + 模拟粘贴 │ │ │ ├── ConfigService.cs # 配置 + 词库 (JSON+SQLite) │ │ │ ├── LogService.cs # Serilog 日志 │ │ │ ├── IAsrService.cs # ASR 服务接口 │ │ │ └── VirtualKey.cs # 热键枚举 + HotkeyBinding │ │ │ │ │ ├── Models/ │ │ │ ├── AppConfig.cs # 配置模型 │ │ │ └── VocabEntry.cs # 词库条目 │ │ │ │ │ └── Resources/ │ │ ├── Models/ # ONNX 模型目录 │ │ └── Icons/app.ico # 托盘图标 │ │ │ └── OPSpeed.Tests/ # xUnit 测试项目 │ ├── HotkeyServiceTests.cs │ ├── ConfigServiceTests.cs │ ├── AudioCaptureServiceTests.cs │ ├── VadServiceTests.cs │ ├── AsrServiceTests.cs │ ├── OverlayViewModelTests.cs │ ├── ClipboardServiceTests.cs │ ├── LlmServiceTests.cs │ ├── PipelineTests.cs │ ├── LogServiceTests.cs │ ├── SettingsViewModelTests.cs │ ├── E2ePipelineSimulator.cs │ └── E2eFullPipelineTests.cs │ ├── models/ # VAD ONNX 模型 ├── scripts/ │ ├── build.ps1 # 一键构建 (PowerShell) │ ├── build.bat # 一键构建 (CMD) │ └── download-vad-model.ps1 # VAD 模型下载 ├── docs/ │ ├── opspeed-tray-spec.md # 设计规格 (Markdown) │ └── opspeed-tray-spec.html # 设计规格 (HTML) └── README.md ``` ## 技术栈 | 层级 | 技术 | 用途 | |------|------|------| | 框架 | .NET 8 + WPF | 桌面应用 | | 录音 | NAudio 2.x | 麦克风音频采集 + 重采样 | | VAD | ONNX Runtime + Silero VAD | 本地语音活动检测(30ms 帧,450ms 切分) | | ASR | System.Net.WebSockets | 云端流式语音识别(腾讯/阿里/火山/私有) | | LLM | HttpClient | AI 文本润色(Ollama / OpenAI 兼容,5000 字分块) | | 剪贴板 | User32 P/Invoke | 模拟 Ctrl+V 粘贴 | | 热键 | User32.RegisterHotKey | 全局快捷键 + 组合键 | | 存储 | Microsoft.Data.Sqlite | 词库持久化 | | 配置 | System.Text.Json | JSON 配置 + 导入导出 | | 日志 | Serilog | 文件日志(按天滚动,保留 7 天) | | 测试 | xUnit | 91 个单元 + E2E 测试 | ## 配置存储位置 ``` %AppData%/OPSpeed/ ├── config.json # 用户配置(语言服务、LLM、热键等) ├── vocab.db # 词库 (SQLite) └── logs/ └── opspeed-20260609.log # 运行日志 ``` ## 云 ASR 服务开通 ### 腾讯云 1. 访问 [语音识别控制台](https://console.cloud.tencent.com/asr) 2. 开通服务,获取 `AppId` 和 `SecretKey` 3. 在 OP速记 设置中选择腾讯云并填入凭据 ### 阿里云百炼 1. 访问 [百炼控制台](https://help.aliyun.com/zh/model-studio/getting-started/) 2. 开通模型服务 `fun-asr-realtime`,获取 API Key 3. 在 OP速记 设置中选择阿里云并填入 API Key ### 火山引擎 1. 访问 [豆包语音控制台](https://console.volcengine.com/speech/) 2. 开通流式语音识别,获取 APP Key 3. 在 OP速记 设置中选择火山引擎并填入 APP Key ## 开发路线 - ✅ **Phase 1** — MVP: 热键 → 录音 → VAD → ASR → 粘贴 - ✅ **Phase 2** — 完善: 词库 + 多家 ASR + 热键自定义 + 日志 + 自启 + 导入导出 - ⬜ **Phase 3** — 私有 ASR 服务端 (FastAPI + FunASR) - ⬜ **Phase 4** — 会议录音模式 + Speaker Diarization ## 许可证 Apache 2.0 ## 相关项目 - [ququ](https://github.com/yan5xu/ququ) — 语音输入法灵感来源,Electron + Python + FunASR