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": "Models",
"providers": "Providers",
"image": "Image",
"voice": "Voice",
"browser": "Web",
"cliApps": "CLI Apps",
"mcp": "MCP",
@@ -99,7 +100,8 @@
"capabilities": "Capabilities",
"apps": "Apps",
"nativeHost": "Native host",
"hostSafety": "App safety"
"hostSafety": "App safety",
"voiceInput": "Voice input"
},
"models": {
"selectModel": "Select model",
@@ -161,7 +163,13 @@
"engine": "Engine",
"logs": "Logs",
"diagnostics": "Diagnostics",
"contextWindow": "Context window"
"contextWindow": "Context window",
"transcription": "Transcription",
"transcriptionProvider": "Provider",
"transcriptionProviderStatus": "Provider status",
"transcriptionModel": "Model",
"transcriptionLanguage": "Language",
"voiceLimits": "Limits"
},
"help": {
"theme": "Switch between light and dark appearance.",
@@ -200,7 +208,12 @@
"diagnostics": "Export a small runtime report for support.",
"localServiceAccessNative": "Allow Full Access shell commands to reach services on this Mac.",
"webuiDefaultAccessNative": "Used by native chats without a project-specific permission.",
"contextWindow": "Choose the default context budget for this model configuration."
"contextWindow": "Choose the default context budget for this model configuration.",
"transcription": "Transcribe microphone input before sending it. Chat channel voice messages use the same settings.",
"transcriptionProvider": "Uses the matching provider credentials from Providers.",
"transcriptionProviderStatus": "API keys stay under providers, not in transcription settings.",
"transcriptionModel": "Leave as the resolved default unless your provider needs a custom model id.",
"transcriptionLanguage": "Optional ISO-639 hint such as en, zh, ja, or ko."
},
"timezone": {
"select": "Select timezone",
@@ -391,6 +404,7 @@
"totalProviders": "{{count}} available",
"webSearch": "Web search",
"imageGeneration": "Image generation",
"voiceInput": "Voice input",
"workspace": "Workspace"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "Raw SKILL.md",
"rawInstructionsEmpty": "No raw instructions.",
"detailDescription": "Details for {{name}}."
},
"voice": {
"selectProvider": "Select provider",
"configureProvider": "Configure provider",
"languageAuto": "Auto"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "Deep research",
"voice": "Voice input"
},
"voice": {
"hint": "Click to dictate or hold",
"stop": "Stop recording",
"transcribing": "Transcribing...",
"recordingStatus": "Recording {{time}}"
},
"voiceErrors": {
"unsupported": "Voice input is not supported in this browser.",
"permission": "Microphone permission is required.",
"notConfigured": "Configure a transcription provider first.",
"tooLong": "Recording is too long.",
"tooShort": "Hold a little longer to record voice.",
"noInput": "No microphone input detected.",
"failed": "Could not transcribe audio."
},
"slash": {
"ariaLabel": "Slash commands",
"label": "commands",