Wprowadzanie głosowe
Status: Działa od Phase 62 (2026-06-05). Self-hosted whisper.cpp na Contabo — bez zależności od OpenAI, żadne audio nie opuszcza Twojego serwera.
Arc OS obsługuje dwie warstwy wprowadzania głosowego w composerze czatu:
| Warstwa | Wymaga | Działa w |
|---|---|---|
| L1 — Web Speech API | Chrome lub Edge (Chromium) | Wszystkie plany Arc |
| L2 — Self-hosted whisper | Dowolna przeglądarka (MediaRecorder WebM/WAV) | Arc Standard Cloud, On-premise |
Obie warstwy zasilają to samo pole tekstowe composera i są transparentne dla workera AI.
Używanie głosu w czacie
- Otwórz workspace dowolnego projektu i ustaw fokus na composerze czatu.
- Kliknij przycisk mikrofonu (lewy dolny róg composera) lub naciśnij Ctrl+Shift+V (działa na każdym układzie klawiatury — skrót odpowiada fizycznemu klawiszowi V, nie znakowi układu).
- Mów. Animacja fali dźwiękowej + pomarańczowa ramka sygnalizują nagrywanie.
- Kliknij przycisk mikrofonu ponownie (lub naciśnij skrót), aby zatrzymać.
- Transkrybowany tekst pojawia się w composerze — w razie potrzeby edytuj, potem Send.
Tryb ciągły: L1 słucha, dopóki nie zatrzymasz; L2 nagrywa pojedynczy klip i wysyła go do transkrypcji.
L1 — Web Speech API (Chrome/Edge)
Używa wbudowanego w przeglądarkę API rozpoznawania mowy. Działa natychmiast, bez podróży na serwer.
Locale: Ustawiane automatycznie na podstawie Twojej preferencji językowej w Arc. Obsługiwane kody BCP-47: uk-UA, en-US, de-DE, es-ES, fr-FR, pl-PL, ru-RU, pt-BR.
Uprawnienia: Przeglądarka prosi o dostęp do mikrofonu przy pierwszym użyciu. Jeśli przypadkowo go zablokowałeś, przejdź do Site settings → Microphone → Allow dla arc-os.co. Nagłówek Permissions-Policy na arc-os.co używa microphone=(self) — dostęp same-origin jest dozwolony, a osadzenia cross-origin są zablokowane.
Ograniczenia:
- Wymaga Chrome lub Edge (opartych na Chromium). Firefox i Safari automatycznie przechodzą na L2.
- Jakość transkrypcji zależy od serwerów Google (wywoływanych przez przeglądarkę, nie przez Arc OS).
L2 — Self-hosted whisper.cpp
Arc OS uruchamia trwały serwis arc-whisper.service na Contabo z preładowanym modelem ggml-base (142 MB). Gdy przeglądarka nie obsługuje Web Speech API, composer automatycznie przechodzi na tę warstwę:
- Przeglądarka nagrywa klip WebM przez
MediaRecorder. - Po zatrzymaniu klip jest wysyłany
POST-em do/api/crm/voice/transcribe(multipart, maks. 25 MB). - Serwer przekazuje go do lokalnego whisper-servera pod
127.0.0.1:19214— bajty audio nigdy nie opuszczają Contabo. - Transkrybowany tekst wraca i jest wstawiany do composera.
Opóźnienie: ~3.4 s dla 11-sekundowego klipu (rozgrzany model, 3.1× realtime na obecnej maszynie 6-vCPU EPYC).
Współbieżność: Whisper-server ma semafor z 2 slotami. Jeśli oba sloty są zajęte, API zwraca 429 („server busy"), a UI pokazuje toast — spróbuj ponownie za kilka sekund.
Dzienny limit
Każdy użytkownik ma miękki limit 60 min/dzień dla transkrypcji L2. Serwer szacuje długość klipu na podstawie rozmiaru uploadu (założenie kodeka głosowego ~32 kbps, dokładność ±30%). Po osiągnięciu limitu:
- API zwraca
429z{ "error": "Daily voice quota reached (60 min/day)", "used": <seconds>, "cap": 3600 } - Przycisk mikrofonu jest wyłączony do końca dnia
- Limit resetuje się o północy UTC
L1 (Web Speech API) nie podlega temu limitowi — używa własnej usługi przeglądarki.
Rozwiązywanie problemów
| Objaw | Prawdopodobna przyczyna | Rozwiązanie |
|---|---|---|
| Przycisk mikrofonu wyszarzony | Osiągnięto dzienny limit | Poczekaj do północy UTC |
| „Microphone access blocked" | Przeglądarka zablokowała mikrofon | Site settings → Microphone → Allow dla arc-os.co |
| L1 nie działa w Firefoksie | Firefox nie obsługuje Web Speech API | Automatycznie przechodzi na L2 |
| 429 „server busy" | Dwóch innych użytkowników transkrybuje | Spróbuj ponownie za ~5 s |
| Słaba jakość transkryptu | Hałas w tle / model base w L2 | Mów wyraźnie; transkrypcja Pro (większy model) to przyszła phase |
| Ctrl+Shift+V nic nie robi | Fokus poza composerem | Najpierw kliknij wewnątrz pola tekstowego composera |
Odniesienia
shared/routes/voice.ts— handler endpointu (Phase 62.4, #373)shared/migrations/051_voice_usage.ts— tabela limitówvoice_usage_logfrontend/src/crm/pages/workspace/Composer.jsx— komponent MicButtonarc-whisper.servicena Contabo — konfiguracja demona whisper.cpp- Endpoint API:
POST /api/crm/voice/transcribe