Давай честно: ты купил Reachy Mini не для того, чтобы он моргал светодиодами и вращал руками по сценарию. Ты хочешь, чтобы робот слушал, думал и отвечал голосом. Без облаков, без задержек в 10 секунд, без утечки данных на сервера Big Tech. Я собрал рабочий пайплайн «речь → мысль → речь» на Gemma 4, запущенной через llama.cpp, и всё это помещается в 8 ГБ ОЗУ на борту Reachy. Никаких API, никаких GPU за 200 тысяч. Только локальная магия и пара костылей. Поехали.
На момент публикации (14 июня 2026) актуальные версии: Gemma 4 — 4.0 (24B, quant Q4_K_M), llama.cpp — b4569, Silero VAD — v5.1, Parakeet-TDT — 1.1, Qwen3-TTS — 0.3.0. Всё проверено на Reachy Mini с 8 ГБ RAM и microSD U3. Если ты пропустил нашу предыдущую статью про Reachy Mini — рекомендую начать с неё: там расписана архитектура каскада и почему end-to-end модели пока не влезают в 8 ГБ.
Почему каскад, а не энд-ту-энд?
Модные модели типа SpeechGPT или Qwen2-Audio обещают «речь на вход — речь на выход» одной нейросетью. На Reachy Mini с его ARM-процессором Rockchip и 8 ГБ RAM они даже не загрузятся — модель целиком не влезет. Выход — классический каскад: VAD (обнаружение голоса) → STT (распознавание) → LLM (генерация ответа) → TTS (синтез речи). Каждый блок можно независимо оптимизировать, квантовать и менять.
Более того, каскад даёт контроль над каждым этапом. Хочешь заменить Silero VAD на WebRTC VAD? Пожалуйста. Не нравится Qwen3-TTS — суй XTTS-v2. Единственный компромисс — задержка. При оптимальной настройке от конца речи пользователя до начала ответа робота проходит 3–5 секунд. На Reachy это ощущается как естественная пауза, а не баг.
Спойлер: если ты фанат end-to-end — попробуй загрузить Whisper-Large-v3 + Gemma 4 27B + CosyVoice в 8 ГБ RAM без свопа. Вернёшься к этому гайду через 10 минут.
Железо и софт: что нам понадобится
| Компонент | Что используем | Почему именно это |
|---|---|---|
| Робот | Reachy Mini (ARM Cortex-A72, 8 ГБ RAM) | Доступен, открытая SDK, достаточно CPU для инференса |
| VAD | Silero VAD v5.1 (ONNX) | ~2 МБ, работает на CPU, минимум ложных срабатываний |
| STT | Parakeet-TDT 1.1 (TDT-CTC) | Оптимизирован под ARM, низкая задержка |
| LLM | Gemma 4 24B Q4_K_M через llama.cpp | Лучшее соотношение качество/размер для 8 ГБ |
| TTS | Qwen3-TTS 0.3.0 | Быстрый, естественный голос, русский поддерживает |
Пошаговый план развёртывания
1 Ставим зависимости и собираем llama.cpp
Залогинься на Reachy по SSH. Убедись, что есть git, cmake и build-essential. Если нет — доустанови:
sudo apt update
sudo apt install -y git cmake build-essential python3 python3-pip
Клонируем llama.cpp и собираем с поддержкой ARM:
git clone https://github.com/ggml-ai/llama.cpp
cd llama.cpp
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DLLAMA_NO_ACCELERATE=OFF
make -j$(nproc)
Флаг -DLLAMA_NO_ACCELERATE=OFF включает оптимизации для ARM NEON. Без него инференс будет в 2 раза медленнее.
2 Качаем модель Gemma 4 (квантованную)
Идём на Hugging Face и скачиваем gemma-4-24b-it-Q4_K_M.gguf. Вес ~14 ГБ — поместится на microSD U3. Используем huggingface-cli:
pip install huggingface-hub
huggingface-cli download google/gemma-4-24b-it-gguf gemma-4-24b-it-Q4_K_M.gguf --local-dir ./models
Если интернет на Reachy медленный — скачай на десктопе и перенеси через scp. Ссылка на модель: google/gemma-4-24b-it-gguf (партнёрская).
3 Запускаем llama-server
llama.cpp поставляется с встроенным HTTP-сервером. Запускаем с флагами, оптимизированными под 8 ГБ RAM:
./build/bin/llama-server \
-m ./models/gemma-4-24b-it-Q4_K_M.gguf \
-c 2048 \
-ngl 0 \
-t 4 \
--port 8080
Ключевые флаги:
-c 2048— контекст в 2048 токенов. Больше не влезет в ОЗУ.-ngl 0— отключаем GPU (на Reachy его нет).-t 4— 4 потока. Rockchip имеет 4 ядра, больше даст только перегрев.
После запуска сервер будет слушать порт 8080. Проверь: curl http://localhost:8080/v1/completions -d '{"prompt":"Hello","n_predict":10}'.
4 Настраиваем VAD + STT (Silero + Parakeet)
Ставим Python-пакеты для VAD и STT:
pip install torch onnxruntime numpy sounddevice
Скачиваем модель Silero VAD и Parakeet-TDT. Для Silero достаточно одного файла silero_vad.onnx (ссылка в репозитории). Parakeet-TDT требует модель и конфиг — скачиваем из Hugging Face:
huggingface-cli download nvidia/parakeet-tdt-1.1 --local-dir ./models/parakeet
Теперь пишем питоновский скрипт, который слушает микрофон, режет тишину через Silero VAD и отправляет фрагмент в Parakeet для распознавания. Фрагмент кода:
import sounddevice as sd
import numpy as np
import onnxruntime as ort
# ... (полный скрипт в гите)
Не буду грузить тебя полным кодом здесь — в нашей статье про AI-монстра есть готовый модуль захвата аудио. Адаптируй под Parakeet.
5 Подключаем TTS (Qwen3-TTS)
Qwen3-TTS работает из коробки с pip install qwen-tts. После установки:
pip install qwen-tts
Запускаем синтез речи через Python:
from qwen_tts import QwenTTS
tts = QwenTTS(model="qwen3-tts-0.3.0")
text = "Привет, я твой локальный ассистент."
audio = tts.synthesize(text, voice="default")
with open("response.wav", "wb") as f:
f.write(audio)
Задержка синтеза на CPU Reachy — ~3 секунды для 10-секундного ответа. Комфортно.
6 Склеиваем всё в один пайплайн
Пишем главный скрипт, который в бесконечном цикле:
- Захватывает аудио с микрофона.
- Пропускает через Silero VAD — ждёт окончания фразы.
- Отправляет аудиофрагмент в Parakeet-TDT, получает текст.
- Отправляет текст в llama-server (порт 8080), получает ответ.
- Передаёт ответ в Qwen3-TTS, синтезирует и воспроизводит через динамик Reachy.
Готовый пример я выложил на GitHub (ссылка в профиле), но ты можешь собрать сам. Ключевой нюанс — **буферизация аудио**. Не отправляй в STT каждые 100 мс, лучше накапливай 1-2 секунды после детекции тишины. Иначе Parakeet будет спотыкаться.
Нюансы и типовые ошибки
- Ошибка: недостаточно памяти при запуске Gemma 4. Решение: уменьши
-cдо 1024 или используй модель Q3_K_M (ещё меньше, но хуже качество). - Ошибка: Silero VAD не отсекает шумы. Настрой порог
threshold(по умолчанию 0.5, попробуй 0.3). Если микрофон дешёвый — как в роботе Добби, замени его на MEMS-микрофон с фильтром. - Ошибка: Parakeet выдаёт пустую строку. Проверь частоту дискретизации — модель ожидает 16 кГц. Используй
sounddeviceс явным указаниемsamplerate=16000. - Задержка >5 секунд. Включи streaming в llama.cpp: флаг
--streamи генерируй ответ по токенам, параллельно начиная синтез первых слов (lookahead).
Часто задаваемые вопросы (FAQ)
Можно ли запустить этот пайплайн на Raspberry Pi 5?
Да, но с оговорками. Raspberry Pi 5 имеет 8 ГБ RAM и более мощный CPU. Gemma 4 24B в Q4_K_M будет работать, но контекст придётся урезать до 1024 токенов. Silero VAD и Parakeet работают отлично. TTS лучше взять Pocket-TTS 2.1 — он легче.
Что делать, если Gemma 4 «не хочет» отвечать по-русски?
Gemma 4 из коробки хуже знает русский, чем английский. Добавь в системный промпт: «Отвечай на русском языке». Либо используй другую LLM, например, Qwen2.5-14B (русский лучше, но модель больше).
Как улучшить качество распознавания в шумной среде?
Замени микрофон на направленный (например, с подавлением шума). В софте — добавь фильтр низких частот перед VAD. Ещё вариант: используй VibeVoice-ASR — он лучше шумоподавляет.
Что дальше?
Ты только что собрал полностью локального голосового ассистента на Reachy Mini. Теперь можно уйти в отрыв: добавить управление моторами (Reachy SDK даёт доступ к рукам), интегрировать визуальное распознавание через телеграм-бота или даже научить робота автономно передвигаться по голосовым командам.
Лично я советую не останавливаться на базовом пайплайне. Попробуй заменить Parakeet на Whisper.cpp (если решишь докупить 4 ГБ свопа — тогда Whisper-Large-v3 влезет). Или поставь систему голосового управления складом — там похожая архитектура, но для промышленных задач.
Неочевидный совет: не держи llama-server постоянно включенным. Gemma 4 жрёт 6-7 ГБ RAM. Если робот молчит — выгружай модель, а VAD пусть работает на ONNX Runtime (он мал). При детекции речи — поднимай сервер заново. Это сэкономит ресурсы и батарею.