Голосове введення
Статус: працює з 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, а не до символу розкладки).
- Говори. Анімація хвилі + помаранчева рамка показують, що йде запис.
- Натисни кнопку мікрофона ще раз (або шорткат), щоб зупинити.
- Розпізнаний текст зʼявиться в композері — відредагуй за потреби і натисни Send.
Безперервний режим: 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 дозволено, а крос-доменні вбудовування заблоковано.
Обмеження:
- Потрібен Chrome або Edge (на базі Chromium). Firefox і Safari автоматично переходять на L2.
- Якість транскрипції залежить від серверів Google (їх викликає браузер, а не Arc OS).
L2 — Self-hosted whisper.cpp
Arc OS тримає постійний arc-whisper.service на Contabo з попередньо завантаженою моделлю ggml-base (142 MB). Коли браузер не підтримує Web Speech API, композер автоматично переходить на цей рівень:
- Браузер записує WebM-кліп через
MediaRecorder. - На зупинці кліп
POST-иться на/api/crm/voice/transcribe(multipart, макс. 25 MB). - Сервер передає його локальному 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 endpoint:
POST /api/crm/voice/transcribe