Entrada por voz
Estado: Activo desde Phase 62 (2026-06-05). whisper.cpp auto-hospedado en Contabo — sin dependencia de OpenAI, el audio no sale de tu servidor.
Arc OS admite dos capas de entrada por voz en el compositor del chat:
| Capa | Requiere | Funciona en |
|---|---|---|
| L1 — Web Speech API | Chrome o Edge (Chromium) | Todos los planes de Arc |
| L2 — whisper auto-hospedado | Cualquier navegador (MediaRecorder WebM/WAV) | Arc Standard Cloud, On-premise |
Ambas capas alimentan el mismo cuadro de texto del compositor y son transparentes para el worker de IA.
Usar la voz en el chat
- Abre el workspace de cualquier proyecto y pon el foco en el compositor del chat.
- Haz clic en el botón de micrófono (abajo a la izquierda del compositor) o pulsa Ctrl+Shift+V (funciona con cualquier distribución de teclado — el atajo corresponde a la tecla física V, no al carácter de la distribución).
- Habla. Una animación de onda + un borde naranja indican que está grabando.
- Haz clic en el botón del micrófono de nuevo (o pulsa el atajo) para parar.
- El texto transcrito aparece en el compositor — edítalo si hace falta y luego envía.
Modo continuo: L1 sigue escuchando hasta que pares; L2 graba un único clip y lo envía para transcripción.
L1 — Web Speech API (Chrome/Edge)
Usa la API de reconocimiento de voz integrada del navegador. Funciona al instante, sin ida y vuelta al servidor.
Idioma: se establece automáticamente desde tu preferencia de idioma en Arc. Códigos BCP-47 admitidos: uk-UA, en-US, de-DE, es-ES, fr-FR, pl-PL, ru-RU, pt-BR.
Permisos: el navegador pide acceso al micrófono en el primer uso. Si lo bloqueaste por accidente, ve a Site settings → Microphone → Allow para arc-os.co. El header Permissions-Policy de arc-os.co usa microphone=(self) — se permite el acceso same-origin mientras los embeds cross-origin quedan bloqueados.
Limitaciones:
- Requiere Chrome o Edge (basados en Chromium). Firefox y Safari pasan automáticamente a L2.
- La calidad de transcripción depende de los servidores de Google (los llama el navegador, no Arc OS).
L2 — whisper.cpp auto-hospedado
Arc OS ejecuta un arc-whisper.service persistente en Contabo con el modelo ggml-base (142 MB) precargado. Cuando el navegador no admite la Web Speech API, el compositor recurre a esta capa automáticamente:
- El navegador graba un clip WebM vía
MediaRecorder. - Al parar, el clip se envía por
POSTa/api/crm/voice/transcribe(multipart, máx 25 MB). - El servidor lo reenvía al whisper-server local en
127.0.0.1:19214— los bytes de audio nunca salen de Contabo. - El texto transcrito vuelve y se inserta en el compositor.
Latencia: ~3.4 s para un clip de 11 segundos (modelo caliente, 3.1× tiempo real en la máquina actual EPYC de 6 vCPU).
Concurrencia: el whisper-server tiene un semáforo de 2 slots. Si ambos están ocupados, la API devuelve 429 ("server busy") y la UI muestra un toast — inténtalo de nuevo en unos segundos.
Cuota diaria
Cada usuario tiene un límite blando de 60 min/día en transcripciones L2. El servidor estima la duración del clip a partir del tamaño de la subida (asumiendo códec de voz de ~32 kbps, precisión de ±30%). Al alcanzar el límite:
- La API devuelve
429con{ "error": "Daily voice quota reached (60 min/day)", "used": <seconds>, "cap": 3600 } - El botón del micrófono se desactiva por el resto del día
- La cuota se reinicia a medianoche UTC
L1 (Web Speech API) no está sujeta a este límite — usa el servicio propio del navegador.
Solución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
| Botón del micrófono atenuado | Cuota diaria alcanzada | Espera hasta medianoche UTC |
| "Microphone access blocked" | El navegador bloqueó el micrófono | Site settings → Microphone → Allow para arc-os.co |
| L1 no funciona en Firefox | Firefox no admite la Web Speech API | Pasa a L2 automáticamente |
| 429 "server busy" | Otros dos usuarios transcribiendo | Reintenta tras ~5 s |
| Mala calidad de transcripción | Ruido de fondo / modelo base de L2 | Habla con claridad; la transcripción Pro (modelo más grande) es una fase futura |
| Ctrl+Shift+V no hace nada | El foco no está en el compositor | Haz clic primero dentro del textarea del compositor |
Referencias
shared/routes/voice.ts— handler del endpoint (Phase 62.4, #373)shared/migrations/051_voice_usage.ts— tabla de cuotavoice_usage_logfrontend/src/crm/pages/workspace/Composer.jsx— componente MicButtonarc-whisper.serviceen Contabo — configuración del daemon whisper.cpp- Endpoint API:
POST /api/crm/voice/transcribe