厌倦了 Wispr Flow 的订阅费用?寻找开源免费的语音输入方案?来试试「蛐蛐」!
蛐蛐 (QuQu) 是 Wispr Flow 的开源免费替代方案,专为中文用户打造的注重隐私的桌面端语音输入工具。完全开源免费,数据本地处理,专为中文优化,支持国产AI模型。
┌──────────────────────────┐ HTTP REST ┌──────────┐ ┌─────────────────┐
│ Electron 桌面应用 │ ◄─────────────── ► │ nginx │ ──► │ FunASR 容器 ×N │
│ (前端,原生运行) │ localhost:8000 │ 反代 │ │ (Python 后端) │
│ │ └──────────┘ │ │
│ • 系统托盘 / 快捷键 │ │ • 语音识别 ASR │
│ • 录音 / 剪贴板 │ │ • VAD/标点恢复 │
│ • AI 文本优化 │ │ • 模型本地运行 │
└──────────────────────────┘ └─────────────────┘
- 前端:Electron + React,原生运行在桌面(需要托盘、快捷键、剪贴板权限)
- 后端:Python FunASR 服务,运行在 Podman/Docker 容器中(所有 Python 依赖封装隔离,不污染系统环境)
适合开发调试、快速体验。前后端均从源码启动,模型首次自动下载。
- Python 3.11+ 和 uv(Python 依赖管理)
- Node.js 18+ 和 pnpm(前端依赖管理)
- Linux / Windows(均支持开发与打包运行,macOS 暂未适配)
git clone https://github.com/lxp731/ququ.git
cd ququcd backend
# 安装 Python 依赖(首次)
uv sync
# 启动 FunASR 服务(首次运行自动下载模型 ~1.2GB,需 1-2 分钟)
uv run python funasr_server.py --port 8000后端启动后访问 http://127.0.0.1:8000/health 验证,返回 {"status":"ok"} 即就绪。
cd frontend
pnpm install
pnpm run dev启动应用后,在设置页面中填入 AI 服务商的 API Key、Base URL 和模型名称。内置 DeepSeek / Qwen / OpenAI 一键预设,也支持其他兼容 OpenAI API 的服务商。
适合日常稳定使用。后端容器化运行,前端使用打包好的安装包。
- Podman 或 Docker(运行后端容器)
# Arch / CachyOS
sudo pacman -S podman
# Ubuntu / Debian
sudo apt install podmangit clone https://github.com/lxp731/ququ.git
cd ququ
# 构建镜像并启动容器
podman compose up -d --build
# 查看日志,等待模型加载完成(首次约 1-2 分钟,需下载 ~1.2GB 模型)
podman compose logs -f backend模型文件缓存于
~/.cache/modelscope,销毁重建容器无需重新下载。
Windows:
从 Releases 下载最新 ququ-v*-portable.exe,免安装,双击即用。
Arch 系 Linux:
yay -S ququ-bin其他 Linux 发行版:
从 Releases 下载最新 .AppImage 文件:
chmod +x ququ-v*.AppImage
./ququ-v*.AppImage启动应用后,在设置页面中填入 AI 服务商的 API Key、Base URL 和模型名称。内置 DeepSeek / Qwen / OpenAI 一键预设,也支持其他兼容 OpenAI API 的服务商。
提示:
- 如果后端部署在其他主机,可在设置页面中修改 FunASR 后端地址,指向远程服务。
- 后端默认允许来自所有 IP 的访问,即 0.0.0.0:8000,安全生产环境自行限制。
源码运行时通过 .env 文件中的以下环境变量控制性能:
| 参数 | 作用 | 默认值 |
|---|---|---|
FUNASR_WORKERS |
Gunicorn worker 进程数。每个 worker 独占一套模型(约 3GB 内存),同时只能处理一个转写请求(代码有互斥锁保护)。增加 workers 是提升并发的唯一途径,代价是内存成倍增长。 | 1 |
OMP_NUM_THREADS |
PyTorch 推理时使用的 CPU 核心数。控制单次转写的计算速度,值越大转写越快,但不应超过 CPU 物理核心数。 | 4 |
FUNASR_THREADS |
Gunicorn 线程数。线程不参与实际转写,仅用于排队等待锁。值略大于预期的并发排队数即可,对资源占用极小。 | 8 |
经验公式:
FUNASR_WORKERS × OMP_NUM_THREADS ≤ CPU 核数,避免多个 worker 争抢 CPU 互相拖慢。
容器部署:每个容器固定 FUNASR_WORKERS=1,通过水平扩缩容提升并发:
# 扩容至 3 个后端实例
podman compose up -d --scale backend=3缩容时 podman-compose(Python 版)的 --scale 不生效,需手动操作:
# 先看当前有哪些实例
podman ps --format '{{.Names}} {{.Status}}'
# 停掉多余的实例
podman stop ququ_backend_2 ququ_backend_3
podman rm ququ_backend_2 ququ_backend_3nginx 通过 compose 内部 DNS 自动负载均衡到所有 backend 实例,无需额外配置。如果使用 Docker Compose,
--scale扩缩容均可直接生效。
ququ/
├── frontend/ # Electron + React 桌面应用
│ ├── src/
│ │ ├── helpers/ # Electron 主进程模块
│ │ ├── hooks/ # React hooks
│ │ └── components/ # UI 组件
│ ├── package.json
│ └── vite.config.js
├── backend/ # Python FunASR HTTP 服务(容器化)
│ ├── funasr_server.py # Flask REST API
│ ├── Dockerfile
│ └── pyproject.toml # uv 依赖管理
├── nginx.conf # nginx 反代配置
└── docker-compose.yml # Podman/Docker 编排
# 前端开发(frontend/ 目录下)
pnpm run dev # 启动 Electron + Vite 开发模式
pnpm run build:renderer # 构建前端
pnpm run build # 打包当前平台安装包(Windows: portable exe / Linux: AppImage)
# 单独打包指定平台(跨平台构建)
pnpm run build:linux # 打包 Linux AppImage
# Windows 便携版需在 Windows 上直接运行 pnpm run build
# 后端容器(项目根目录)
podman compose build # 构建容器镜像
podman compose up -d # 启动容器
podman compose down # 停止容器
podman compose logs -f backend # 查看日志| 端点 | 方法 | 说明 |
|---|---|---|
/health |
GET | 健康检查 |
/status |
GET | 模型状态 |
/transcribe |
POST | 上传音频(multipart/form-data),返回转录文本 |
/stats |
GET | 性能统计 |
- 热词接口:后端
transcribe_audio已支持options["hotword"]参数,前端需要增加热词输入框,让用户自定义热词列表以提升特定场景下的识别准确率。
| 层 | 技术 |
|---|---|
| 桌面框架 | Electron 36 |
| 前端 | React 19, Vite 6, Tailwind CSS 4, shadcn/ui |
| 语音识别 | FunASR (Paraformer-large, FSMN-VAD, CT-Transformer) |
| AI 文本优化 | 兼容 OpenAI API(内置 DeepSeek / Qwen / OpenAI 预设) |
| 后端框架 | Flask + gunicorn |
| 容器化 | Podman / Docker Compose |
| 数据库 | better-sqlite3 |
| 依赖管理 | pnpm (Node), uv (Python) |
