← Блог

Как я сделал голосового ассистента из Claude Code

Сережа Рис · 24 January 2026

claude codettsgemini

Вчера пропустил момент, когда Claude Code закончил рефакторинг. Отвлёкся на кофе, вернулся через 10 минут — а он давно ждёт следующий промпт.

Надоело. Написал hook, который озвучивает ответы агента.

Проблема

Работаю с Claude Code часов по 5-6 в день. Агент делает задачу, я жду. Раз в час точно отвлекаюсь и пропускаю момент готовности. За неделю набегает минут 40 потерянного времени.

Хотел звуковое уведомление. Но системный звук бесит.

Как устроено

Три компонента:

TTS daemon — Python-процесс, который держит открытое WebSocket-соединение к Gemini Live API. Почему daemon? Потому что установка соединения занимает 300-400мс, а с постоянным коннектом озвучка стартует мгновенно.

Stop hook — срабатывает когда Claude Code завершает ответ. Извлекает текст из транскрипта, шлёт в daemon.

Конфиг — голос, стиль, язык. Можно менять на лету.

Настройка

Daemon

python3 ~/.claude/hooks/tts_daemon.py &

Код на 500 строк, но суть простая: слушает Unix socket /tmp/claude-tts.sock, получает текст, отдаёт Gemini, играет аудио через afplay. Кеширует одинаковые фразы.

Hook

В ~/.claude/settings.json:

{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "command",
        "command": "python3 ~/.claude/hooks/speak_hook.py",
        "timeout": 15000
      }]
    }]
  }
}

Конфиг голоса

~/.claude/tts_config.json:

{
  "mode": "summary",
  "voice": "Aoede",
  "style": "fast_asmr",
  "language": "russian",
  "max_chars": 1000
}

mode: summary — ключевая штука. Gemini не читает весь текст, а пересказывает в 1-2 предложения. Когда агент выдаёт 50 строк технического ответа — слышу короткое “Готово, добавил три теста и поправил импорты”.

Голос Aoede — по-моему, самый приятный из пяти доступных (ещё есть Puck, Charon, Kore, Fenrir). В ASMR-режиме звучит как мягкий шёпот.

Как это работает

  1. Пишу промпт Claude Code
  2. Агент выполняет задачу, генерирует ответ
  3. Claude Code завершает ответ → срабатывает Stop hook
  4. Hook извлекает текст последнего сообщения
  5. Текст уходит в daemon через Unix socket
  6. Daemon отправляет в Gemini с инструкцией суммаризировать
  7. Gemini возвращает аудио
  8. macOS проигрывает через afplay

На моём M2 Pro от шага 3 до шага 8 проходит 1.5-2 секунды.

Результат

Могу отойти от компа. Когда агент заканчивает — слышу голос с пересказом.

Для длинных задач типа “прогони тесты и пофикси что упадёт” — то что надо.

Альтернативы

cc-hooks — готовый плагин с несколькими TTS-провайдерами.

Claude-to-Speech — через ElevenLabs, голоса качественнее, но платно.

pyttsx3 — локально без API, но голос как из Windows 98.

Я выбрал Gemini из-за суммаризации. ElevenLabs просто читает текст, Gemini может пересказать.

Источники

Подписаться на обновления — @sereja_tech