# 项目需求文档 (PRD) ## impress_asr_input_rust --- ## 1. 项目概述 ### 1.1 项目名称 **impress_asr_input_rust** ### 1.2 项目定位 一款高性能、跨平台的桌面语音识别输入工具,采用纯 Rust 技术栈实现,提供低延迟的语音转文字体验。 ### 1.3 核心价值主张 - 🚀 **极速识别**:1 秒内完成语音识别响应 - 🦀 **纯 Rust 实现**:高性能、内存安全、无外部依赖 - 🖥️ **全平台支持**:Windows、Linux、macOS 统一体验 - 🎯 **用户友好**:完整的图形界面和系统托盘集成 --- ## 2. 功能需求 ### 2.1 核心功能 #### 2.1.1 语音录制与识别 | 功能点 | 描述 | 优先级 | |--------|------|--------| | 一键录音 | 点击按钮即可开始/停止录音 | P0 | | 实时波形显示 | 录音时显示音频波形可视化 | P1 | | 自动识别 | 录音停止后自动触发识别 | P0 | | 识别结果显示 | 实时展示识别出的文字 | P0 | | 结果复制 | 一键复制识别结果到剪贴板 | P1 | | 历史记录 | 保存识别历史记录 | P2 | #### 2.1.2 音频文件识别 | 功能点 | 描述 | 优先级 | |--------|------|--------| | 文件选择 | 支持拖拽和文件选择器导入音频 | P0 | | 格式支持 | 支持 WAV、MP3、FLAC、OGG 等格式 | P0 | | 批量处理 | 支持批量导入多个音频文件 | P2 | | 进度显示 | 显示识别进度和预计剩余时间 | P1 | | 导出结果 | 支持导出为 TXT、SRT 字幕格式 | P1 | #### 2.1.3 配置管理 | 功能点 | 描述 | 优先级 | |--------|------|--------| | 模型选择 | 选择/切换 ONNX 语音识别模型 | P0 | | 语言设置 | 设置识别语言(中文、英文等) | P0 | | 麦克风选择 | 选择输入音频设备 | P0 | | 快捷键配置 | 自定义全局快捷键 | P1 | | 主题设置 | 深色/浅色主题切换 | P2 | ### 2.2 系统托盘功能 | 功能点 | 描述 | 优先级 | |--------|------|--------| | 托盘图标 | 显示应用状态图标 | P0 | | 快速菜单 | 右键菜单提供常用功能 | P0 | | 状态指示 | 显示录音/识别状态 | P1 | | 全局快捷键 | 后台监听录音快捷键 | P1 | --- ## 3. 技术架构 ### 3.1 技术栈选型 ``` ┌─────────────────────────────────────────────────────────────┐ │ 用户界面层 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Tauri v2 + React/TypeScript │ │ │ │ (或纯 Rust: Iced/Slint) │ │ │ └─────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 应用逻辑层 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Rust 业务逻辑层 │ │ │ │ - 状态管理 - 配置管理 - 任务调度 │ │ │ └─────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 核心服务层 │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 音频服务 │ │ 识别服务 │ │ 系统服务 │ │ │ │ cpal/rodio │ │ ort/onnxruntime │ tray/icon │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 模型层 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ ONNX 模型 (SenseVoice/FunASR 等) │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### 3.2 核心依赖清单 | 类别 | Crate | 用途 | |------|-------|------| | **UI 框架** | `tauri` v2 | 跨平台桌面应用框架 | | **UI 框架 (备选)** | `iced` / `slint` | 纯 Rust GUI 方案 | | **音频输入** | `cpal` | 跨平台音频输入/输出 | | **音频解码** | `rodio` | 音频文件解码播放 | | **音频处理** | `hound` | WAV 文件读写 | | **ONNX 推理** | `ort` / `onnxruntime` | ONNX 模型推理引擎 | | **张量处理** | `ndarray` | 多维数组运算 | | **系统托盘** | `tauri-plugin-tray` | 系统托盘支持 | | **快捷键** | `global-hotkey` | 全局快捷键监听 | | **配置管理** | `serde` + `toml` | 配置文件序列化 | | **日志** | `tracing` + `tracing-subscriber` | 结构化日志 | | **异步运行时** | `tokio` | 异步任务执行 | ### 3.3 推荐的 ONNX 模型 | 模型 | 语言支持 | 大小 | 特点 | |------|----------|------|------| | **SenseVoice** | 中/英/日/韩 | ~100MB | 阿里达摩院,高精度,支持情感识别 | | **FunASR Paraformer** | 中/英 | ~60MB | 阿里,流式识别,低延迟 | | **Whisper (ONNX 版)** | 多语言 | ~40MB-1GB | OpenAI,多语言支持好 | **推荐首选**: SenseVoice Small 版本,在速度和精度间取得良好平衡 --- ## 4. 性能要求 ### 4.1 延迟指标 | 场景 | 目标 | 可接受上限 | |------|------|------------| | 录音启动延迟 | < 100ms | < 200ms | | 识别响应延迟 (5 秒音频) | < 500ms | < 1s | | 识别响应延迟 (30 秒音频) | < 2s | < 5s | | 界面响应帧率 | 60 FPS | > 30 FPS | | 应用启动时间 | < 2s | < 5s | ### 4.2 资源占用 | 指标 | 空闲状态 | 录音状态 | 识别状态 | |------|----------|----------|----------| | 内存占用 | < 100MB | < 150MB | < 500MB | | CPU 占用 | < 1% | < 5% | < 30% | ### 4.3 优化策略 1. **模型量化**: 使用 INT8 量化模型减少推理时间 2. **模型预加载**: 应用启动时预加载模型到内存 3. **流式识别**: 支持边录音边识别,减少等待时间 4. **音频分片**: 长音频分段并行处理 5. **GPU 加速**: 支持 CUDA/DirectML 后端加速 --- ## 5. 用户界面设计 ### 5.1 页面结构 ``` ┌─────────────────────────────────────────────────────────┐ │ impress_asr_input_rust □ ○ × │ ├─────────────────────────────────────────────────────────┤ │ ┌─────────┬─────────────────────────────────────────┐ │ │ │ │ │ │ │ │ 侧边 │ 主内容区域 │ │ │ │ 导航 │ │ │ │ │ │ ┌─────────────────────────────────┐ │ │ │ │ 🎙️ │ │ │ │ │ │ │ 录音 │ │ 录音/识别测试 │ │ │ │ │ │ │ │ │ │ │ │ 📁 │ └─────────────────────────────────┘ │ │ │ │ 文件 │ │ │ │ │ │ │ │ │ │ ⚙️ │ │ │ │ │ 设置 │ │ │ │ │ │ │ │ │ └─────────┴─────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` ### 5.2 录音识别测试页面 ``` ┌─────────────────────────────────────────────────────────┐ │ 录音识别测试 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────┐ │ │ │ ╭────╮ │ │ │ │ ╱ ╲ 波形可视化 │ │ │ │ │ ▓▓ │ ~~~~~~~~~ │ │ │ │ ╲ ╱ │ │ │ │ ╰────╯ │ │ │ └─────────────────────────────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ 🎤 录音 │ │ ⏹ 停止 │ │ │ └──────────┘ └──────────┘ │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 识别结果: │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ 这里是识别出的文字内容... │ │ │ │ │ │ │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ [📋 复制] [🗑️ 清除] [💾 保存] │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ 状态:就绪 | 时长:00:00 | 模型:SenseVoice-ZH │ └─────────────────────────────────────────────────────────┘ ``` ### 5.3 文件识别转文字页面 ``` ┌─────────────────────────────────────────────────────────┐ │ 文件识别转文字 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 📁 拖拽音频文件到此处,或点击选择文件 │ │ │ │ 支持:WAV, MP3, FLAC, OGG, M4A │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ 文件列表: │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 📄 meeting_20240115.wav 待处理 [开始] │ │ │ │ 📄 voice_note_001.mp3 ✓ 已完成 [查看] │ │ │ │ 📄 interview.flac 处理中 50% [取消] │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ [批量开始] [批量导出] [清空列表] │ │ │ └─────────────────────────────────────────────────────────┘ ``` ### 5.4 功能配置页面 ``` ┌─────────────────────────────────────────────────────────┐ │ 设置 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ── 识别模型 ─────────────────────────────────────── │ │ 模型选择:[SenseVoice Small ▼] [下载更多模型] │ │ 识别语言:[中文普通话 ▼] │ │ 使用 GPU 加速:☐ 启用 │ │ │ │ ── 音频输入 ─────────────────────────────────────── │ │ 麦克风:[Built-in Microphone ▼] │ │ 采样率:[16000 Hz ▼] │ │ 声道:[单声道 ▼] │ │ │ │ ── 快捷键 ───────────────────────────────────────── │ │ 开始/停止录音:[Ctrl+Shift+R] [修改] │ │ 快速复制结果:[Ctrl+Shift+C] [修改] │ │ 显示/隐藏窗口:[Ctrl+Shift+H] [修改] │ │ │ │ ── 外观 ─────────────────────────────────────────── │ │ 主题:[深色 ▼] │ │ 语言:[简体中文 ▼] │ │ │ │ ── 其他 ─────────────────────────────────────────── │ │ 开机自启:☐ │ │ 自动检查更新:☑ │ │ 保存识别历史:☑ 保留天数:[30] 天 │ │ │ │ [保存设置] [重置默认] │ └─────────────────────────────────────────────────────────┘ ``` ### 5.5 系统托盘菜单 ``` ╭────────────────────────────────────╮ │ 🎤 开始录音 │ │ ───────────────────────────────── │ │ 📂 打开文件识别... │ │ 📋 复制上次结果 │ │ 📜 查看历史记录 │ │ ───────────────────────────────── │ │ ⚙️ 设置 │ │ ❌ 退出 │ ╰────────────────────────────────────╯ ``` --- ## 6. 项目结构 ``` impress_asr_input_rust/ ├── Cargo.toml ├── README.md ├── PRD.md ├── .gitignore ├── ├── ├── src/ │ ├── main.rs # 应用入口 │ ├── lib.rs # 库导出 │ ├── │ ├── app/ # Tauri 应用层 │ │ ├── mod.rs │ │ ├── main.rs # Tauri 主程序 │ │ ├── commands.rs # Tauri 命令处理 │ │ └── state.rs # 应用状态管理 │ │ │ ├── audio/ # 音频处理模块 │ │ ├── mod.rs │ │ ├── capture.rs # 音频捕获 │ │ ├── decoder.rs # 音频解码 │ │ ├── processor.rs # 音频预处理 │ │ └── resampler.rs # 音频重采样 │ │ │ ├── asr/ # 语音识别核心 │ │ ├── mod.rs │ │ ├── engine.rs # 识别引擎 │ │ ├── model.rs # ONNX 模型加载 │ │ ├── decoder.rs # 识别结果解码 │ │ └── stream.rs # 流式识别 │ │ │ ├── ui/ # UI 组件 (如使用 Iced) │ │ ├── mod.rs │ │ ├── views/ │ │ │ ├── mod.rs │ │ │ ├── record.rs # 录音页面 │ │ │ ├── file.rs # 文件识别页面 │ │ │ └── settings.rs # 设置页面 │ │ ├── components/ │ │ │ ├── mod.rs │ │ │ ├── waveform.rs # 波形组件 │ │ │ └── player.rs # 播放器组件 │ │ └── theme.rs # 主题样式 │ │ │ ├── config/ # 配置管理 │ │ ├── mod.rs │ │ ├── settings.rs # 设置结构 │ │ └── manager.rs # 配置管理器 │ │ │ ├── tray/ # 系统托盘 │ │ ├── mod.rs │ │ └── handler.rs # 托盘事件处理 │ │ │ └── utils/ # 工具函数 │ ├── mod.rs │ ├── logger.rs # 日志工具 │ └── hotkey.rs # 快捷键处理 │ ├── models/ # ONNX 模型目录 │ └── sensevoice-small.onnx │ ├── web/ # Tauri 前端 (如使用 Tauri) │ ├── package.json │ ├── vite.config.ts │ ├── index.html │ └── src/ │ ├── main.tsx │ ├── App.tsx │ ├── pages/ │ │ ├── Record.tsx │ │ ├── FileConvert.tsx │ │ └── Settings.tsx │ └── components/ │ └── resources/ ├── icons/ │ ├── icon.ico │ ├── icon.png │ └── tray-icon.png ├── locales/ │ ├── zh-CN.ftl │ └── en-US.ftl └── configs/ └── default.toml ``` --- ## 7. 开发里程碑 ### Phase 1: 基础框架 (2 周) - [ ] 项目初始化,Cargo 配置 - [ ] Tauri/TSD 应用框架搭建 - [ ] 基础 UI 页面框架 - [ ] 配置管理模块 - [ ] 日志系统 ### Phase 2: 音频核心 (2 周) - [ ] 音频捕获 (cpal) - [ ] 音频格式解码 (rodio/hound) - [ ] 音频预处理 (重采样、归一化) - [ ] 波形可视化组件 ### Phase 3: ASR 集成 (2 周) - [ ] ONNX Runtime 集成 (ort) - [ ] SenseVoice 模型加载 - [ ] 识别推理管道 - [ ] 结果后处理 ### Phase 4: 功能完善 (2 周) - [ ] 文件识别功能 - [ ] 系统托盘集成 - [ ] 全局快捷键 - [ ] 历史记录管理 ### Phase 5: 优化与发布 (1 周) - [ ] 性能优化 (延迟、内存) - [ ] 多平台测试 - [ ] 安装包制作 - [ ] 文档完善 --- ## 8. 交付物 ### 8.1 软件交付 - Windows: `.msi` / `.exe` 安装程序 - macOS: `.dmg` / `.app` 安装包 - Linux: `.deb` / `.rpm` / AppImage ### 8.2 代码交付 - 完整的源代码 (GitHub 仓库) - Cargo 文档 (`cargo doc`) - 开发者文档 ### 8.3 用户文档 - README.md (使用指南) - 用户手册 - FAQ --- ## 9. 风险与缓解 | 风险 | 影响 | 概率 | 缓解措施 | |------|------|------|----------| | ONNX 模型推理速度慢 | 高 | 中 | 模型量化、GPU 加速、选择更轻量模型 | | 跨平台音频 API 兼容性 | 中 | 中 | 充分测试各平台,使用成熟的 cpal 库 | | Tauri v2 稳定性 | 中 | 低 | 准备 Iced 备选方案 | | 模型文件过大 | 低 | 高 | 首次启动下载,提供多个模型尺寸选择 | --- ## 10. 成功标准 ### 技术指标 - [ ] 5 秒语音识别延迟 < 1 秒 - [ ] 应用启动时间 < 2 秒 - [ ] 内存占用 < 500MB (识别中) - [ ] 识别准确率 > 90% (标准普通话) ### 用户体验指标 - [ ] 一键录音,无需复杂配置 - [ ] 界面响应流畅,无明显卡顿 - [ ] 三平台功能一致 ### 工程指标 - [ ] 代码测试覆盖率 > 60% - [ ] CI/CD 自动化构建 - [ ] 完整的错误处理和日志 --- ## 附录 ### A. 参考项目 - [whisper.cpp](https://github.com/ggerganov/whisper.cpp) - C/C++ 实现参考 - [FunASR](https://github.com/alibaba-damo-academy/FunASR) - 阿里开源 ASR - [SenseVoice](https://github.com/FunAudioLLM/SenseVoice) - 多语言语音识别模型 ### B. 相关 Rust 项目 - [rust-onnxruntime](https://github.com/niclanic/rust-onnxruntime) - [cpal](https://github.com/RustAudio/cpal) - [tauri](https://github.com/tauri-apps/tauri) ### C. 版本历史 | 版本 | 日期 | 描述 | |------|------|------| | v0.1 | 2026-05-20 | 初始 PRD 版本 | --- *文档创建:2026-05-20* *项目状态:规划阶段*