# Impress Voice Input — 产品需求文档 (PRD)

## 1. 项目概述

**项目名称**: Impress Voice Input
**项目类型**: 基于 ONNX 的实时语音转文本输入法
**技术栈**: C++ / ONNX Runtime / Qt (跨平台GUI)

### 1.1 项目目标

开发一款跨平台的实时语音输入法，利用 ONNX 推理引擎运行语音转文本 (STT) 模型，提供低延迟、高准确率的语音输入体验。应用集成前后端于一体，包含实时语音识别、音频文件转写和模型配置三大核心功能。

### 1.2 目标平台

- Windows 10/11
- macOS 12+
- Linux (Ubuntu 20.04+)

---

## 2. 技术架构

### 2.1 整体架构

```
┌─────────────────────────────────────────────────┐
│                  Qt GUI 前端                     │
│  ┌──────────┐  ┌──────────────┐  ┌───────────┐  │
│  │ STT测试页 │  │ 音频文件转写页 │  │  配置页面  │  │
│  └────┬─────┘  └──────┬───────┘  └─────┬─────┘  │
│       │               │                │         │
│  ┌────▼───────────────▼────────────────▼─────┐  │
│  │          统一事件总线 / 消息队列            │  │
│  └────────────────────┬──────────────────────┘  │
└───────────────────────┼─────────────────────────┘
                        │
┌───────────────────────▼─────────────────────────┐
│                 C++ 后端服务层                    │
│  ┌────────────┐  ┌──────────────┐  ┌─────────┐  │
│  │ 音频采集模块 │  │ 音频文件解码  │  │ 配置管理 │  │
│  │ (PortAudio) │  │ (dr_libs)    │  │ (INI/JSON)│
│  └─────┬──────┘  └──────┬───────┘  └────┬────┘  │
│        │                │               │        │
│  ┌─────▼────────────────▼───────────────▼──────┐│
│  │          STT 推理引擎 (ONNX Runtime)         ││
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ││
│  │  │ 音频预处理│  │ ONNX推理 │  │ 后处理/CTC│  ││
│  │  └──────────┘  └──────────┘  └──────────┘  ││
│  └─────────────────────────────────────────────┘│
└─────────────────────────────────────────────────┘
```

### 2.2 技术选型

| 组件 | 选型 | 说明 |
|------|------|------|
| **GUI 框架** | Qt 6 | 成熟跨平台，原生性能，丰富的控件生态 |
| **STT 推理引擎** | ONNX Runtime (C++ API) | 跨平台推理，支持 CPU/GPU 加速 |
| **音频采集** | PortAudio | 轻量级跨平台音频 I/O 库 |
| **音频解码** | dr_libs (dr_wav/dr_mp3/dr_flac) | 单头文件，支持 WAV/MP3/FLAC |
| **模型格式** | Whisper / Paraformer ONNX | 主流开源 STT 模型导出格式 |
| **构建系统** | CMake 3.20+ | 跨平台标准构建工具 |
| **配置存储** | nlohmann/json | JSON 格式配置文件 |
| **线程模型** | Qt Concurrent + 独立工作线程 | UI 线程与推理线程分离 |

---

## 3. 功能需求

### 3.1 STT 测试页面（实时语音识别）

**功能描述**: 实时采集麦克风音频流，流式输出识别文本。

| 功能项 | 详细说明 | 优先级 |
|--------|----------|--------|
| 麦克风选择 | 下拉列表选择输入设备，显示采样率等信息 | P0 |
| 开始/停止录音 | 按钮控制录音状态，带明显视觉反馈 | P0 |
| 实时文本显示 | 滚动文本区域实时显示识别结果 | P0 |
| 流式/非流式切换 | 支持流式（逐字输出）和整句输出两种模式 | P0 |
| 置信度显示 | 显示每句识别的置信度分数 | P1 |
| 延迟指示 | 显示端到端识别延迟（毫秒） | P1 |
| 波形可视化 | 实时音频波形图展示 | P2 |
| 文本复制/导出 | 一键复制识别文本或导出为 TXT 文件 | P1 |
| 多语言切换 | 运行时切换识别语言 | P1 |

