Files
obsidian/Archive/Projects/Voice Assistant Roadmap.md

16 KiB
Raw Blame History

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 — женский голос.

Как создать кастомные голоса

  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 → Алиса
# Упрощённый цикл:
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 интеграция

Что нужно

  1. Long-Lived Token в Home Assistant
  2. Skill для OpenClaw — описание API эндпоинтов
  3. 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 Уже есть, хорошее качество звука