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": "Model",
"providers": "Penyedia",
"image": "Gambar",
"voice": "Suara",
"browser": "Internet",
"runtime": "Sistem",
"advanced": "Keamanan",
@@ -99,7 +100,8 @@
"mcp": "Layanan MCP",
"apps": "Aplikasi",
"nativeHost": "Host native",
"hostSafety": "Keamanan aplikasi"
"hostSafety": "Keamanan aplikasi",
"voiceInput": "Input suara"
},
"rows": {
"theme": "Tema",
@@ -142,7 +144,13 @@
"engine": "Mesin",
"logs": "Log",
"diagnostics": "Diagnostik",
"contextWindow": "Jendela konteks"
"contextWindow": "Jendela konteks",
"transcription": "Transkripsi",
"transcriptionProvider": "Penyedia",
"transcriptionProviderStatus": "Status penyedia",
"transcriptionModel": "Model",
"transcriptionLanguage": "Bahasa",
"voiceLimits": "Batas"
},
"help": {
"theme": "Beralih antara tampilan terang dan gelap.",
@@ -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": "Pilih anggaran konteks default untuk konfigurasi model ini."
"contextWindow": "Pilih anggaran konteks default untuk konfigurasi model ini.",
"transcription": "Transkripsikan input mikrofon sebelum dikirim. Pesan suara channel memakai pengaturan yang sama.",
"transcriptionProvider": "Menggunakan kredensial penyedia yang sesuai dari Providers.",
"transcriptionProviderStatus": "API key tetap berada di providers, bukan di pengaturan transkripsi.",
"transcriptionModel": "Biarkan memakai default yang teresolusi kecuali penyedia membutuhkan id model khusus.",
"transcriptionLanguage": "Petunjuk ISO-639 opsional, seperti en, zh, ja, atau ko."
},
"values": {
"light": "Terang",
@@ -283,6 +296,7 @@
"totalProviders": "{{count}} tersedia",
"webSearch": "Pencarian web",
"imageGeneration": "Pembuatan gambar",
"voiceInput": "Input suara",
"workspace": "Ruang kerja"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "SKILL.md mentah",
"rawInstructionsEmpty": "Tidak ada instruksi mentah.",
"detailDescription": "Detail untuk {{name}}."
},
"voice": {
"selectProvider": "Pilih penyedia",
"configureProvider": "Konfigurasi penyedia",
"languageAuto": "Auto"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "Riset mendalam",
"voice": "Input suara"
},
"voice": {
"hint": "Klik untuk mendikte atau tahan",
"stop": "Hentikan rekaman",
"transcribing": "Mentranskripsi...",
"recordingStatus": "Merekam {{time}}"
},
"voiceErrors": {
"unsupported": "Input suara tidak didukung di browser ini.",
"permission": "Izin mikrofon diperlukan.",
"notConfigured": "Konfigurasikan penyedia transkripsi terlebih dahulu.",
"tooLong": "Rekaman terlalu panjang.",
"tooShort": "Tahan sedikit lebih lama untuk merekam suara.",
"noInput": "Tidak ada input mikrofon yang terdeteksi.",
"failed": "Tidak dapat mentranskripsi audio."
},
"slash": {
"ariaLabel": "Perintah slash",
"label": "perintah",