功能: - Tauri v2 GUI 应用 - 系统托盘支持 - 日志输出到文件 - 带时间戳的版本号 - 前端资源嵌入 修复: - 前端路径使用相对路径 - 移除 devUrl 配置 - 窗口置顶设置
485 lines
24 KiB
Markdown
485 lines
24 KiB
Markdown
# 项目需求文档 (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*
|
||
*项目状态:规划阶段*
|