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": "Modèles",
"providers": "Fournisseurs",
"image": "Images",
"voice": "Voix",
"browser": "Internet",
"runtime": "Système",
"advanced": "Sécurité",
@@ -99,7 +100,8 @@
"mcp": "Services MCP",
"apps": "Applications",
"nativeHost": "Hôte natif",
"hostSafety": "Sécurité de lapp"
"hostSafety": "Sécurité de lapp",
"voiceInput": "Saisie vocale"
},
"rows": {
"theme": "Thème",
@@ -142,7 +144,13 @@
"engine": "Moteur",
"logs": "Journaux",
"diagnostics": "Diagnostic",
"contextWindow": "Fenêtre de contexte"
"contextWindow": "Fenêtre de contexte",
"transcription": "Transcription",
"transcriptionProvider": "Fournisseur",
"transcriptionProviderStatus": "Etat du fournisseur",
"transcriptionModel": "Modele",
"transcriptionLanguage": "Langue",
"voiceLimits": "Limites"
},
"help": {
"theme": "Basculer entre lapparence claire et sombre.",
@@ -181,7 +189,12 @@
"diagnostics": "Exporte un petit rapport dexécution pour le support.",
"localServiceAccessNative": "Autorise les commandes shell Full Access à atteindre les services sur ce Mac.",
"webuiDefaultAccessNative": "Utilisé par les chats natifs sans permission propre au projet.",
"contextWindow": "Choisissez le budget de contexte par défaut pour cette configuration de modèle."
"contextWindow": "Choisissez le budget de contexte par défaut pour cette configuration de modèle.",
"transcription": "Transcrit l'entree micro avant l'envoi. Les messages vocaux des canaux utilisent les memes reglages.",
"transcriptionProvider": "Utilise les identifiants du fournisseur correspondant dans Fournisseurs.",
"transcriptionProviderStatus": "Les cles API restent dans les fournisseurs, pas dans les reglages de transcription.",
"transcriptionModel": "Laissez le modele resolu par defaut sauf si votre fournisseur exige un id personnalise.",
"transcriptionLanguage": "Indice ISO-639 facultatif, comme en, zh, ja ou ko."
},
"values": {
"light": "Clair",
@@ -283,6 +296,7 @@
"totalProviders": "{{count}} disponibles",
"webSearch": "Recherche web",
"imageGeneration": "Génération dimages",
"voiceInput": "Saisie vocale",
"workspace": "Espace de travail"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "SKILL.md brut",
"rawInstructionsEmpty": "Aucune instruction brute.",
"detailDescription": "Détails de {{name}}."
},
"voice": {
"selectProvider": "Choisir un fournisseur",
"configureProvider": "Configurer le fournisseur",
"languageAuto": "Auto"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "Recherche approfondie",
"voice": "Entrée vocale"
},
"voice": {
"hint": "Cliquez pour dicter ou maintenez",
"stop": "Arrêter l'enregistrement",
"transcribing": "Transcription...",
"recordingStatus": "Enregistrement {{time}}"
},
"voiceErrors": {
"unsupported": "La saisie vocale n'est pas prise en charge par ce navigateur.",
"permission": "L'autorisation du microphone est requise.",
"notConfigured": "Configurez d'abord un fournisseur de transcription.",
"tooLong": "L'enregistrement est trop long.",
"tooShort": "Maintenez un peu plus longtemps pour enregistrer la voix.",
"noInput": "Aucune entrée microphone détectée.",
"failed": "Impossible de transcrire l'audio."
},
"slash": {
"ariaLabel": "Commandes slash",
"label": "commandes",