diff --git a/README.md b/README.md index a80c6bf..2491869 100644 --- a/README.md +++ b/README.md @@ -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)** ---- -
-SayIt 主界面 +SayIt in action: pressing the shortcut, speaking, and the cleaned-up text appearing at the cursor -*主界面 — 统计数据与快捷操作* - -
- -外观配置 - -*外观配置 — 多主题切换与悬浮窗自定义* - -
- -诊断 - -*诊断面板 — 实时运行状态与连接检测* +*Trigger the shortcut, speak, and the cleaned-up text is typed in at your cursor — no window switching.*
---- +## 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 大声聊天。 +
-SayIt 后端部署使用的是 Qwen3-ASR,效果仅次于豆包,开源模型里算是最好的选择。如果是自己部署后端在公司内部使用,我使用 vLLM 为 Qwen-ASR 的推理速度做了优化,能够更快的进行推理识别。 +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,这会激励我继续维护这个项目,或者在软件主页给我反馈。 +
-## 下载使用 +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) +
-安装后默认连接我提供的公共服务器,开箱即用。服务器端的 AI 使用的是 Groq 提供的 OpenAI 120B 模型,会有免费的请求限制。 +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.* -## 使用模式 +
-| 模式 | 适合谁 | 需要什么 | -|------|--------|---------| -| **服务器模式**(默认) | 快速体验 | 无需配置,连接公共服务器 | -| **云 API 模式** | 个人用户长期使用 | 自己的 ASR + AI API Key | -| **自部署服务器** | 团队 / 企业内部 | 一台带 GPU 的服务器 | +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.* -下载即用。客户端默认连接公共体验服务器,适合快速感受效果。 +
-### 云 API 模式(推荐个人用户) +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,速度快价格便宜 +
-每月成本约几元钱。详见配置文档: -- [语音识别配置](docs/SayIt%20语音识别配置.md) -- [AI 润色供应商配置](docs/SayIt%20AI%20润色供应商配置.md) +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 服务器上进行本地推理: +
+ +## 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 +``` -
+## Contributing - - - - - -
SayIt 微信公众号
微信公众号
SayIt 用户反馈微信群
用户反馈群
- -
- -## 贡献 - -欢迎提交 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 |:---:|:---:| -## 许可证 +## 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. diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..d690ba2 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,277 @@ +**简体中文** · [English](README.md) + +
+ +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 站) + +
+ +--- + +
+ +SayIt 演示:按下快捷键说话,整理后的文字自动插入光标位置 + +*按下快捷键说话,说完整理好的文字直接落在光标位置,不用切窗口、不用复制粘贴。* + +
+ +--- + +## 界面预览 + +
+ +SayIt 首页:口述统计与反馈入口 + +*首页 — 口述时长、字数、节省的时间,以及带上最后一条转录的反馈入口* + +
+ +语音引擎:本地 / 云 API / 服务器三种工作模式与 ASR 服务卡片 + +*语音引擎 — 在本地、云 API、服务器三种模式间切换,并配置对应的识别服务。卡片上的耗时是用内置测试音频真跑一次测出来的* + +
+ +AI 整理:内置润色模式与按应用的提示词规则 + +*AI 整理 — 内置润色模式全部可以改,还能按当前应用自动切换提示词* + +
+ +AI 供应商:模型卡片上带实测响应耗时 + +*AI 供应商 — 用你自己的密钥,支持任意 OpenAI 兼容接口,可以一次测完所有卡片的延迟* + +
+ +历史记录:可搜索,展开后可见 ASR 原文、耗时与回放 + +*历史记录 — 全部存在本地、可搜索。展开一条能看到 ASR 原文、各段耗时、音频回放和重新识别* + +
+ +外观设置:应用主题、波形主题、悬浮窗长度与流式字幕预览 + +*外观 — 三套应用主题、波形样式、悬浮窗长度,以及边说边出字的流式实时字幕* + +
+ +--- + +## 为什么做 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 + +## 交流反馈 + +关注微信公众号获取更新动态,或扫码加入用户反馈微信群一起交流: + +
+ + + + + + +
SayIt 微信公众号
微信公众号
SayIt 用户反馈微信群
用户反馈群
+ +
+ +## 贡献 + +欢迎提交 Bug 报告和功能建议!请阅读 [贡献指南](./CONTRIBUTING.md)。 + +## Contributors + + +| [
crosswk](https://github.com/crosswk) | [
Claude (Anthropic)](https://claude.ai) | +|:---:|:---:| + + +## 许可证 + +[GNU Affero General Public License v3.0](./LICENSE) + +你可以自由使用、修改和自部署 SayIt。如果你分发修改版本或将其作为网络服务运行,需要以相同许可证公开源代码。 diff --git a/docs/images/readme/SayIt 用户反馈微信群.jpg b/docs/images/readme/SayIt 用户反馈微信群.jpg deleted file mode 100644 index 6c4652b..0000000 Binary files a/docs/images/readme/SayIt 用户反馈微信群.jpg and /dev/null differ diff --git a/docs/images/readme/ai-cleanup-en.png b/docs/images/readme/ai-cleanup-en.png new file mode 100644 index 0000000..3773a4b Binary files /dev/null and b/docs/images/readme/ai-cleanup-en.png differ diff --git a/docs/images/readme/ai-cleanup-zh.png b/docs/images/readme/ai-cleanup-zh.png new file mode 100644 index 0000000..cf8a8f6 Binary files /dev/null and b/docs/images/readme/ai-cleanup-zh.png differ diff --git a/docs/images/readme/ai-providers-en.png b/docs/images/readme/ai-providers-en.png new file mode 100644 index 0000000..09f76f7 Binary files /dev/null and b/docs/images/readme/ai-providers-en.png differ diff --git a/docs/images/readme/ai-providers-zh.png b/docs/images/readme/ai-providers-zh.png new file mode 100644 index 0000000..10081cc Binary files /dev/null and b/docs/images/readme/ai-providers-zh.png differ diff --git a/docs/images/readme/appearance-en.png b/docs/images/readme/appearance-en.png new file mode 100644 index 0000000..f941793 Binary files /dev/null and b/docs/images/readme/appearance-en.png differ diff --git a/docs/images/readme/appearance-zh.png b/docs/images/readme/appearance-zh.png new file mode 100644 index 0000000..06d8784 Binary files /dev/null and b/docs/images/readme/appearance-zh.png differ diff --git a/docs/images/readme/demo-en.gif b/docs/images/readme/demo-en.gif new file mode 100644 index 0000000..fcd8ce2 Binary files /dev/null and b/docs/images/readme/demo-en.gif differ diff --git a/docs/images/readme/demo-zh.gif b/docs/images/readme/demo-zh.gif new file mode 100644 index 0000000..6e20782 Binary files /dev/null and b/docs/images/readme/demo-zh.gif differ diff --git a/docs/images/readme/history-en.png b/docs/images/readme/history-en.png new file mode 100644 index 0000000..4b9a69b Binary files /dev/null and b/docs/images/readme/history-en.png differ diff --git a/docs/images/readme/history-zh.png b/docs/images/readme/history-zh.png new file mode 100644 index 0000000..181b708 Binary files /dev/null and b/docs/images/readme/history-zh.png differ diff --git a/docs/images/readme/home-en.png b/docs/images/readme/home-en.png new file mode 100644 index 0000000..f8d014f Binary files /dev/null and b/docs/images/readme/home-en.png differ diff --git a/docs/images/readme/home-zh.png b/docs/images/readme/home-zh.png new file mode 100644 index 0000000..0d9f655 Binary files /dev/null and b/docs/images/readme/home-zh.png differ diff --git a/docs/images/readme/screenshot-appearance.png b/docs/images/readme/screenshot-appearance.png deleted file mode 100644 index dcc3daf..0000000 Binary files a/docs/images/readme/screenshot-appearance.png and /dev/null differ diff --git a/docs/images/readme/screenshot-diagnostics.png b/docs/images/readme/screenshot-diagnostics.png deleted file mode 100644 index 6bf967f..0000000 Binary files a/docs/images/readme/screenshot-diagnostics.png and /dev/null differ diff --git a/docs/images/readme/screenshot-home.png b/docs/images/readme/screenshot-home.png deleted file mode 100644 index 6c64d46..0000000 Binary files a/docs/images/readme/screenshot-home.png and /dev/null differ diff --git a/docs/images/readme/voice-engine-en.png b/docs/images/readme/voice-engine-en.png new file mode 100644 index 0000000..f773366 Binary files /dev/null and b/docs/images/readme/voice-engine-en.png differ diff --git a/docs/images/readme/voice-engine-zh.png b/docs/images/readme/voice-engine-zh.png new file mode 100644 index 0000000..81b01b0 Binary files /dev/null and b/docs/images/readme/voice-engine-zh.png differ diff --git a/docs/images/readme/wechat-group.jpg b/docs/images/readme/wechat-group.jpg new file mode 100644 index 0000000..f22ef5c Binary files /dev/null and b/docs/images/readme/wechat-group.jpg differ diff --git a/docs/images/readme/微信公众号.jpg b/docs/images/readme/wechat-official-account.jpg similarity index 100% rename from docs/images/readme/微信公众号.jpg rename to docs/images/readme/wechat-official-account.jpg