### 3.2 音频文件转写页面

**功能描述**: 导入音频文件，批量转写为文本。

| 功能项 | 详细说明 | 优先级 |
|--------|----------|--------|
| 文件选择 | 支持拖拽或文件选择器导入音频文件 | P0 |
| 支持的格式 | WAV, MP3, FLAC, OGG, AAC | P0 |
| 批量处理 | 支持添加多个文件到队列，按序处理 | P1 |
| 进度显示 | 文件转写进度条、百分比、预计剩余时间 | P0 |
| 结果展示 | 分段显示转写文本，带时间戳 | P0 |
| 结果导出 | 导出为 TXT / SRT (字幕) / JSON 格式 | P0 |
| 断点续传 | 中断后可从断点继续 | P2 |
| 文件信息 | 显示音频文件的时长、采样率、声道数 | P1 |

### 3.3 配置页面

**功能描述**: 管理模型路径、推理参数和应用设置。

| 功能项 | 详细说明 | 优先级 |
|--------|----------|--------|
| 模型路径配置 | 设置 ONNX 模型文件路径（支持相对/绝对路径） | P0 |
| 模型类型选择 | 选择 Whisper / Paraformer / 其他 | P0 |
| 推理设备选择 | CPU / GPU (CUDA / CoreML / DirectML) | P0 |
| 线程数配置 | 设置 ONNX 推理线程数 | P0 |
| 采样率配置 | 设置输入音频采样率（默认 16000Hz） | P0 |
| 语言设置 | 默认识别语言 | P0 |
| 音频输入设备 | 默认麦克风选择 | P1 |
| 快捷键设置 | 全局语音激活快捷键配置 | P1 |
| 配置文件导入/导出 | 备份和恢复配置 | P1 |
| 参数调优 | 温度、top-p、beam size 等高级参数 | P2 |
| 配置持久化 | 自动保存到配置文件 | P0 |

---

## 4. 非功能需求

### 4.1 性能指标

| 指标 | 目标值 |
|------|--------|
| 实时识别延迟 | < 300ms (端到端，从语音结束到文本输出) |
| 首字延迟 | < 150ms (流式模式) |
| CPU 占用 | < 30% (单核, Intel i5 级别 CPU) |
| 内存占用 | < 500MB (含模型加载) |
| 音频缓冲区延迟 | < 20ms |

### 4.2 兼容性

- ONNX Runtime ≥ 1.16
- Qt ≥ 6.5
- CMake ≥ 3.20
- 支持的模型: Whisper (small/medium), Paraformer, 其他兼容 CTC 的模型

### 4.3 安全与隐私

- 所有推理均在本地执行，不上传任何音频数据到云端
- 配置文件中敏感路径使用相对路径

---

## 5. 项目结构

