docs(README): 新增英文 README,挂上中英文界面截图与演示动图
README.md 改为英文并作为默认入口,中文版移到 README.zh-CN.md,两边互相链接。 截图按 首页 → 语音引擎 → AI 整理 → AI 供应商 → 历史 → 外观 排列,中英文各一套; 图片名统一成 ASCII 短横线形式,省掉 URL 里的 %20 转义。
No files matched your search
@@ -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)
|
||||
[](https://github.com/crosswk/SayIt/releases)
|
||||
[](https://github.com/crosswk/SayIt/releases/latest)
|
||||
[](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.
|
||||
@@ -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)
|
||||
[](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。如果你分发修改版本或将其作为网络服务运行,需要以相同许可证公开源代码。
|
||||
|
Before Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 245 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 181 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 225 KiB |
|
After Width: | Height: | Size: 974 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 293 KiB |
|
After Width: | Height: | Size: 153 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 238 KiB |
|
After Width: | Height: | Size: 274 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |