From 54c9fdb75b8cceca9d0f34df3cb06644af3fcc1c Mon Sep 17 00:00:00 2001 From: Cosmo Date: Sat, 11 Apr 2026 15:00:07 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84=20auto-sync=202026-04-11=2015:00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Voice Assistant Roadmap.md | 352 ++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 Projects/Voice Assistant Roadmap.md diff --git a/Projects/Voice Assistant Roadmap.md b/Projects/Voice Assistant Roadmap.md new file mode 100644 index 0000000..f33c21c --- /dev/null +++ b/Projects/Voice Assistant Roadmap.md @@ -0,0 +1,352 @@ +# 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 +```json +{ + "messages": { + "tts": { + "auto": "inbound", + "provider": "elevenlabs", + "elevenlabs": { + "apiKey": "", + "voiceId": "", + "modelId": "eleven_multilingual_v2", + "stability": 0.5, + "similarityBoost": 0.75, + "style": 0.0, + "useSpeakerBoost": true, + "speed": 1.0, + "languageCode": "ru" + } + } + } +} +``` + +### Конфиг для Люси +То же самое, но с другим `voiceId` — женский голос. + +### Как создать кастомные голоса +1. Зарегистрироваться на elevenlabs.io +2. Voice Lab → Add Generative or Cloned Voice +3. Для клонирования: загрузить ~1 мин чистого аудио +4. Скопировать Voice ID из настроек голоса +5. Обновить `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 → Алиса + +```python +# Упрощённый цикл: +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, нужно дописывать + +```bash +# Запуск 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 интеграция + +### Что нужно +1. **Long-Lived Token** в Home Assistant +2. **Skill для OpenClaw** — описание API эндпоинтов +3. **Entity ID** для каждого устройства + +### Skill файл +``` +~/.openclaw/workspace/skills/home-assistant/SKILL.md +``` + +Содержимое: +- Base URL: `http://: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) +- [x] Разделить агентов на два Gateway +- [x] Настроить 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 | Уже есть, хорошее качество звука |