docs(README): 新增英文 README,挂上中英文界面截图与演示动图

README.md 改为英文并作为默认入口,中文版移到 README.zh-CN.md,两边互相链接。
截图按 首页 → 语音引擎 → AI 整理 → AI 供应商 → 历史 → 外观 排列,中英文各一套;
图片名统一成 ASCII 短横线形式,省掉 URL 里的 %20 转义。
This commit is contained in:
crosswk committed 2026-08-13 22:11:00 +08:00
1 parent df2e3b4a41
commit 3ceda29e55
22 files changed
+366 -154

No files matched your search

+89 -154
View File
@@ -4,179 +4,127 @@
# SayIt
**随口说,出色写 — 用说话代替打字,AI 实时把口语变成书面表达。**
**Just say it, and write well**
按下快捷键开始说话,再按一次,润色后的文字自动输入到光标位置。
Open-source voice typing for Windows. Hold a shortcut, speak, and release—SayIt transcribes, cleans up, and inserts polished text wherever your cursor is.
[![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](./LICENSE)
[![Windows](https://img.shields.io/badge/Platform-Windows-0078D6?logo=windows)](https://github.com/crosswk/SayIt/releases)
[![Windows](https://img.shields.io/badge/Platform-Windows-0078D6?logo=windows)](https://github.com/crosswk/SayIt/releases/latest)
[![Latest release](https://img.shields.io/github/v/release/crosswk/SayIt?label=release)](https://github.com/crosswk/SayIt/releases/latest)
**[下载客户端](https://github.com/crosswk/SayIt/releases/latest)** · **[网页版体验](https://sayitapp.site)** · **[配置文档](docs/)**
**视频介绍:[我做了一个开源 AI 语音输入法——SayIt](https://www.bilibili.com/video/BV1JLTs6REPU/)**(B 站)
**[Download for Windows](https://github.com/crosswk/SayIt/releases/latest)** · **[Try the web demo](https://sayitapp.site)** · **[简体中文](README.zh-CN.md)**
</div>
---
<div align="center">
<img src="docs/images/readme/screenshot-home.png" width="700" alt="SayIt 主界面">
<img src="docs/images/readme/demo-en.gif" width="820" alt="SayIt in action: pressing the shortcut, speaking, and the cleaned-up text appearing at the cursor">
*主界面 — 统计数据与快捷操作*
<br>
<img src="docs/images/readme/screenshot-appearance.png" width="700" alt="外观配置">
*外观配置 — 多主题切换与悬浮窗自定义*
<br>
<img src="docs/images/readme/screenshot-diagnostics.png" width="700" alt="诊断">
*诊断面板 — 实时运行状态与连接检测*
*Trigger the shortcut, speak, and the cleaned-up text is typed in at your cursor — no window switching.*
</div>
---
## Why SayIt?
## 为什么做 SayIt
Typing is often the slowest part of working with AI. SayIt turns speech into text you can use immediately, while keeping the important choices in your hands:
在 AI 时代,模型的输出 Token 速度越来越快,人却受限于打字速度。特别是和 AI 对话时,说话是非常自然和高效的方式。
- **Voice typing anywhere** — dictate into editors, chat apps, browsers, and other Windows software.
- **Editable AI cleanup** — remove filler words, repair recognition errors, format ideas, or keep a faithful transcript. Every prompt is yours to change.
- **Flexible speech recognition** — use a cloud ASR provider, run a local GGUF model on your own GPU, connect to the public trial server, or host your own backend.
- **English and Chinese interface** — the UI follows your system language and can be switched at any time.
- **Hotwords and per-app rules** — improve names and technical terms, then change cleanup behavior automatically for different apps.
- **Overlay feedback** — a small waveform overlay shows recording state and elapsed time, with optional live captions while you speak.
- **Transparent data flow** — the app shows which mode is active and where audio and text are processed.
- **Local history and diagnostics** — review recordings, re-transcribe them, and collect useful troubleshooting details without guesswork.
我最开始用的是 Typeless,体验确实很好,Typeless 也开启了全民 VibeCoding 语音输入法的时代😁。但用了一段时间发现:价格太贵,AI 润色的 Prompt 不能自定义,有时候我并不想要那么格式化的整理,Typeless 的 AI 整理功能相对激进。
## Choose how it runs
看了一下市面上其他 VibeCoding 出来的语音输入工具,大部分都是个人使用为主,很少有面向团队和企业内部使用的。所以我想做一个既适合个人使用,又可以给团队和企业内部部署的语音输入工具——Prompt 完全可控,部署方式灵活,数据流向透明。
| Mode | Best for | Data flow |
| --- | --- | --- |
| **Local mode** | Privacy and offline use | Speech recognition stays on your PC. With AI cleanup off, nothing leaves the device. |
| **Cloud API mode** | The best balance for personal use | Your PC talks directly to the ASR and AI providers you configure. No SayIt server is involved. |
| **Server mode** | Teams and managed deployments | Audio is processed by a SayIt backend you control—or by the public trial server for a quick start. |
语音输入的核心就两个技术:**语音识别(ASR)** 和 **AI 文本润色**。我基本上测试了市面上开源和闭源的各大语音识别模型,个人大体排名是:
Local recognition ships seven GGUF models, with GPU acceleration when available: Parakeet Unified EN (fastest and most accurate for English), SenseVoice Small, Fun-ASR Nano, Nemotron 3.5 ASR (32 languages), and three Qwen3-ASR sizes. Cloud recognition supports Doubao, Qwen, Xiaomi MiMo, and Groq Whisper; AI cleanup works with DeepSeek, Qwen, Groq, MiMo, Ollama, and any OpenAI-compatible endpoint.
> **豆包 > Typeless ≈ Qwen3-ASR > FunASR-Nano2512 >= FireRedASR2 > Whisper**
## A closer look
中文语音识别,豆包实际测试效果非常好,用手机上的豆包输入法就能很好地感受出来。豆包悄悄话的识别是断层领先的——我很多场景都是小声说话,毕竟工位上也不太好和 AI 大声聊天。
<div align="center">
SayIt 后端部署使用的是 Qwen3-ASR,效果仅次于豆包,开源模型里算是最好的选择。如果是自己部署后端在公司内部使用,我使用 vLLM 为 Qwen-ASR 的推理速度做了优化,能够更快的进行推理识别。
<img src="docs/images/readme/home-en.png" width="760" alt="SayIt home screen showing dictation stats and a feedback box">
> 我大大低估了 VibeCoding 想要产品化的难度。这个软件最初的形态大概 2~3 天就弄出来了,但想要公开给大家使用,耗费了 x50 倍的时间和精力。软件叫什么名字、Logo 怎么设计、前端样式是否好看、用户如何提交反馈、如何捕获报错信息、服务器端多用户多并发、如何加快识别速度……每一个场景都是可以持续优化。
*Home — dictation stats, the active shortcut, and a feedback box that carries your last transcript.*
这是一个开源项目,我没有准备用它盈利。做这个纯粹是我个人对语音输入的需求很强,而且现在 AI 极大地放大了个人的能力。如果你觉得这个产品好用,可以点一个 ⭐ Star,这会激励我继续维护这个项目,或者在软件主页给我反馈。
<br>
## 下载使用
<img src="docs/images/readme/voice-engine-en.png" width="760" alt="Voice engine settings with Local, Cloud API, and Server mode cards above the model list">
**大部分用户直接下载客户端即可,无需任何配置。**
*Voice engine — choose Local, Cloud API, or Server mode, then download and switch recognition models. Detected GPUs are used automatically.*
[下载 Windows 安装包](https://github.com/crosswk/SayIt/releases/latest)
<br>
安装后默认连接我提供的公共服务器,开箱即用。服务器端的 AI 使用的是 Groq 提供的 OpenAI 120B 模型,会有免费的请求限制。
<img src="docs/images/readme/ai-cleanup-en.png" width="760" alt="AI cleanup settings showing built-in presets and per-app prompt rules">
也可以先通过 [网页版 Demo](https://sayitapp.site) 快速体验 ASR 的识别速度和效果,无需安装任何东西。
*AI cleanup — every built-in preset is editable, and per-app rules can switch presets based on the app you are typing into.*
## 使用模式
<br>
| 模式 | 适合谁 | 需要什么 |
|------|--------|---------|
| **服务器模式**(默认) | 快速体验 | 无需配置,连接公共服务器 |
| **云 API 模式** | 个人用户长期使用 | 自己的 ASR + AI API Key |
| **自部署服务器** | 团队 / 企业内部 | 一台带 GPU 的服务器 |
<img src="docs/images/readme/ai-providers-en.png" width="760" alt="AI providers grid with measured response times on each model card">
### 服务器模式(默认)
*AI providers — bring your own keys, add any OpenAI-compatible endpoint, and test round-trip latency on every card.*
下载即用。客户端默认连接公共体验服务器,适合快速感受效果。
<br>
### 云 API 模式(推荐个人用户)
<img src="docs/images/readme/history-en.png" width="760" alt="History list with search, raw ASR text, timings, and playback controls">
不需要服务器,客户端直接调用云端服务。对于个人用户来说:
*History — searchable local records. Expand one to see the raw ASR text, timings, audio playback, and re-transcribe.*
- **语音识别**:申请一个豆包 ASR API 就能获得最好的中文识别效果
- **AI 润色**:推荐 DeepSeek deepseek-v4-flash,速度快价格便宜
<br>
每月成本约几元钱。详见配置文档:
- [语音识别配置](docs/SayIt%20语音识别配置.md)
- [AI 润色供应商配置](docs/SayIt%20AI%20润色供应商配置.md)
<img src="docs/images/readme/appearance-en.png" width="760" alt="Appearance settings with app themes, waveform themes, overlay width, and a live overlay preview">
### 自部署服务器(团队 / 企业)
*Appearance — three app themes, waveform styles, overlay width, and live captions with a preview of the overlay.*
适合对数据隐私有要求、或需要内网部署的场景。使用 Qwen3-ASR 1.7B 模型在 GPU 服务器上进行本地推理:
</div>
## Get started
1. Download the latest [Windows installer](https://github.com/crosswk/SayIt/releases/latest).
2. Open SayIt and choose a voice engine. The default public server is enough for a quick trial.
3. Press the configured shortcut in any app, speak, then release to insert the result.
For regular use, choose Local mode or add your own cloud provider keys from the in-app settings. The provider console links are available beside each key field.
## Self-hosting
The backend combines FastAPI, WebSocket streaming, Qwen3-ASR, and an optional OpenAI-compatible cleanup model. Docker Compose is the recommended deployment path.
```bash
git clone https://github.com/crosswk/SayIt.git
cd SayIt/server
cp config.example.yaml config.yaml
cp .env.example .env
# 编辑 .env 填入配置
# Docker 部署(推荐)
# Add your provider and deployment settings to .env/config.yaml
docker compose up -d --build
# 或直接运行
pip install -r backend/requirements.txt
cd backend && uvicorn app.main:app --host 0.0.0.0 --port 8000
```
需要 NVIDIA GPU(≥16GB 显存)。
GPU speech recognition requires an NVIDIA GPU; 16 GB or more of VRAM is recommended for the default server model. See the [server guide](server/README.md) for configuration, deployment, security, and API details.
#### ASR 性能参考
## Performance reference
测试环境:AWS EC2 g5.xlarge(NVIDIA A10G 24GB, 4 vCPU, 16GB RAM),模型 Qwen3-ASR-1.7B + vLLM 推理。
Qwen3-ASR-1.7B with vLLM on an AWS EC2 `g5.xlarge` (NVIDIA A10G 24 GB):
| 音频时长 | ASR 延迟 | RTF |
|---------|---------|-----|
| 30s | ~0.8s | 0.025 |
| 1 min | ~1.6s | 0.026 |
| 2 min | ~2.1s | 0.017 |
| 3 min | ~2.5s | 0.014 |
| 5 min | ~3.0s | 0.010 |
| Audio length | ASR latency | RTF |
| --- | --- | --- |
| 30 seconds | ~0.8 s | 0.025 |
| 1 minute | ~1.6 s | 0.026 |
| 2 minutes | ~2.1 s | 0.017 |
| 3 minutes | ~2.5 s | 0.014 |
| 5 minutes | ~3.0 s | 0.010 |
## 功能特性
## Development
- **全局语音输入** — 在任何应用中按下快捷键即可口述,文字自动插入光标位置
- **AI 智能润色** — 口语自动转书面语,去口癖、纠错、分段,Prompt 完全可自定义
- **多种语音识别** — 豆包 ASR、千问 ASR,以及本地离线识别(SenseVoice、Fun-ASR Nano、Qwen3-ASR 共 5 档 GGUF 模型,可用显卡加速)
- **热词增强** — 自定义专业术语词表;豆包、千问、服务器模式和本地 Qwen3-ASR 会参与 ASR 识别偏置,本地 SenseVoice 则通过 AI 整理/文本处理做后处理纠错
- **悬浮窗反馈** — 录音状态、波形动画、处理进度实时可见
- **历史记录** — 所有转录结果本地保存,支持搜索和收藏
- **隐私可控** — 支持完全自部署,数据流向透明
## 项目结构
```
SayIt/
├── client/ # 桌面客户端(Tauri + React + Rust)
│ ├── src/
│ │ ├── components/ # 通用 UI 组件
│ │ ├── features/ # 功能模块(设置、自动更新)
│ │ ├── overlay/ # 悬浮窗(独立窗口,波形动画)
│ │ ├── pages/ # 页面(首页、历史、设置)
│ │ ├── services/ # 核心服务(录音、转写、存储)
│ │ └── types/ # TypeScript 类型定义
│ └── src-tauri/
│ └── src/ # Rust 后端(键盘钩子、系统集成、SQLite)
├── server/ # 后端服务(FastAPI + GPU 推理)
│ ├── backend/app/ # FastAPI 应用(ASR、LLM、WebSocket、Admin)
│ ├── gateway/ # HTTPS 反向代理(Node.js)
│ ├── web/ # 网页版(落地页、Demo、Admin 面板)
│ ├── prompts/ # LLM 提示词 + 热词
│ ├── releases/ # 客户端安装包 + 自动更新配置
│ ├── docker-compose.yml # 一键部署
│ └── config.example.yaml # 配置模板
└── docs/ # 用户文档
```
## 技术栈
| 层       | 技术                         |
| ----------------| ------------------------------------------------------|
| 桌面客户端   | Tauri v2、React、TypeScript、Tailwind CSS      |
| 客户端系统集成 | Rust(全局键盘钩子、剪贴板、SQLite)         |
| 后端服务    | Python、FastAPI、WebSocket              |
| 语音识别    | Qwen3-ASR + vLLM / 豆包 ASR / 千问 ASR / ggml (GGUF) |
| AI 润色    | DeepSeek / 通义千问 / Azure OpenAI / Ollama     |
| 部署      | Docker Compose、NVIDIA Container Toolkit       |
| 开发      | 整个项目使用 Claude Opus 开发            |
## 开发
### 客户端
### Desktop client
```bash
cd client
@@ -184,49 +132,36 @@ npm install
npm run tauri dev
```
前置要求:Node.js 18+、Rust 1.75+、CMake 3.20+、Vulkan SDK
Requirements: Node.js 18+, Rust 1.75+, CMake 3.20+, and the Vulkan SDK. The first native build compiles the C++ speech engine and may take around 20 minutes; later builds use the cache.
本地离线识别基于 transcribe.cpp(GGUF/ggml):构建时要用 CMake 编译原生库,并用
Vulkan SDK 的 `glslc` 编译 SPIR-V 着色器,缺任一项都会中断构建。首次构建会从源码
编译整棵 C++ 树(约 20 分钟),之后走缓存。
On non-English Windows installations, set `CL=/utf-8` before building so MSVC reads UTF-8 source files correctly.
两个容易卡住的点:
- 装完 CMake / Vulkan SDK 请**新开一个终端**。PATH 和 `VULKAN_SDK` 的改动不会进入
已经在运行的 shell(包括编辑器内置终端),否则会报 `is cmake not installed?` 或
`Could NOT find Vulkan`,而环境变量看起来明明是对的。
- 中文等非英文 Windows 需设 `CL=/utf-8`。否则 MSVC 按系统代码页读取 UTF-8 源文件,
会在只是注释里有非 ASCII 字符的地方报出一串看不懂的语法错误。
### 服务端
### Server
```bash
cd server
python3 -m venv .venv && source .venv/bin/activate
python3 -m venv .venv
source .venv/bin/activate
pip install -r backend/requirements.txt
cd backend && uvicorn app.main:app --port 8000
cd backend
uvicorn app.main:app --port 8000
```
前置要求:Python 3.10+、NVIDIA GPU + CUDA
Requirements: Python 3.10+ and, for GPU inference, an NVIDIA GPU with CUDA.
## 交流反馈
## Project layout
关注微信公众号获取更新动态,或扫码加入用户反馈微信群一起交流:
```text
SayIt/
├── client/ # Tauri + React desktop client
├── server/ # FastAPI backend, gateway, web demo, and deployment files
├── docs/ # User guides and images
└── dev-docs/ # Internal development notes
```
<div align="center">
## Contributing
<table>
<tr>
<td align="center"><img src="docs/images/readme/微信公众号.jpg" width="220" alt="SayIt 微信公众号"><br>微信公众号</td>
<td align="center"><img src="docs/images/readme/SayIt%20用户反馈微信群.jpg" width="220" alt="SayIt 用户反馈微信群"><br>用户反馈群</td>
</tr>
</table>
</div>
## 贡献
欢迎提交 Bug 报告和功能建议!请阅读 [贡献指南](./CONTRIBUTING.md)。
Bug reports, focused pull requests, and feature discussions are welcome. Please open a [GitHub issue](https://github.com/crosswk/SayIt/issues) or read the [contribution guide](CONTRIBUTING.md) before submitting a larger change.
## Contributors
@@ -235,8 +170,8 @@ cd backend && uvicorn app.main:app --port 8000
|:---:|:---:|
<!-- ALL-CONTRIBUTORS-LIST:END -->
## 许可证
## License
[GNU Affero General Public License v3.0](./LICENSE)
你可以自由使用、修改和自部署 SayIt。如果你分发修改版本或将其作为网络服务运行,需要以相同许可证公开源代码。
You may use, modify, and self-host SayIt. If you distribute a modified version or run it as a network service, the corresponding source must remain available under the same license.
+277
View File
@@ -0,0 +1,277 @@
**简体中文** · [English](README.md)
<div align="center">
<img src="docs/images/readme/icon.png" width="80" height="80" alt="SayIt">
# SayIt
**随口说,出色写**
用说话代替打字,AI 实时把口语变成书面表达。
按下快捷键开始说话,再按一次,润色后的文字自动输入到光标位置。
[![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](./LICENSE)
[![Windows](https://img.shields.io/badge/Platform-Windows-0078D6?logo=windows)](https://github.com/crosswk/SayIt/releases)
**[下载客户端](https://github.com/crosswk/SayIt/releases/latest)** · **[网页版体验](https://sayitapp.site)** · **[配置文档](docs/)**
**视频介绍:[我做了一个开源 AI 语音输入法——SayIt](https://www.bilibili.com/video/BV1JLTs6REPU/)**(B 站)
</div>
---
<div align="center">
<img src="docs/images/readme/demo-zh.gif" width="820" alt="SayIt 演示:按下快捷键说话,整理后的文字自动插入光标位置">
*按下快捷键说话,说完整理好的文字直接落在光标位置,不用切窗口、不用复制粘贴。*
</div>
---
## 界面预览
<div align="center">
<img src="docs/images/readme/home-zh.png" width="760" alt="SayIt 首页:口述统计与反馈入口">
*首页 — 口述时长、字数、节省的时间,以及带上最后一条转录的反馈入口*
<br>
<img src="docs/images/readme/voice-engine-zh.png" width="760" alt="语音引擎:本地 / 云 API / 服务器三种工作模式与 ASR 服务卡片">
*语音引擎 — 在本地、云 API、服务器三种模式间切换,并配置对应的识别服务。卡片上的耗时是用内置测试音频真跑一次测出来的*
<br>
<img src="docs/images/readme/ai-cleanup-zh.png" width="760" alt="AI 整理:内置润色模式与按应用的提示词规则">
*AI 整理 — 内置润色模式全部可以改,还能按当前应用自动切换提示词*
<br>
<img src="docs/images/readme/ai-providers-zh.png" width="760" alt="AI 供应商:模型卡片上带实测响应耗时">
*AI 供应商 — 用你自己的密钥,支持任意 OpenAI 兼容接口,可以一次测完所有卡片的延迟*
<br>
<img src="docs/images/readme/history-zh.png" width="760" alt="历史记录:可搜索,展开后可见 ASR 原文、耗时与回放">
*历史记录 — 全部存在本地、可搜索。展开一条能看到 ASR 原文、各段耗时、音频回放和重新识别*
<br>
<img src="docs/images/readme/appearance-zh.png" width="760" alt="外观设置:应用主题、波形主题、悬浮窗长度与流式字幕预览">
*外观 — 三套应用主题、波形样式、悬浮窗长度,以及边说边出字的流式实时字幕*
</div>
---
## 为什么做 SayIt
在 AI 时代,模型的输出 Token 速度越来越快,人却受限于打字速度。特别是和 AI 对话时,说话是非常自然和高效的方式。
我最开始用的是 Typeless,体验确实很好,Typeless 也开启了全民 VibeCoding 语音输入法的时代😁。但用了一段时间发现:价格太贵,AI 润色的 Prompt 不能自定义,有时候我并不想要那么格式化的整理,Typeless 的 AI 整理功能相对激进。
看了一下市面上其他 VibeCoding 出来的语音输入工具,大部分都是个人使用为主,很少有面向团队和企业内部使用的。所以我想做一个既适合个人使用,又可以给团队和企业内部部署的语音输入工具——Prompt 完全可控,部署方式灵活,数据流向透明。
语音输入的核心就两个技术:**语音识别(ASR)** 和 **AI 文本润色**。我基本上测试了市面上开源和闭源的各大语音识别模型,个人大体排名是:
> **豆包 > Typeless ≈ Qwen3-ASR > FunASR-Nano2512 >= FireRedASR2 > Whisper**
中文语音识别,豆包实际测试效果非常好,用手机上的豆包输入法就能很好地感受出来。豆包悄悄话的识别是断层领先的——我很多场景都是小声说话,毕竟工位上也不太好和 AI 大声聊天。
SayIt 后端部署使用的是 Qwen3-ASR,效果仅次于豆包,开源模型里算是最好的选择。如果是自己部署后端在公司内部使用,我使用 vLLM 为 Qwen-ASR 的推理速度做了优化,能够更快的进行推理识别。
> 我大大低估了 VibeCoding 想要产品化的难度。这个软件最初的形态大概 2~3 天就弄出来了,但想要公开给大家使用,耗费了 x50 倍的时间和精力。软件叫什么名字、Logo 怎么设计、前端样式是否好看、用户如何提交反馈、如何捕获报错信息、服务器端多用户多并发、如何加快识别速度……每一个场景都是可以持续优化。
这是一个开源项目,我没有准备用它盈利。做这个纯粹是我个人对语音输入的需求很强,而且现在 AI 极大地放大了个人的能力。如果你觉得这个产品好用,可以点一个 ⭐ Star,这会激励我继续维护这个项目,或者在软件主页给我反馈。
## 下载使用
**大部分用户直接下载客户端即可,无需任何配置。**
[下载 Windows 安装包](https://github.com/crosswk/SayIt/releases/latest)
安装后默认连接我提供的公共服务器,开箱即用。服务器端的 AI 使用的是 Groq 提供的 OpenAI 120B 模型,会有免费的请求限制。
也可以先通过 [网页版 Demo](https://sayitapp.site) 快速体验 ASR 的识别速度和效果,无需安装任何东西。
## 使用模式
| 模式 | 适合谁 | 需要什么 |
|------|--------|---------|
| **服务器模式**(默认) | 快速体验 | 无需配置,连接公共服务器 |
| **云 API 模式** | 个人用户长期使用 | 自己的 ASR + AI API Key |
| **自部署服务器** | 团队 / 企业内部 | 一台带 GPU 的服务器 |
### 服务器模式(默认)
下载即用。客户端默认连接公共体验服务器,适合快速感受效果。
### 云 API 模式(推荐个人用户)
不需要服务器,客户端直接调用云端服务。对于个人用户来说:
- **语音识别**:申请一个豆包 ASR API 就能获得最好的中文识别效果
- **AI 润色**:推荐 DeepSeek deepseek-v4-flash,速度快价格便宜
每月成本约几元钱。详见配置文档:
- [语音识别配置](docs/SayIt%20语音识别配置.md)
- [AI 润色供应商配置](docs/SayIt%20AI%20润色供应商配置.md)
### 自部署服务器(团队 / 企业)
适合对数据隐私有要求、或需要内网部署的场景。使用 Qwen3-ASR 1.7B 模型在 GPU 服务器上进行本地推理:
```bash
git clone https://github.com/crosswk/SayIt.git
cd SayIt/server
cp config.example.yaml config.yaml
cp .env.example .env
# 编辑 .env 填入配置
# Docker 部署(推荐)
docker compose up -d --build
# 或直接运行
pip install -r backend/requirements.txt
cd backend && uvicorn app.main:app --host 0.0.0.0 --port 8000
```
需要 NVIDIA GPU(≥16GB 显存)。
#### ASR 性能参考
测试环境:AWS EC2 g5.xlarge(NVIDIA A10G 24GB, 4 vCPU, 16GB RAM),模型 Qwen3-ASR-1.7B + vLLM 推理。
| 音频时长 | ASR 延迟 | RTF |
|---------|---------|-----|
| 30s | ~0.8s | 0.025 |
| 1 min | ~1.6s | 0.026 |
| 2 min | ~2.1s | 0.017 |
| 3 min | ~2.5s | 0.014 |
| 5 min | ~3.0s | 0.010 |
## 功能特性
- **全局语音输入** — 在任何应用中按下快捷键即可口述,文字自动插入光标位置
- **AI 智能润色** — 口语自动转书面语,去口癖、纠错、分段,Prompt 完全可自定义
- **多种语音识别** — 云端可选豆包、千问、小米 MiMo、Groq Whisper;本地离线识别有 7 档 GGUF 模型(Parakeet Unified EN、SenseVoice、Fun-ASR Nano、Nemotron 3.5、Qwen3-ASR 三档),可用显卡加速
- **中英双语界面** — 默认跟随系统语言,也可以在设置里随时切换
- **热词增强** — 自定义专业术语词表;豆包、千问、服务器模式和本地 Qwen3-ASR 会参与 ASR 识别偏置,本地 SenseVoice 则通过 AI 整理/文本处理做后处理纠错
- **悬浮窗反馈** — 录音状态、波形动画、按住时长实时可见;豆包、千问实时 ASR 下还能边说边出字幕
- **历史记录** — 所有转录结果本地保存,支持搜索和收藏
- **隐私可控** — 支持完全自部署,数据流向透明
## 项目结构
```
SayIt/
├── client/ # 桌面客户端(Tauri + React + Rust)
│ ├── src/
│ │ ├── components/ # 通用 UI 组件
│ │ ├── features/ # 功能模块(设置、自动更新)
│ │ ├── overlay/ # 悬浮窗(独立窗口,波形动画)
│ │ ├── pages/ # 页面(首页、历史、设置)
│ │ ├── services/ # 核心服务(录音、转写、存储)
│ │ └── types/ # TypeScript 类型定义
│ └── src-tauri/
│ └── src/ # Rust 后端(键盘钩子、系统集成、SQLite)
├── server/ # 后端服务(FastAPI + GPU 推理)
│ ├── backend/app/ # FastAPI 应用(ASR、LLM、WebSocket、Admin)
│ ├── gateway/ # HTTPS 反向代理(Node.js)
│ ├── web/ # 网页版(落地页、Demo、Admin 面板)
│ ├── prompts/ # LLM 提示词 + 热词
│ ├── releases/ # 客户端安装包 + 自动更新配置
│ ├── docker-compose.yml # 一键部署
│ └── config.example.yaml # 配置模板
└── docs/ # 用户文档
```
## 技术栈
| 层       | 技术                         |
| ----------------| ------------------------------------------------------|
| 桌面客户端   | Tauri v2、React、TypeScript、Tailwind CSS      |
| 客户端系统集成 | Rust(全局键盘钩子、剪贴板、SQLite)         |
| 后端服务    | Python、FastAPI、WebSocket              |
| 语音识别    | Qwen3-ASR + vLLM / 豆包 ASR / 千问 ASR / ggml (GGUF) |
| AI 润色    | DeepSeek / 通义千问 / Azure OpenAI / Ollama     |
| 部署      | Docker Compose、NVIDIA Container Toolkit       |
| 开发      | 整个项目使用 Claude Opus 开发            |
## 开发
### 客户端
```bash
cd client
npm install
npm run tauri dev
```
前置要求:Node.js 18+、Rust 1.75+、CMake 3.20+、Vulkan SDK
本地离线识别基于 transcribe.cpp(GGUF/ggml):构建时要用 CMake 编译原生库,并用
Vulkan SDK 的 `glslc` 编译 SPIR-V 着色器,缺任一项都会中断构建。首次构建会从源码
编译整棵 C++ 树(约 20 分钟),之后走缓存。
两个容易卡住的点:
- 装完 CMake / Vulkan SDK 请**新开一个终端**。PATH 和 `VULKAN_SDK` 的改动不会进入
已经在运行的 shell(包括编辑器内置终端),否则会报 `is cmake not installed?` 或
`Could NOT find Vulkan`,而环境变量看起来明明是对的。
- 中文等非英文 Windows 需设 `CL=/utf-8`。否则 MSVC 按系统代码页读取 UTF-8 源文件,
会在只是注释里有非 ASCII 字符的地方报出一串看不懂的语法错误。
### 服务端
```bash
cd server
python3 -m venv .venv && source .venv/bin/activate
pip install -r backend/requirements.txt
cd backend && uvicorn app.main:app --port 8000
```
前置要求:Python 3.10+、NVIDIA GPU + CUDA
## 交流反馈
关注微信公众号获取更新动态,或扫码加入用户反馈微信群一起交流:
<div align="center">
<table>
<tr>
<td align="center"><img src="docs/images/readme/wechat-official-account.jpg" width="220" alt="SayIt 微信公众号"><br>微信公众号</td>
<td align="center"><img src="docs/images/readme/wechat-group.jpg" width="220" alt="SayIt 用户反馈微信群"><br>用户反馈群</td>
</tr>
</table>
</div>
## 贡献
欢迎提交 Bug 报告和功能建议!请阅读 [贡献指南](./CONTRIBUTING.md)。
## Contributors
<!-- ALL-CONTRIBUTORS-LIST:START -->
| [<img src="https://github.com/crosswk.png" width="60"><br><sub>crosswk</sub>](https://github.com/crosswk) | [<img src="https://avatars.githubusercontent.com/u/76263028" width="60"><br><sub>Claude (Anthropic)</sub>](https://claude.ai) |
|:---:|:---:|
<!-- ALL-CONTRIBUTORS-LIST:END -->
## 许可证
[GNU Affero General Public License v3.0](./LICENSE)
你可以自由使用、修改和自部署 SayIt。如果你分发修改版本或将其作为网络服务运行,需要以相同许可证公开源代码。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

File renamed without changes.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB