MoCli
AI‑Powered Desktop Companion with Visual Pointing
📖 简介
MoCli 是一个运行在 Windows 桌面上的 AI 伴侣助手。它以一个优雅的三角形光标驻留在屏幕上,通过语音唤醒或系统托盘与用户交互。
MoCli 能看到你的屏幕、听到你的声音、理解你的意图,并用自然语言回答问题——还能精准地将光标飞向屏幕上的任何元素来指引你。
✨ 核心能力
- 🎯 视觉指向 — 结合 VLM(视觉语言模型)截屏分析,三角形光标会飞向 AI 识别到的目标位置
- 🗣️ 语音唤醒 — 说出唤醒词(默认"贾维斯")即可开始对话,无需动手
- 🎤 语音识别 (STT) — 基于 SenseVoice 离线语音转文字,隐私安全
- 🔊 语音合成 (TTS) — 对接本地 TTS 服务,AI 回复自动朗读
- 🌀 状态可视化 — 聆听时绿色呼吸圆球,思考时紫色呼吸圆球,待机时静默三角形
- ⚙️ Win11 风格设置面板 — Fluent Design 三栏标签页,支持实时光标坐标显示与定点测试
🏗️ 项目架构
MoCli 采用模块化架构,每个文件职责单一、松耦合:
MoCli/
├── main.py # 程序入口 — 模块组装、信号编排、VoiceManager
├── settings.py # 配置管理 — DBManager(SQLite) + 设置面板 + 系统托盘
├── triangle.py # 三角形光标 — 弹簧物理跟随 + 飞行动画 + 呼吸状态
├── screen.py # 屏幕截图 — 无损物理像素截屏 + Base64 编码
├── llm.py # 大模型引擎 — Prompt 构建 + 多模态请求 + 坐标解析
├── wakeup.py # 语音唤醒 — sherpa-onnx KWS 关键词检测
├── stt.py # 语音识别 — SenseVoice 离线推理 + WebRTC VAD
├── tts.py # 语音合成 — aiohttp 异步流式 PCM 播放
├── system_prompt.md # 系统提示词(只读参考)
├── requirements.txt # Python 依赖清单
└── mocli.db # SQLite 配置数据库(自动生成)
数据流
语音唤醒 ──→ STT识别 ──→ 截屏+构建Prompt ──→ VLM推理 ──→ 解析回复
│
┌────────────────────────────┤
↓ ↓ ↓
气泡显示 光标飞行指向 TTS朗读
🚀 快速开始
环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11 |
| Python | 3.10 或更高版本 |
| VLM 服务 | 任何兼容 OpenAI API 的视觉语言模型(如 LM Studio、Ollama) |
| TTS 服务 | 本地 TTS HTTP API(可选,如 Qwen3-TTS) |
| 麦克风 | 支持 16kHz 采样的音频输入设备(语音功能需要) |
安装步骤
# 1. 克隆项目
git clone https://github.com/your-repo/mocli.git
cd mocli
# 2. 创建并激活虚拟环境
conda create -p .conda python=3.10 -y
conda activate ./.conda
# 3. 安装依赖
pip install -r requirements.txt
# 4. 下载语音模型(语音功能需要)
# KWS 唤醒模型
# 将 sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01 目录放在项目根目录
# STT 识别模型
# 将 sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17 目录放在项目根目录
# 5. 启动
python main.py
注意:首次运行会自动创建
mocli.db配置数据库。语音模型目录不存在时,程序会优雅退化为纯文本模式。
⚙️ 配置说明
所有配置通过系统托盘 → 右键 → 设置进入 Win11 风格的设置面板管理。
🧠 大模型 Tab
| 配置项 | 说明 | 默认值 |
|---|---|---|
| Base URL | VLM API 端点 | http://127.0.0.1:1234/v1/chat/completions |
| 模型名称 | 模型标识符 | microsoft_fara-7b |
| API Key | 认证密钥 | lm-studio |
🗣️ 语音 Tab
| 配置项 | 说明 | 默认值 |
|---|---|---|
| 启用语音唤醒 | KWS 开关 | ✅ 开启 |
| 唤醒词 | 触发词 | 贾维斯 |
| 启用语音回复 | TTS 开关 | ✅ 开启 |
| TTS 服务地址 | TTS API URL | http://localhost:8100/v1/audio/speech |
| TTS 模型 | TTS 模型名 | model-base |
⚙️ 高级 Tab
| 配置项 | 说明 |
|---|---|
| 实时光标位置 | 显示鼠标当前物理像素坐标 (50ms 刷新) |
| 定点测试 | 输入归一化坐标 (0-1000) 测试光标飞行精度,停留 15 秒 |
| 全局偏移量 | 归一化偏移补偿 (0-1000),应用于所有 AI 指向动作 |
| 对话记忆 | 滑动条调节短时记忆条数 (2-50) |
| 系统提示词 | 只读预览当前 Prompt |
🎯 视觉定位系统
MoCli 使用 0-1000 归一化坐标系 进行视觉定位,这是当前主流 VLM 最擅长的定位方式:
┌──────────────────────────┐
│ (0,0) (1000,0) │
│ │
│ (500,500) │ ← 屏幕正中央
│ │
│ (0,1000) (1000,1000)│
└──────────────────────────┘
换算公式
物理像素 X = ((归一化X + 偏移X) / 1000) × 屏幕宽度
物理像素 Y = ((归一化Y + 偏移Y) / 1000) × 屏幕高度
示例:屏幕 2560×1600,AI 返回 [POINT:500,500:目标],偏移量 (0,0)
→ 物理坐标 = (1280, 800) = 屏幕正中央 ✅
支持的模型
| 模型 | 归一化坐标支持 |
|---|---|
| Claude 3.5 Sonnet | ⭐ 官方推荐 0-1000 |
| Gemini 1.5 Pro | ⭐ 原生支持 |
| Qwen-VL 系列 | ✅ 训练数据含归一化标注 |
| 其他 OpenAI 兼容 VLM | ✅ 通过 Prompt 引导 |
🎨 光标状态可视化
三角形光标会根据 MoCli 的工作状态自动变换形状和颜色:
| 状态 | 形状 | 颜色 | 动效 |
|---|---|---|---|
| 待机 | 🔺 三角形 | 暗灰 #282C34 |
弹簧跟随鼠标 |
| 聆听中 | 🟢 圆形 | 绿色 #00DC64 |
呼吸缩放 + 透明度脉动 |
| 思考中 | 🟣 圆形 | 紫色 #A032FF |
呼吸缩放 + 透明度脉动 |
| AI 飞行 | 🔺 三角形 | 青色 #00C8FF |
InOutQuad 缓动飞行 |
| 文本输入 | 🔺 三角形 | 橙色 #FFAA00 |
静止 |
📁 语音模型目录结构
MoCli/
├── sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/
│ ├── encoder-epoch-99-avg-1-chunk-16-left-64.onnx
│ ├── decoder-epoch-99-avg-1-chunk-16-left-64.onnx
│ ├── joiner-epoch-99-avg-1-chunk-16-left-64.onnx
│ └── tokens.txt
│
└── sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/
├── model.int8.onnx
└── tokens.txt
模型可从 sherpa-onnx 官方仓库 获取。
🔧 技术细节
并发模型
MoCli 采用 方案 A:共享 asyncio 事件循环。wakeup、stt、tts 三个子系统在同一个后台线程的 asyncio 循环中运行,通过 asyncio.Queue 共享音频数据,降低线程切换开销。
DPI 处理
强制设置环境变量 QT_AUTO_SCREEN_SCALE_FACTOR=0,确保截屏坐标与 Qt 窗口坐标 1:1 对齐,避免高 DPI 屏幕下的偏移。
跨线程安全
所有后台线程(AI 请求、语音引擎)通过 pyqtSignal 信号桥与 Qt 主线程通信,避免直接操作 Widget 导致的线程死锁。
配置持久化
使用 SQLite 键值对数据库 (mocli.db),所有配置修改即时生效,无需重启。
📋 依赖清单
| 包名 | 用途 |
|---|---|
| PyQt6 | GUI 框架、系统托盘、动画引擎 |
| requests | VLM API HTTP 请求 |
| Pillow | 屏幕截图与图像编码 |
| numpy | 音频数据矩阵运算 |
| PyAudio | 麦克风采集与扬声器播放 |
| sherpa-onnx | KWS 语音唤醒 + SenseVoice STT |
| webrtcvad | 语音活动端点检测 (VAD) |
| aiohttp | TTS 异步流式 HTTP 请求 |
🐛 常见问题
Q: 启动后没有三角形光标?
确保以管理员权限运行终端。MoCli 需要系统级权限来创建置顶透明窗口。
Q: 语音唤醒不工作?
- 检查麦克风设备是否被其他应用占用
- 确认 KWS 模型目录
sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01存在 - 检查设置面板中"启用语音唤醒"是否开启
Q: TTS 没有声音?
- 确认本地 TTS 服务已启动并监听正确端口
- 在设置 → 语音 Tab 中检查 TTS 服务地址和模型名
- 确认"启用语音回复"开关已开启
Q: 光标指向位置不准确?
- 在设置 → 高级 Tab 中使用定点测试验证精度(输入 500,500 应飞向屏幕正中央)
- 如果存在系统性偏移,调整全局偏移量进行补偿
- 确保没有使用 Windows 的显示缩放(推荐 100%)
Q: webrtcvad 安装失败?
确保 setuptools 版本低于 71:
pip install "setuptools<71"
pip install webrtcvad
📄 开源协议
本项目基于 MIT License 开源。
