16 KiB
Cosmo & Люся — Голосовой ассистент дома
Дорожная карта: от теста на маке до продакшн-системы Обновлено: 2026-04-11
Текущий статус
| Компонент | Статус |
|---|---|
| Два Gateway (Cosmo :18789, Люся :18790) | ✅ Работает |
| systemd units для обоих | ✅ Настроены |
| Telegram боты раздельные | ✅ Работает |
| Workspace и память перенесены | ✅ Готово |
| MacBook нода подключена | ✅ К Cosmo |
| Wake words | ✅ "космо", "cosmo" |
| TTS Cosmo | ✅ DmitryNeural (муж.) |
| TTS Люся | ✅ SvetlanaNeural (жен.) |
| ElevenLabs | ❌ Не настроен |
| Home Assistant skill | ❌ Не создан |
| Pi satellite | ❌ Не начато |
Фаза 1 — Тест голоса на MacBook (сейчас)
Что работает
- MacBook подключён как нода к Cosmo Gateway (:18789)
- Wake word "космо" активирует голосовой ввод
- Apple Speech распознаёт русскую речь локально (быстро)
- TTS через Microsoft Edge — DmitryNeural
Чек-лист
- Сказать "Космо" → звук активации
- Голосовой вопрос → голосовой ответ
- Проверить что сессия создалась под agent
main - Telegram Светы работает параллельно через Люсю (:18790)
Известные ограничения
- Android voice wake отключен (только ручной микрофон)
- Нет нативного Linux companion app (только headless node host)
- Нельзя маршрутизировать voice vs text на разные модели нативно
Фаза 2 — Уникальные голоса (ElevenLabs)
Зачем
Microsoft Edge TTS звучит нормально (7/10), но:
- Нельзя клонировать/создать уникальный голос
- Ограниченная выразительность
- Нет контроля стиля и эмоций
Сравнение провайдеров
| Провайдер | Задержка | Качество | Цена | Кастомный голос |
|---|---|---|---|---|
| Microsoft Edge (сейчас) | ~300ms | 7/10 | Бесплатно | ❌ Только пресеты |
| ElevenLabs | ~500ms | 10/10 | $5/мес | ✅ Клонирование |
| OpenAI TTS | ~400ms | 9/10 | $15/1M chars | ❌ Только пресеты |
| Silero (локально) | ~100ms | 6/10 | Бесплатно | ❌ |
Рекомендация: ElevenLabs
Почему: Лучшее качество + можно создать уникальные голоса для Cosmo и Люси.
План $5/мес (Starter):
- 30,000 символов/мес (~15 мин речи)
- До 10 кастомных голосов
- Instant Voice Cloning
- Multilingual v2 модель (русский ✅)
Конфиг для Cosmo
{
"messages": {
"tts": {
"auto": "inbound",
"provider": "elevenlabs",
"elevenlabs": {
"apiKey": "<ELEVENLABS_API_KEY>",
"voiceId": "<cosmo-voice-id>",
"modelId": "eleven_multilingual_v2",
"stability": 0.5,
"similarityBoost": 0.75,
"style": 0.0,
"useSpeakerBoost": true,
"speed": 1.0,
"languageCode": "ru"
}
}
}
}
Конфиг для Люси
То же самое, но с другим voiceId — женский голос.
Как создать кастомные голоса
- Зарегистрироваться на elevenlabs.io
- Voice Lab → Add Generative or Cloned Voice
- Для клонирования: загрузить ~1 мин чистого аудио
- Скопировать Voice ID из настроек голоса
- Обновить
openclaw.jsonобоих инстансов
Фоллбэк
Оставить Microsoft Edge TTS как запасной — если ElevenLabs недоступен или лимит исчерпан.
Продвинутые возможности
В ответах можно менять голос на лету:
[[tts:voiceId=XXXXX stability=0.3 speed=1.2]]
Текст с другим голосом
Фаза 3 — Оптимизация скорости
Узкие места (по порядку задержки)
| Этап | Текущая задержка | Оптимизация |
|---|---|---|
| STT (речь→текст) | ~200ms (Apple Speech) | ✅ Уже быстро |
| Сеть (MacBook→Gateway) | ~10ms (LAN) | ✅ Уже быстро |
| LLM ответ | ~2-5 сек (через proxy) | 🔧 Haiku для голоса |
| TTS (текст→речь) | ~300ms (Edge) / ~500ms (ElevenLabs) | Приемлемо |
| Итого | ~3-6 сек | Цель: <2 сек |
Стратегия ускорения
1. Модель для голосовых сессий
- Сейчас:
claude-code-proxy(проксирует через Claude Code CLI → медленно) - Для голоса лучше:
anthropic/claude-haiku-4-5напрямую — в 3-5x быстрее - OpenClaw не может автоматически различать voice vs text
- Решение: В SOUL.md добавить правило — голосовые ответы короткие (2-3 предложения)
- Альтернатива: Для критичной скорости — отдельный binding для ноды с override модели
2. Короткие ответы для голоса Добавить в SOUL.md:
## Голосовые ответы
Если сообщение пришло от ноды (не Telegram): отвечай максимально кратко.
- 1-3 предложения для простых вопросов
- Не используй markdown, списки, таблицы — только текст
- Числа произноси словами когда уместно
3. Streaming TTS
OpenClaw поддерживает streaming для Telegram (streaming: "partial"). Для голосовых ответов streaming не применяется — ответ генерируется целиком, потом озвучивается. Это ОК для коротких ответов.
Фаза 4 — Raspberry Pi Satellite
Архитектура
Комната Сервер (N100, 192.168.31.103)
┌─────────────────────┐ ┌──────────────────────────────┐
│ Raspberry Pi 5 │ │ Gateway :18789 (Cosmo) │
│ │ WS/LAN │ Gateway :18790 (Люся) │
│ USB микрофон ───► │─────────►│ │
│ OpenClaw node host │ │ Claude Haiku/Sonnet │
│ (headless) │◄─────────│ ElevenLabs TTS │
│ │ аудио │ Web search, exec, memory │
│ ▼ │ │ Home Assistant API │
│ BT колонка Алиса │ │ │
└─────────────────────┘ └──────────────────────────────┘
Проблема: нет нативного Linux companion app
OpenClaw companion apps есть только для macOS, iOS, Android. На Linux доступен только headless node host (openclaw node run), который:
- ✅ Подключается к Gateway по WebSocket
- ✅ Выполняет
system.runкоманды - ❌ Не имеет STT/TTS/Voice Wake функционала
Варианты решения для Pi
Вариант A: Кастомный satellite скрипт (Python)
Плюсы: Полный контроль, можно два wake word на одном Pi Минусы: Нужно писать и поддерживать код, Porcupine платный для кастомных слов
Компоненты:
- Wake word: Picovoice Porcupine ($5/мес за кастомные ключевые слова)
- Бесплатно: "пикомон", "терминус" и другие встроенные (русских нет)
- Платно: кастомные "космо", "люся" на русском
- Альтернатива: openWakeWord (бесплатно, но хуже качество на русском)
- STT: faster-whisper
smallна CPU (~2-3 сек на Pi 5) или Groq Whisper API (~300ms, нужен интернет) - Gateway API: HTTP POST на OpenClaw Gateway
- TTS: Получаем аудио от OpenClaw (ElevenLabs/Edge)
- Воспроизведение: aplay через PulseAudio → Bluetooth → Алиса
# Упрощённый цикл:
while True:
if wake_word_detected():
play_activation_sound()
audio = record(seconds=6)
text = transcribe(audio) # faster-whisper или Groq API
response = send_to_openclaw(text) # HTTP API
play_tts(response.audio) # аудио от OpenClaw
Вариант B: OpenClaw node host + внешний STT/wake
Плюсы: Нативная интеграция с Gateway, сессии видны в UI Минусы: Нет готового voice pipeline, нужно дописывать
# Запуск headless node
openclaw node run --host 192.168.31.103 --port 18789
Потом отдельный скрипт слушает микрофон и шлёт текст через openclaw node send.
Вариант C: Ждать Linux companion app
OpenClaw активно развивается. Возможно появится Linux app с полным voice pipeline. Но это не гарантировано и не скоро.
Рекомендация: Вариант A (кастомный скрипт)
Самый гибкий. Можно:
- Два wake word ("космо" → :18789, "люся" → :18790) на одном Pi
- Выбрать STT (локальный whisper или облачный Groq)
- Полный контроль над audio pipeline
- Алиса как BT колонка
Железо
| Компонент | Вариант | Цена |
|---|---|---|
| Raspberry Pi 5 8GB | rpilocator.com | ~$80 |
| USB микрофон | ReSpeaker USB Mic Array (лучше) или любой plug-and-play | 500-3000₽ |
| MicroSD 32GB A2 | Samsung EVO | ~500₽ |
| БП USB-C 27W | Официальный Pi | ~$12 |
| Корпус | Argon ONE v3 (с охлаждением) | ~$25 |
| Колонка | Алиса в BT режиме | уже есть ✅ |
| Итого | ~$130 + 500₽ |
STT: локальный vs облачный
| Вариант | Задержка | Качество RU | Цена | Офлайн |
|---|---|---|---|---|
| faster-whisper small (Pi 5) | ~2-3 сек | 8/10 | Бесплатно | ✅ |
| faster-whisper tiny (Pi 5) | ~1 сек | 6/10 | Бесплатно | ✅ |
| Groq Whisper API | ~300ms | 9/10 | Бесплатно (rate limited) | ❌ |
| OpenAI Whisper API | ~500ms | 9/10 | $0.006/мин | ❌ |
Рекомендация: Groq Whisper API (уже настроен в OpenClaw, ключ есть) с фоллбэком на локальный whisper.
Фаза 5 — Home Assistant интеграция
Что нужно
- Long-Lived Token в Home Assistant
- Skill для OpenClaw — описание API эндпоинтов
- Entity ID для каждого устройства
Skill файл
~/.openclaw/workspace/skills/home-assistant/SKILL.md
Содержимое:
- Base URL:
http://<HA_IP>:8123 - Авторизация: Bearer token
- Основные команды: свет, климат, сцены, сенсоры
- Entity map: человекочитаемые имена → entity_id
Голосовые команды (примеры)
- "Космо, включи свет в гостиной" →
POST /api/services/light/turn_on - "Космо, какая температура дома" →
GET /api/states/sensor.temperature - "Космо, включи вечерний режим" →
POST /api/services/scene/turn_on
Когда делать
После переезда в квартиру (Q3 2026) и установки HA + Aqara устройств.
Фаза 6 — Финальная архитектура
MacBook ──────────┐
(wake: "космо") │
▼
iPhone ──────► Gateway :18789 ◄── Telegram (Даниил)
(нода) Cosmo (main)
Claude Haiku/Sonnet
ElevenLabs TTS (муж.)
Pi satellite ──┤
(wake: "космо") │
│
│
iPhone Светы ► Gateway :18790 ◄── Telegram (Света)
(нода) Люся (wife)
Claude Haiku
ElevenLabs TTS (жен.)
Pi satellite ──┘
(wake: "люся")
Один Pi — два агента
Можно запустить один Pi с двумя wake words:
- "космо" → HTTP к :18789
- "люся" → HTTP к :18790
Porcupine поддерживает несколько keyword одновременно. Скрипт определяет какой сработал и шлёт запрос на нужный порт.
Порядок действий
Сейчас (Фаза 1)
- Разделить агентов на два Gateway
- Настроить TTS (разные голоса)
- Протестировать голос с MacBook
- Добавить правила коротких ответов в SOUL.md
Ближайшее (Фаза 2-3)
- Зарегистрироваться на ElevenLabs
- Создать/выбрать голоса для Cosmo и Люси
- Обновить конфиги TTS
- Протестировать качество и задержку
- Оптимизировать модель для голоса
Среднесрочное (Фаза 4)
- Купить Raspberry Pi 5 + USB микрофон
- Написать satellite скрипт (Python)
- Настроить Porcupine wake words
- Подключить Алису по Bluetooth
- Протестировать полный pipeline
- Автозапуск через systemd
После переезда (Фаза 5-6)
- Настроить Home Assistant
- Создать HA skill
- Полная голосовая система дома
Ключевые решения
| Вопрос | Решение | Почему |
|---|---|---|
| TTS провайдер | ElevenLabs ($5/мес) | Лучшее качество + кастомные голоса |
| STT на Pi | Groq API + whisper фоллбэк | Скорость + надёжность |
| Wake word | Picovoice Porcupine | Лучший для кастомных слов |
| Модель для голоса | Haiku для простых, Sonnet для сложных | Баланс скорости и качества |
| Pi satellite | Кастомный Python скрипт | Полный контроль, два wake word |
| Колонка | Алиса по Bluetooth | Уже есть, хорошее качество звука |