cheap-im 是一个仅用 CPU 运行的语音智能体项目,目标是在普通笔记本上复现 Thinking Machines 交互模型演示(2026 年 5 月)的表面行为,包括实时语音、视觉触发的主动响应、实时翻译以及对话中的后台任务。项目并不试图匹配 Thinking Machines 的架构——对方从零训练了 276B MoE 模型,基于连续音频和视频、以 200ms 微轮次运行——而是用 Python 事件循环把商品化模型粘合起来,展示一个精心设计的 harness 能在多大程度上接近那四种行为。
用途与定位 该项目主要用于实验和演示实时多模态交互模式,适合研究语音打断、视觉触发、实时翻译和后台任务编排的开发者参考。它强调在单台 CPU 笔记本、单进程、单 asyncio 循环中运行,语音和视觉均在本地处理,LLM 调用则发往 DeepInfra。
主要能力 项目实现了四种演示行为,均可在带真实摄像头和麦克风的笔记本上端到端运行:
- 朋友检测:摄像头上的 YOLO11-pose 发出 person_count_changed 事件,注册的 watcher 在非主要人物出现时触发。
- 实时翻译:Silero VAD 切分短语级片段,DeepInfra 上的 Whisper-large-v3-turbo 将其翻译为英语,Piper 以口译风格在用户继续说话时逐段朗读。当用户在回合结束停顿时说英语,自动退出翻译模式。
- 驼背检测:通过肩到耳的向量与垂直方向夹角判断,经三帧(1.5 秒)去抖,避免瞬间倾斜误触发。
- 搜索加图表并继续对话:前台说“让我帮你找找”,后台 worker 调用 Serper,再用 DeepSeek-V3.2 生成 Chart.js 规格。用户可以在图表于浏览器渲染时打断并追问。
使用方式 项目要求 Python 3.11,在 Linux 上构建和测试。依赖跨平台,但 macOS 和 Windows 尚未实际验证。安装时 pyproject.toml 将 torch 和 torchvision 固定到 PyTorch 的 CPU-only wheel 索引,使安装体积约 250 MB 而非约 3 GB。 运行前需要准备:
- Kroko 模型权重:从 HuggingFace 镜像下载 Banafo Kroko ASR 英语(及其他所需语言)权重,四个文件放在同一文件夹,并在 .env 中设置 CHEAPIM_KROKO_MODEL_DIR。
- YOLO 权重:ultralytics 首次使用时自动下载 yolo11n-pose.pt(约 6 MB),可通过 CHEAPIM_YOLO_MODEL 指定其他尺寸。
- Piper 语音:使用 Piper 下载器选择语音,生成 .onnx 和 .onnx.json 文件放入 models/piper/,并将环境变量指向 .onnx 文件。
- 图表页面:在启动演示前,用普通浏览器打开 http://127.0.0.1:8765/,编排器不管理浏览器生命周期。 命令行选项:
- --no-cam:跳过摄像头和 YOLO 加载,视觉触发仍保留在表中但不自动触发。
- --no-audio:从 stdin 运行,不触碰麦克风和 TTS。
- --no-audio --no-cam:无头纯文本会话,集成测试使用此配置。
- --cam-debug:打开 OpenCV 窗口显示 YOLO 看到的边界框、关键点、主要人物、实时驼背角度和去抖计数,按 q 关闭窗口,编排器继续无头运行。
技术组件 本地组件:Silero VAD(端点检测和打断门控)、Kroko ASR via sherpa-onnx(流式语音转文本)、YOLO11-pose via ultralytics(4 fps 的人物和姿态检测)、Piper(基于 onnxruntime 的 VITS TTS)、WebRTC AEC3 via livekit Python 绑定(麦克风路径上的声学回声消除)、sounddevice 和 soundfile(麦克风/扬声器 I/O 及翻译模式音频上传的 FLAC 编码)、opencv-python(摄像头捕获)。 网络 API:DeepInfra 默认提供 meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo(前台交互模型)、deepseek-ai/DeepSeek-V3.2(后台推理/结构化输出模型)、openai/whisper-large-v3-turbo(仅翻译模式调用),以及 Serper(网页搜索)。模型调用通过 DeepInfra 的 OpenAI 兼容端点,可将 base URL 指向任何 OpenAI 格式的提供商并配置匹配的模型名。 编排器核心:httpx 用于流式 SSE、partial-json-parser 用于增量提取 say 字段、python-dotenv 加载 .env、fastapi + uvicorn + websockets 提供静态 HTML 页面并用 Chart.js v4 渲染图表(仅用于行为 4)。
适用场景与限制 适用场景:在 CPU 笔记本上演示和实验实时语音交互、视觉触发、实时翻译和后台任务编排;无头纯文本模式可用于测试图表流水线;--no-cam 适合无摄像头环境或 CI。 限制:项目明确不匹配 Thinking Machines 的架构,仅复现表面行为。仅在 Linux 上构建和测试,macOS 和 Windows 未经验证。需要 Python 3.11。使用扬声器时依赖 WebRTC AEC3 抑制自打断,若 livekit 未安装则 AEC 降级为 no-op。YOLO 默认 nano 模型在 CPU 上 4 fps,端到端延迟约 150–300ms,硬件不同会有差异。翻译模式音频按秒计费并计入成本估算。成本数字基于 DeepInfra 定价。