Голосовой ввод
Статус: работает с Phase 62 (2026-06-05). Self-hosted whisper.cpp на Contabo — без зависимости от OpenAI, аудио не покидает твой сервер.
Arc OS поддерживает два слоя голосового ввода в композере чата:
| Слой | Требует | Работает на |
|---|---|---|
| L1 — Web Speech API | Chrome или Edge (Chromium) | Все тарифы Arc |
| L2 — Self-hosted whisper | Любой браузер (WebM/WAV MediaRecorder) | Arc Standard Cloud, On-premise |
Оба слоя пишут текст в одно и то же поле композера и прозрачны для AI-воркера.
Использование голоса в чате
- Открой воркспейс любого проекта и поставь фокус в композер чата.
- Нажми кнопку микрофона (слева внизу композера) или Ctrl+Shift+V (работает на любой раскладке — шорткат привязан к физической клавише V, а не к символу раскладки).
- Говори. Анимация волны + оранжевая рамка показывают, что идёт запись.
- Нажми кнопку микрофона ещё раз (или шорткат), чтобы остановить.
- Расшифрованный текст появится в композере — при необходимости отредактируй и отправь.
Непрерывный режим: L1 слушает, пока ты не остановишь; L2 записывает один клип и отправляет его на транскрипцию.
L1 — Web Speech API (Chrome/Edge)
Использует встроенный API распознавания речи браузера. Работает мгновенно, без обращения к серверу.
Локаль: автоматически берётся из языковых настроек Arc. Поддерживаемые BCP-47-коды: uk-UA, en-US, de-DE, es-ES, fr-FR, pl-PL, ru-RU, pt-BR.
Разрешения: при первом использовании браузер запросит доступ к микрофону. Если ты случайно его заблокировал, открой Site settings → Microphone → Allow для arc-os.co. Заголовок Permissions-Policy на arc-os.co использует microphone=(self) — доступ с того же origin разрешён, а cross-origin-встраивания заблокированы.
Ограничения:
- Требуется Chrome или Edge (на базе Chromium). Firefox и Safari автоматически переходят на L2.
- Качество транскрипции зависит от серверов Google (их вызывает браузер, а не Arc OS).
L2 — Self-hosted whisper.cpp
Arc OS держит постоянный сервис arc-whisper.service на Contabo с предзагруженной моделью ggml-base (142 МБ). Когда браузер не поддерживает Web Speech API, композер автоматически переключается на этот слой:
- Браузер записывает WebM-клип через
MediaRecorder. - По остановке клип отправляется
POST-ом на/api/crm/voice/transcribe(multipart, максимум 25 МБ). - Сервер пересылает его локальному whisper-server на
127.0.0.1:19214— байты аудио никогда не покидают Contabo. - Расшифрованный текст возвращается и вставляется в композер.
Задержка: ~3.4 с для 11-секундного клипа (прогретая модель, 3.1× realtime на текущей 6-vCPU EPYC-машине).
Конкурентность: у whisper-server семафор на 2 слота. Если оба заняты, API возвращает 429 ("server busy"), и UI показывает тост — попробуй снова через несколько секунд.
Дневная квота
У каждого пользователя есть мягкий лимит 60 мин/день на L2-транскрипции. Сервер оценивает длительность клипа по размеру загрузки (предположение ~32 kbps голосового кодека, точность ±30%). При достижении лимита:
- API возвращает
429с{ "error": "Daily voice quota reached (60 min/day)", "used": <seconds>, "cap": 3600 } - Кнопка микрофона отключается до конца дня
- Квота сбрасывается в полночь UTC
L1 (Web Speech API) под этот лимит не подпадает — он использует собственный сервис браузера.
Устранение неполадок
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Кнопка микрофона серая | Дневная квота исчерпана | Подожди до полуночи UTC |
| "Microphone access blocked" | Браузер заблокировал микрофон | Site settings → Microphone → Allow для arc-os.co |
| L1 не работает в Firefox | Firefox не поддерживает Web Speech API | Автоматически переключается на L2 |
| 429 "server busy" | Два других пользователя транскрибируют | Повтори через ~5 с |
| Плохое качество транскрипта | Фоновый шум / базовая модель L2 | Говори чётко; Pro-транскрипция (модель крупнее) — в будущей фазе |
| Ctrl+Shift+V не реагирует | Фокус не в композере | Сначала кликни внутрь textarea композера |
Ссылки
shared/routes/voice.ts— обработчик эндпоинта (Phase 62.4, #373)shared/migrations/051_voice_usage.ts— таблица квотvoice_usage_logfrontend/src/crm/pages/workspace/Composer.jsx— компонент MicButtonarc-whisper.serviceна Contabo — конфиг демона whisper.cpp- API-эндпоинт:
POST /api/crm/voice/transcribe