```
impress_voice_input/
├── PRD.md                          # 产品需求文档
├── CMakeLists.txt                  # 顶层 CMake 配置
├── README.md                       # 项目说明
├── cmake/                          # CMake 模块
│   ├── FindPortAudio.cmake
│   ├── FindOnnxRuntime.cmake
│   └── dependencies.cmake
├── src/
│   ├── main.cpp                    # 入口
│   ├── app/
│   │   ├── application.h/cpp       # QApplication 封装
│   │   └── config_manager.h/cpp    # 配置管理
│   ├── core/
│   │   ├── stt_engine.h/cpp        # STT 推理引擎 (ONNX)
│   │   ├── audio_processor.h/cpp   # 音频预处理 (重采样/归一化)
│   │   ├── decoder.h/cpp           # CTC/自回归解码器
│   │   └── tokenizer.h/cpp         # Tokenizer (BPE/Char)
│   ├── audio/
│   │   ├── audio_capture.h/cpp     # 麦克风采集 (PortAudio)
│   │   ├── audio_decoder.h/cpp     # 文件解码 (dr_libs)
│   │   └── audio_ring_buffer.h/cpp # 环形缓冲区
│   ├── ui/
│   │   ├── main_window.h/cpp       # 主窗口 (Tab/侧边栏导航)
│   │   ├── stt_test_page.h/cpp     # STT 测试页面
│   │   ├── file_transcribe_page.h/cpp  # 文件转写页面
│   │   ├── settings_page.h/cpp     # 配置页面
│   │   ├── widgets/
│   │   │   ├── audio_waveform.h/cpp    # 波形控件
│   │   │   ├── text_output.h/cpp       # 文本输出控件
│   │   │   └── progress_panel.h/cpp    # 进度面板
│   │   ├── resources/
│   │   │   ├── icons/
│   │   │   └── styles/
│   │   │       └── main.qss
│   │   └── main_window.ui          # Qt Designer UI
│   └── utils/
│       ├── logger.h/cpp
│       ├── timer.h/cpp
│       └── string_utils.h/cpp
├── models/                         # 模型存放目录 (gitignore)
│   └── .gitkeep
├── configs/
│   └── default_config.json         # 默认配置
├── tests/
│   ├── test_stt_engine.cpp
│   ├── test_audio_processor.cpp
│   └── test_config_manager.cpp
└── third_party/                    # 第三方依赖
    ├── onnxruntime/
    ├── portaudio/
    ├── dr_libs/
    └── nlohmann_json/
```

---

## 6. 开发里程碑

### Phase 1: 基础框架 (Week 1-2)
- [ ] CMake 项目搭建，依赖集成
- [ ] Qt 主窗口框架，三页面导航
- [ ] 配置管理模块
- [ ] 配置页面 UI 开发

### Phase 2: 音频与推理核心 (Week 3-4)
- [ ] ONNX Runtime 集成，模型加载与推理
- [ ] 音频预处理模块（重采样、归一化、分帧）
- [ ] PortAudio 麦克风采集
- [ ] 音频文件解码模块

### Phase 3: STT 测试页面 (Week 5-6)
- [ ] 实时音频流接入推理引擎
- [ ] 流式识别与文本输出
- [ ] UI 交互完善

### Phase 4: 文件转写页面 (Week 7)
- [ ] 文件选择与批量队列
- [ ] 转写进度管理
- [ ] 结果导出 (TXT/SRT)

### Phase 5: 优化与测试 (Week 8)
- [ ] 性能优化（延迟、内存）
- [ ] 跨平台兼容性测试
- [ ] Bug 修复与 UI 打磨
- [ ] 打包发布

---

## 7. 风险与缓解

| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| ONNX 模型兼容性问题 | 无法加载模型 | 明确支持的模型列表，提供模型转换工具说明 |
| GPU 加速驱动依赖 | 部分用户无法使用 GPU | CPU 推理作为降级方案，确保 CPU 性能可接受 |
| Qt 跨平台差异 | 各平台表现不一致 | 早期进行三平台测试，使用 Qt 抽象层 |
| 大模型内存占用高 | 低端设备运行困难 | 提供 small 模型默认选项，支持模型卸载 |

---

## 8. 附录

### 8.1 参考项目
- whisper.cpp (GGML 实现，参考模型结构)
- faster-whisper (CTranslate2 实现，参考优化策略)
- onnxruntime examples (ONNX 推理示例)

### 8.2 术语表
| 术语 | 说明 |
|------|------|
| STT | Speech-to-Text，语音转文本 |
| ONNX | Open Neural Network Exchange，开放神经网络交换格式 |
| CTC | Connectionist Temporal Classification，连接时序分类 |
| 流式识别 | 边说话边输出文本，而非说完后一次性输出 |
| BPE | Byte Pair Encoding，字节对编码分词方法 |
