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": "Mô hình",
"providers": "Nhà cung cấp",
"image": "Hình ảnh",
"voice": "Giọng nói",
"browser": "Trang web",
"runtime": "Hệ thống",
"advanced": "Bảo mật",
@@ -99,7 +100,8 @@
"mcp": "Dịch vụ MCP",
"apps": "Ứng dụng",
"nativeHost": "Host gốc",
"hostSafety": "An toàn ứng dụng"
"hostSafety": "An toàn ứng dụng",
"voiceInput": "Nhap giong noi"
},
"rows": {
"theme": "Chủ đề",
@@ -142,7 +144,13 @@
"engine": "Bộ máy",
"logs": "Nhật ký",
"diagnostics": "Chẩn đoán",
"contextWindow": "Cửa sổ ngữ cảnh"
"contextWindow": "Cửa sổ ngữ cảnh",
"transcription": "Phien am",
"transcriptionProvider": "Nha cung cap",
"transcriptionProviderStatus": "Trang thai nha cung cap",
"transcriptionModel": "Mo hinh",
"transcriptionLanguage": "Ngon ngu",
"voiceLimits": "Gioi han"
},
"help": {
"theme": "Chuyển giữa giao diện sáng và tối.",
@@ -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": "Chọn ngân sách ngữ cảnh mặc định cho cấu hình mô hình này."
"contextWindow": "Chọn ngân sách ngữ cảnh mặc định cho cấu hình mô hình này.",
"transcription": "Phien am dau vao micro truoc khi gui. Tin nhan giong noi tu kenh chat dung cung cai dat.",
"transcriptionProvider": "Dung thong tin xac thuc cua nha cung cap tu Providers.",
"transcriptionProviderStatus": "API key nam trong providers, khong nam trong cai dat transcription.",
"transcriptionModel": "Giu mac dinh da resolve tru khi nha cung cap can id model tuy chinh.",
"transcriptionLanguage": "Goi y ISO-639 tuy chon, nhu en, zh, ja hoac ko."
},
"values": {
"light": "Sáng",
@@ -283,6 +296,7 @@
"totalProviders": "{{count}} khả dụng",
"webSearch": "Tìm kiếm web",
"imageGeneration": "Tạo hình ảnh",
"voiceInput": "Nhập bằng giọng nói",
"workspace": "Không gian làm việc"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "SKILL.md gốc",
"rawInstructionsEmpty": "Không có hướng dẫn gốc.",
"detailDescription": "Chi tiết cho {{name}}."
},
"voice": {
"selectProvider": "Chon nha cung cap",
"configureProvider": "Cau hinh nha cung cap",
"languageAuto": "Tu dong"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "Nghiên cứu sâu",
"voice": "Nhập bằng giọng nói"
},
"voice": {
"hint": "Bấm để đọc chính tả hoặc nhấn giữ",
"stop": "Dừng ghi âm",
"transcribing": "Đang chép lời...",
"recordingStatus": "Đang ghi {{time}}"
},
"voiceErrors": {
"unsupported": "Trình duyệt này không hỗ trợ nhập bằng giọng nói.",
"permission": "Cần quyền truy cập micrô.",
"notConfigured": "Hãy cấu hình nhà cung cấp chép lời trước.",
"tooLong": "Bản ghi âm quá dài.",
"tooShort": "Giữ lâu hơn một chút để ghi âm giọng nói.",
"noInput": "Không phát hiện đầu vào micrô.",
"failed": "Không thể chép lời âm thanh."
},
"slash": {
"ariaLabel": "Lệnh slash",
"label": "lệnh",