feat(transcription): add shared voice input support (#4232)

* feat(webui): add voice transcription input

* feat(webui): render ANSI output in code blocks

* refactor(webui): isolate voice recorder logic

* refactor(transcription): keep websocket ingress thin

* refactor(transcription): resolve channel audio settings on demand

* style(webui): neutralize voice waveform color

* feat(webui): add voice input tooltip

* feat(webui): add voice input keyboard shortcut

* fix(webui): distinguish voice shortcut platforms

* fix(webui): place voice button after model selector

* refactor(webui): share voice hold recording helpers

* fix(desktop): allow microphone voice input

* fix(webui): stabilize token usage month labels

* feat(webui): show voice input on settings overview

* fix(webui): label voice capability as recognition

* fix(webui): align capability overview status

* refactor(webui): isolate transcription socket handling

* fix(webui): soften silent voice waveform

* refactor(audio): clarify transcription service location

* docs(transcription): clarify audio and provider boundaries

* fix(exec): reduce session output polling flake
This commit is contained in:
Xubin Ren
2026-06-09 01:08:49 +08:00
committed by GitHub
parent 06d454a225
commit 9c81280300
49 changed files with 3071 additions and 257 deletions
+37 -3
View File
@@ -73,6 +73,7 @@
"models": "Modelos",
"providers": "Proveedores",
"image": "Imagen",
"voice": "Voz",
"browser": "Internet",
"runtime": "Sistema",
"advanced": "Seguridad",
@@ -99,7 +100,8 @@
"mcp": "Servicios MCP",
"apps": "Aplicaciones",
"nativeHost": "Host nativo",
"hostSafety": "Seguridad de la app"
"hostSafety": "Seguridad de la app",
"voiceInput": "Entrada de voz"
},
"rows": {
"theme": "Tema",
@@ -142,7 +144,13 @@
"engine": "Motor",
"logs": "Registros",
"diagnostics": "Diagnóstico",
"contextWindow": "Ventana de contexto"
"contextWindow": "Ventana de contexto",
"transcription": "Transcripcion",
"transcriptionProvider": "Proveedor",
"transcriptionProviderStatus": "Estado del proveedor",
"transcriptionModel": "Modelo",
"transcriptionLanguage": "Idioma",
"voiceLimits": "Limites"
},
"help": {
"theme": "Cambia entre apariencia clara y oscura.",
@@ -181,7 +189,12 @@
"diagnostics": "Exporta un pequeño informe de runtime para soporte.",
"localServiceAccessNative": "Permite que comandos shell con Full Access alcancen servicios en este Mac.",
"webuiDefaultAccessNative": "Usado por chats nativos sin permiso específico de proyecto.",
"contextWindow": "Elige el presupuesto de contexto predeterminado para esta configuración de modelo."
"contextWindow": "Elige el presupuesto de contexto predeterminado para esta configuración de modelo.",
"transcription": "Transcribe la entrada del microfono antes de enviarla. Los mensajes de voz de los canales usan la misma configuracion.",
"transcriptionProvider": "Usa las credenciales del proveedor correspondiente en Proveedores.",
"transcriptionProviderStatus": "Las claves API permanecen en proveedores, no en la configuracion de transcripcion.",
"transcriptionModel": "Dejalo como el valor predeterminado resuelto salvo que el proveedor necesite un id de modelo personalizado.",
"transcriptionLanguage": "Pista ISO-639 opcional, como en, zh, ja o ko."
},
"values": {
"light": "Claro",
@@ -283,6 +296,7 @@
"totalProviders": "{{count}} disponibles",
"webSearch": "Búsqueda web",
"imageGeneration": "Generación de imágenes",
"voiceInput": "Entrada de voz",
"workspace": "Espacio de trabajo"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "SKILL.md original",
"rawInstructionsEmpty": "No hay instrucciones originales.",
"detailDescription": "Detalles de {{name}}."
},
"voice": {
"selectProvider": "Seleccionar proveedor",
"configureProvider": "Configurar proveedor",
"languageAuto": "Auto"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "Investigación profunda",
"voice": "Entrada de voz"
},
"voice": {
"hint": "Haz clic para dictar o mantén",
"stop": "Detener grabación",
"transcribing": "Transcribiendo...",
"recordingStatus": "Grabando {{time}}"
},
"voiceErrors": {
"unsupported": "Este navegador no admite entrada de voz.",
"permission": "Se requiere permiso de micrófono.",
"notConfigured": "Configura primero un proveedor de transcripción.",
"tooLong": "La grabación es demasiado larga.",
"tooShort": "Mantén pulsado un poco más para grabar voz.",
"noInput": "No se detectó entrada del micrófono.",
"failed": "No se pudo transcribir el audio."
},
"slash": {
"ariaLabel": "Comandos slash",
"label": "comandos",