Reachy Mini 实现完全本地化
Reachy Mini goes fully local
Hugging Face 与 Pollen Robotics 合作,为 Reachy Mini 机器人部署了完全本地的语音对话流水线。该方案基于 `speech-to-speech` 库,采用级联架构(VAD → STT → LLM → TTS),通过兼容 Realtime API 的 WebSocket 暴露服务。推荐组件为 Silero VAD v5、Parakeet-TDT STT、llama.cpp 搭配 Gemma 4 或 Qwen3-4B 作为 LLM、Qwen3-TTS。支持在本地(MLX、Transformers、vLLM)或通过 Responses API(OpenAI、Hugging Face Inference Endpoints)运行 LLM,无需云端或 API 密钥。
](https://huggingface.co/A-Mahla)
构建好你的 Reachy Mini 后,你需要安装对话应用并开始与它对话。在此之前,你必须将音频发送到服务器。但现在不必了。今天我们将带你了解如何在本地运行整个堆栈。
该堆栈由 speech-to-speech 驱动,这是一个级联的 VAD → STT → LLM → TTS 流水线,它暴露了一个兼容 Realtime API 的 /v1/realtime WebSocket。启动后端后,从 UI 中将机器人指向该后端。
级联是当今开源领域中最灵活的选择,如果组件选取得当,它也是最快的。我们会推荐我们最喜欢的组件,但级联的核心在于你可以自由替换它们。新模型每周都在涌现。
TL;DR
- 为你的 Reachy Mini 部署一个本地语音后端。
- 我们使用
speech-to-speech库,采用级联方法。- 推荐:llama.cpp 搭配 Gemma 4、Silero VAD、Parakeet-TDT STT、Qwen3-TTS。
快速开始
这篇博客将带你了解如何完全在本地运行 Reachy Mini 的对话功能。无需云端、无需 API 密钥、数据不会离开你的机器。以下是展示实际效果的视频:
本地提供 LLM 服务
为了提供 LLM 服务,我们将使用 Hugging Face 的 llama.cpp。如果需要安装,最简单的方式是 brew install llama.cpp 或 winget install llama.cpp,更多帮助请查看文档。首先,我们运行:
llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full
完成!第一次会下载模型,后续启动会很快。
这些标志的作用是什么?
-hf ggml-org/gemma-4-E4B-it-GGUF— 直接从 Hub 拉取模型。首次运行会下载,后续运行使用缓存。-np 2— 两个并行槽位。让服务器能够处理第二个请求(例如快速中断),而不会阻塞第一个请求。-c 65536— 64k 上下文窗口,在槽位间共享。为长对话提供了充足的空间。-fa on— 启用 flash attention。更快且内存占用更低,在现代硬件上基本无开销。--swa-full— 保留完整的滑动窗口 attention 缓存,而不是重新计算。在 Gemma 上,用少量 RAM 换取显著更快的 prompt 处理。
设置 speech-to-speech
我们首先安装这个库:
uv pip install speech-to-speech
然后,在另一个终端中运行 LLM 服务的同时,我们可以简单地运行:
speech-to-speech --responses_api_base_url "http://127.0.0.1:8080" --responses_api_api_key "" --mode local
然后你就可以通过终端开始与模型对话了!第一次需要下载 Parakeet 和 Qwen3TTS,但后续启动会很快。
以下是展示本地对话模式的视频:
Video 8
现在,在 --mode local 模式下尝试之后,你可以不带该选项再次运行命令,以便为机器人提供 speech-to-speech 服务。
将 Reachy Mini 连接到 speech-to-speech
一旦 llama.cpp 和 speech-to-speech 运行起来,你可以通过桌面应用启动机器人,并启动对话应用。在对话应用的 UI 中,你需要通过点击 HF 后端中的 "edit connection" 来选择本地模式。以下是操作演示视频:
Video 9 这样就完成了。你可以开始与机器人对话了。流水线的每个阶段都是一种权衡:有更快但质量较低的 TTS 模型,也有更慢但质量更高的 STT 模型。我们针对多语言进行了优化,你可能希望针对单一语言进行优化。博客的其余部分将介绍如何进行自定义。
深入探讨
为什么运行自己的语音转语音服务器?
托管的实时后端很方便,但运行自己的引擎可以解锁三个优势:
- 隐私。 音频永远不会离开你的网络,整个流水线在你控制的硬件上运行。
- 无 API 成本。 没有按分钟或按 token 的费用。
- 完全控制流水线。 可以替换任何组件:VAD、STT、LLM、TTS。只要 Hub 🤗 上有更好的模型出现。
speech-to-speech 仓库通过一个 CLI 提供了所有这些功能。它启动一个位于 /v1/realtime 的 WebSocket 服务器,该服务器使用 Reachy Mini 已经知道如何通信的协议。
我们的主观默认配置:VAD、STT、TTS
一个级联语音流水线有四个阶段:VAD、STT、LLM 和 TTS。对于其中三个,我们选择了可靠的默认配置,以便你可以专注于 LLM:
| 阶段 | 选择 | 原因 |
|---|---|---|
| VAD | Silero VAD v5 | 体积小、准确、可在 CPU 上运行。开源语音代理领域的事实标准。 |
| STT | Parakeet-TDT | 支持流式处理、速度极快、英语质量出色。 |
| TTS | Qwen3-TTS | 富有表现力、低延迟、多语言、支持自定义语音。 |
我们对这些选择有主观偏好,如果你有偏好,可以随意替换它们。
选择你的 LLM
LLM 是对系统延迟和整体性能影响最大的层。我们支持两种选项:本地运行模型(llama.cpp、MLX、Transformers、vLLM),或使用带有 Responses API 的服务器(OpenAI、Gemini、HF Inference Endpoints、llama.cpp、vLLM 等)。
Responses API:将大脑与语音循环解耦
系统的主要瓶颈是 LLM 推理延迟。为了解决这个问题,我们支持通过 Responses API 协议暴露的外部推理引擎。
因此,speech-to-speech 引擎支持第二种模式,即只要 LLM 使用 Responses API 协议,它就可以运行在独立的进程中。你在一个终端中启动模型服务器,在另一个终端中启动语音循环,两者通过 HTTP 通信。
选项 1:一个终端运行 llama.cpp,另一个终端运行 speech-to-speech
终端 1:llama.cpp 服务器:
llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full
终端 2:speech-to-speech 客户端:
speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
--tts qwen3 \
--llm_backend responses-api \
--model_name "unsloth/Qwen3-4B-Instruct-2507-GGUF" \
--responses_api_base_url "http://127.0.0.1:8080/v1"
选项 2:一个终端运行 vLLM,另一个终端运行 speech-to-speech
需要 vLLM ≥ 0.21.0。 对 Responses API 协议的完整支持,包括 speech-to-speech 后端使用的工具调用流式处理,已在 vLLM 0.21.0 中实现。旧版本可以启动,但当助手尝试调用工具时会出错。
当通过 vLLM 为此流水线提供模型服务时,实际上需要三个标志:
--enable-auto-tool-choice--tool-call-parser <tool_parser_name>— 选择按模型系列划分的解析器,将模型的原始输出转换为结构化的工具调用(例如,Qwen3 instruct 模型使用qwen3_coder,Llama 3 使用llama3_json,Hermes 风格模型使用hermes等)。--default-chat-template-kwargs '{"enable_thinking":false}':禁用支持该功能的模型的<think>推理通道。对于更困难的 agentic 任务,你可以将其设置为true让模型进行推理,但对于自然的对话体验,我们强烈建议保持关闭:每一个思考 token 都是用户在机器人开始说话前听到的静默延迟。
终端 1:vLLM 推理服务器(Qwen/Qwen3-4B-Instruct-2507):
vllm serve Qwen/Qwen3-4B-Instruct-2507 \
--port 8000 \
--host 127.0.0.1 \
--max-model-len 32768 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--default-chat-template-kwargs '{"enable_thinking":false}' \
--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":1}'
--speculative-config行启用了 Multi-Token Prediction (MTP)。它是可选的,但对端到端延迟有很大影响。只要模型支持,就保持启用。
终端 2:speech-to-speech 客户端:
speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
--tts qwen3 \
--llm_backend responses-api \
--model_name "Qwen/Qwen3-4B-Instruct-2507" \
--responses_api_base_url "http://127.0.0.1:8000/v1"
选项 3:Hugging Face Inference Endpoints
相同的协议,但模型在 Hugging Face 管理的 GPU 上运行。将任何聊天模型部署为 Inference Endpoint,然后将语音循环指向端点 URL:
speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
--tts qwen3 \
--llm_backend responses-api \
--model_name "Qwen/Qwen3-4B-Instruct-2507" \
--responses_api_base_url "https://<your-endpoint>.endpoints.huggingface.cloud/v1" \
--responses_api_api_key "$HF_TOKEN"
选项 4:Hugging Face Inference Providers
如果你不想管理自己的端点,可以使用 Inference Provider。Hugging Face 通过单个 URL 将你的请求路由到第三方后端(例如 Together、Fireworks、Replicate):
speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
--tts qwen3 \
--llm_backend responses-api \
--model_name "Qwen/Qwen3.6-35B-A3B:deepinfra" \
--responses_api_base_url "https://router.huggingface.co/v1" \
--responses_api_api_key "$HF_TOKEN"
选项 5:OpenAI(或任何兼容 OpenAI 的提供商)
当你想在零基础设施的情况下测试前沿模型时,将相同的标志指向 OpenAI:
speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
--tts qwen3 \
--llm_backend responses-api \
--model_name "gpt-5.4" \
--responses_api_api_key "$OPENAI_API_KEY"
--responses_api_* 标志适用于任何实现该协议的提供商(OpenRouter、Together、Fireworks 等)。只需替换 base URL 和 API key,流水线的其余部分保持不变。
在进程中运行 LLM
选项 1:在 MLX 上运行本地 LLM(Apple Silicon)
如果你使用的是 Mac,MLX 是以合理延迟运行真实模型的最简单方式。我们推荐 Qwen3-4B-Instruct-2507,它在 M 系列芯片上足够小,感觉即时,并且能力足以进行对话。
speech-to-speech \
--llm_backend mlx-lm \
--model_name "mlx-community/Qwen3-4B-Instruct-2507-bf16"
默认情况下,服务器监听 ws://127.0.0.1:8765/v1/realtime。保持运行,将对话应用连接到本地后端,你就可以与机器人对话了。
选项 2:在 Transformers 上运行本地 LLM(CUDA / CPU / MPS)
同样的思路,但使用原生的 transformers。如果你使用的是 CUDA 机器、Linux,或者想自由地更换模型而无需为 MLX 重新转换权重,请使用此选项。
speech-to-speech \
--llm_backend transformers \
--model_name "Qwen/Qwen3-4B-Instruct-2507"
提示。
Qwen3-4B-Instruct-2507是 LLM 的另一个好选择,因为它在单个消费级 GPU 上提供了良好的速度/质量平衡。你可以将--model_name指向后端支持的任何 HF 模型——例如更大的 Gemma、Qwen 或 Mistral。
在笔记本电脑上运行引擎,在机器人上运行应用
如果你在笔记本电脑上运行语音引擎,而在 Reachy Mini Wireless 上运行对话应用,唯一变化的是 URL。确保引擎绑定到 LAN 地址(不仅仅是 127.0.0.1),并在 UI 中选择 IP 时使用机器人的笔记本电脑 IP。
如果你不知道自己的 IP,以下是查找方法:
macOS
ipconfig getifaddr en0 # wifi
ipconfig getifaddr en1 # ethernet (有时是 en0,视情况而定)
Linux
hostname -I
Windows
ipconfig
在活动适配器下查找 "IPv4 Address"。
你需要的是 192.168.x.x 或 10.x.x.x 的地址。如果你看到 169.254.x.x,说明你实际上没有连接到网络。
总结
你现在拥有了一个完全本地的语音循环:
- 机器人使用 Silero 进行监听,
- 使用 Parakeet-TDT 进行转录,
- 使用你选择的任何 LLM 进行思考,无论是本地的 MLX、本地的 Transformers、旁边的 vLLM 或 llama.cpp 服务器,还是托管的 Responses API 端点,
- 并使用 Qwen3-TTS 进行回答。
请为 huggingface/speech-to-speech 和 pollen-robotics/reachy_mini_conversation_app 加星,并在讨论区告诉我们你最终在机器人上运行了哪个开源级联方案。