Переводчик речи в реальном времени для видео- и голосовых звонков. Переводит обе стороны разговора на лету: вы говорите на своём языке, собеседник слышит на своём, и наоборот.
Как это работает: Аудио с микрофона проходит через распознавание речи (STT), переводится LLM, синтезируется обратно в речь (TTS) и направляется в звонок. То же самое происходит в обратную сторону для аудио собеседника.
Поддерживает 29 языков с STT, переводом и TTS. Голосовые модели от Piper — скачиваются прямо из веб-интерфейса.
Внимание: только macOS (14+). Использует CoreAudio и cpal для захвата аудио. Поддержка Windows/Linux пока отсутствует — принимаем контрибуции!
Установка одной командой (macOS с Homebrew):
git clone https://github.com/youruser/realtime-call-translator.git
cd realtime-call-translator
./setup.sh
Скрипт устанавливает все зависимости, скачивает голосовые модели для английского и русского, и собирает проект.
Далее:
# Вставьте API-ключи
nano .env
# Запуск
./run.sh
Откройте http://127.0.0.1:5050 в Google Chrome — откроется веб-интерфейс с настройками.
Браузер: Используйте Chrome — аудио-монитор и маршрутизация через BlackHole работают корректно. В Safari монитор не работает из-за ограничений аудио-выхода браузера. Другие браузеры не тестировались.
Нужны два бесплатных API-ключа: - Deepgram — распознавание речи - Groq — перевод (LLM)
Введите их в Settings (иконка шестерёнки) или в файле
.env.
┌─────────────┐ ┌──────────────┐ ┌───────────┐ ┌─────────┐
│ Ваш микро- │────>│ Deepgram STT │────>│ Groq LLM │────>│ Piper │──> Звонок
│ фон (рус.) │ │ (речь→текст) │ │ (перевод) │ │ TTS │ (BlackHole)
└─────────────┘ └──────────────┘ └───────────┘ └─────────┘
┌─────────────┐ ┌──────────────┐ ┌───────────┐ ┌─────────┐
│ Аудио │────>│ Deepgram STT │────>│ Groq LLM │────>│ Piper │──> Динамики
│ звонка │ │ (речь→текст) │ │ (перевод) │ │ TTS │
└─────────────┘ └──────────────┘ └───────────┘ └─────────┘
| Зависимость | Назначение | Установка |
|---|---|---|
| macOS 14+ | CoreAudio для аудио I/O | — |
| Homebrew | Пакетный менеджер | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
| Elixir | Рантайм приложения | brew install elixir |
| Rust | Аудио-движок | brew install rustup && rustup-init |
| Python 3 | Веб-сервер UI | brew install python@3 |
| espeak-ng | Фонемизация для TTS | brew install espeak-ng |
| ONNX Runtime | Инференс моделей | brew install onnxruntime |
| Flask | Веб-фреймворк | через venv (см. ниже) |
| BlackHole | Виртуальная маршрутизация аудио | Скачать вручную |
| Xcode CLT | C-компилятор для Rust | xcode-select --install |
API-ключи (есть бесплатные тарифы): - Deepgram — распознавание речи (модель Nova-3) - Groq — перевод через llama-3.3-70b
Если хотите установить всё пошагово вместо setup.sh:
xcode-select --install
brew install elixir rustup espeak-ng onnxruntime python@3
rustup-init -y --default-toolchain stable
source ~/.cargo/env
# Виртуальное окружение и Flask
python3 -m venv .venv
source .venv/bin/activate
pip install flask
Скачайте и установите с existential.audio/blackhole.
Нужны оба: - BlackHole 16ch — захватывает аудио из приложения для звонков (Google Meet, Zoom и т.д.) - BlackHole 2ch — отправляет переведённое аудио обратно в звонок
Настройка в приложении для звонков (Google Meet, Zoom и т.д.): 1. Откройте звонок в Google Chrome (не Safari) 2. Установите BlackHole 2ch как микрофон в приложении для звонков 3. Установите BlackHole 16ch как динамики в приложении для звонков
Важно: НЕ используйте Multi-Output Device — это может вызвать проблемы со звуком. Устанавливайте устройства BlackHole напрямую в настройках приложения для звонков.
TTS-голоса от Piper. Скрипт установки автоматически скачивает голоса для английского и русского. Дополнительные голоса можно скачать из веб-интерфейса — выберите язык и нажмите кнопку загрузки.
Для ручной загрузки:
mkdir -p models/piper-en models/piper-ru
# Английский (по умолчанию)
curl -sL https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ryan/medium/en_US-ryan-medium.onnx \
-o models/piper-en/en_US-ryan-medium.onnx
curl -sL https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ryan/medium/en_US-ryan-medium.onnx.json \
-o models/piper-en/en_US-ryan-medium.onnx.json
# Русский (по умолчанию)
curl -sL https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx \
-o models/piper-ru/ru_RU-denis-medium.onnx
curl -sL https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx.json \
-o models/piper-ru/ru_RU-denis-medium.onnx.json
Все доступные голоса: rhasspy.github.io/piper-samples.
cp .env.example .env
Отредактируйте .env:
DEEPGRAM_API_KEY=ваш_ключ
GROQ_API_KEY=ваш_ключ
ORT_DYLIB_PATH=/opt/homebrew/lib/libonnxruntime.dylib
mix deps.get
mix compile # Компилирует Elixir + Rust (первая сборка занимает несколько минут)
./run.sh
Откройте http://127.0.0.1:5050 в Chrome.
| Язык | STT | Перевод | TTS |
|---|---|---|---|
| Английский | + | + | + |
| Арабский | + | + | + |
| Вьетнамский | + | + | + |
| Голландский | + | + | + |
| Греческий | + | + | + |
| Датский | + | + | + |
| Индонезийский | + | + | + |
| Испанский | + | + | + |
| Итальянский | + | + | + |
| Каталанский | + | + | + |
| Китайский | + | + | + |
| Корейский | + | + | — |
| Латышский | + | + | + |
| Немецкий | + | + | + |
| Норвежский | + | + | + |
| Персидский | + | + | + |
| Польский | + | + | + |
| Португальский | + | + | + |
| Румынский | + | + | + |
| Русский | + | + | + |
| Турецкий | + | + | + |
| Украинский | + | + | + |
| Венгерский | + | + | + |
| Финский | + | + | + |
| Французский | + | + | + |
| Хинди | + | + | + |
| Чешский | + | + | + |
| Шведский | + | + | + |
| Японский | + | + | — |
Для TTS нужно скачать голосовую модель Piper для языка (в один клик из веб-интерфейса). Японский и корейский поддерживают STT и перевод, но не имеют голосовой модели Piper.
"Engine not starting"
- Проверьте, что в .env указаны валидные API-ключи
- Убедитесь, что ORT_DYLIB_PATH указывает на библиотеку onnxruntime
- Запустите mix compile для проверки ошибок сборки
"Нет аудио из звонка" - Убедитесь, что BlackHole 16ch настроен в Multi-Output Device - Проверьте, что приложение для звонков использует BlackHole 2ch как микрофон
"TTS не работает"
- Проверьте, что установлен espeak-ng: espeak-ng --version
- Убедитесь, что файлы голосовых моделей есть в models/piper-{lang}/
- Скачайте голоса из Settings в веб-интерфейсе
"Нет звука в мониторе" - Используйте Chrome — Safari не поддерживает маршрутизацию аудио-выхода, необходимую для монитора - Проверьте, что системный аудио-выход установлен на динамики (не на BlackHole)
"Ключ Groq показывает invalid"
- Скорее всего ключ валиден — проверьте кнопкой "Test" в Settings
- Ключи из .env работают автоматически, даже если поле в UI пустое
MIT
$ claude mcp add call-translator \
-- python -m otcore.mcp_server <graph>