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",
+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",
+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",
+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",
+37 -3
View File
@@ -73,6 +73,7 @@
"models": "モデル",
"providers": "プロバイダー",
"image": "画像",
"voice": "音声",
"browser": "ウェブ",
"runtime": "システム",
"advanced": "セキュリティ",
@@ -99,7 +100,8 @@
"mcp": "MCP サービス",
"apps": "アプリ",
"nativeHost": "ネイティブホスト",
"hostSafety": "アプリの安全性"
"hostSafety": "アプリの安全性",
"voiceInput": "音声入力"
},
"rows": {
"theme": "テーマ",
@@ -142,7 +144,13 @@
"engine": "エンジン",
"logs": "ログ",
"diagnostics": "診断",
"contextWindow": "コンテキストウィンドウ"
"contextWindow": "コンテキストウィンドウ",
"transcription": "文字起こし",
"transcriptionProvider": "プロバイダー",
"transcriptionProviderStatus": "プロバイダー状態",
"transcriptionModel": "モデル",
"transcriptionLanguage": "言語",
"voiceLimits": "制限"
},
"help": {
"theme": "ライト表示とダーク表示を切り替えます。",
@@ -181,7 +189,12 @@
"diagnostics": "サポート用の小さなランタイムレポートを書き出します。",
"localServiceAccessNative": "Full Access の shell コマンドがこの Mac 上のサービスにアクセスできるようにします。",
"webuiDefaultAccessNative": "プロジェクト固有の権限がないネイティブチャットで使用します。",
"contextWindow": "このモデル設定で使う既定のコンテキスト予算を選択します。"
"contextWindow": "このモデル設定で使う既定のコンテキスト予算を選択します。",
"transcription": "マイク入力を送信前に文字起こしします。チャネルの音声メッセージも同じ設定を使います。",
"transcriptionProvider": "プロバイダー設定にある対応する認証情報を使います。",
"transcriptionProviderStatus": "APIキーは文字起こし設定ではなくプロバイダー側に保存されます。",
"transcriptionModel": "プロバイダーがカスタムモデルIDを必要としない限り、解決済みのデフォルトのままにします。",
"transcriptionLanguage": "en、zh、ja、ko などの任意の ISO-639 ヒント。"
},
"values": {
"light": "ライト",
@@ -283,6 +296,7 @@
"totalProviders": "{{count}} 個利用可能",
"webSearch": "Web 検索",
"imageGeneration": "画像生成",
"voiceInput": "音声入力",
"workspace": "ワークスペース"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "元の SKILL.md",
"rawInstructionsEmpty": "元の説明はありません。",
"detailDescription": "{{name}} の詳細。"
},
"voice": {
"selectProvider": "プロバイダーを選択",
"configureProvider": "プロバイダーを設定",
"languageAuto": "自動"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "詳細調査",
"voice": "音声入力"
},
"voice": {
"hint": "クリックして音声入力、または長押し",
"stop": "録音を停止",
"transcribing": "文字起こし中...",
"recordingStatus": "録音中 {{time}}"
},
"voiceErrors": {
"unsupported": "このブラウザーは音声入力に対応していません。",
"permission": "マイクの許可が必要です。",
"notConfigured": "先に文字起こしプロバイダーを設定してください。",
"tooLong": "録音が長すぎます。",
"tooShort": "もう少し長く録音してください。",
"noInput": "マイク入力が検出されませんでした。",
"failed": "音声を文字起こしできませんでした。"
},
"slash": {
"ariaLabel": "スラッシュコマンド",
"label": "コマンド",
+37 -3
View File
@@ -73,6 +73,7 @@
"models": "모델",
"providers": "제공자",
"image": "이미지",
"voice": "음성",
"browser": "웹",
"runtime": "시스템",
"advanced": "보안",
@@ -99,7 +100,8 @@
"mcp": "MCP 서비스",
"apps": "앱",
"nativeHost": "네이티브 호스트",
"hostSafety": "앱 보안"
"hostSafety": "앱 보안",
"voiceInput": "음성 입력"
},
"rows": {
"theme": "테마",
@@ -142,7 +144,13 @@
"engine": "엔진",
"logs": "로그",
"diagnostics": "진단",
"contextWindow": "컨텍스트 창"
"contextWindow": "컨텍스트 창",
"transcription": "전사",
"transcriptionProvider": "제공자",
"transcriptionProviderStatus": "제공자 상태",
"transcriptionModel": "모델",
"transcriptionLanguage": "언어",
"voiceLimits": "제한"
},
"help": {
"theme": "밝은 모드와 어두운 모드를 전환합니다.",
@@ -181,7 +189,12 @@
"diagnostics": "지원용 작은 런타임 보고서를 내보냅니다.",
"localServiceAccessNative": "Full Access shell 명령이 이 Mac의 서비스에 접근할 수 있게 합니다.",
"webuiDefaultAccessNative": "프로젝트별 권한이 없는 네이티브 채팅에 사용됩니다.",
"contextWindow": "이 모델 구성의 기본 컨텍스트 예산을 선택합니다."
"contextWindow": "이 모델 구성의 기본 컨텍스트 예산을 선택합니다.",
"transcription": "마이크 입력을 보내기 전에 텍스트로 변환합니다. 채널 음성 메시지도 같은 설정을 사용합니다.",
"transcriptionProvider": "Providers에 저장된 해당 제공자의 인증 정보를 사용합니다.",
"transcriptionProviderStatus": "API 키는 transcription 설정이 아니라 providers 아래에 유지됩니다.",
"transcriptionModel": "제공자가 사용자 지정 모델 ID를 요구하지 않으면 해석된 기본값을 사용하세요.",
"transcriptionLanguage": "en, zh, ja, ko 같은 선택적 ISO-639 힌트입니다."
},
"values": {
"light": "라이트",
@@ -283,6 +296,7 @@
"totalProviders": "{{count}}개 사용 가능",
"webSearch": "웹 검색",
"imageGeneration": "이미지 생성",
"voiceInput": "음성 입력",
"workspace": "작업공간"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "원본 SKILL.md",
"rawInstructionsEmpty": "원본 지침이 없습니다.",
"detailDescription": "{{name}} 세부 정보."
},
"voice": {
"selectProvider": "제공자 선택",
"configureProvider": "제공자 설정",
"languageAuto": "자동"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "심층 조사",
"voice": "음성 입력"
},
"voice": {
"hint": "클릭해 받아쓰거나 길게 누르기",
"stop": "녹음 중지",
"transcribing": "변환 중...",
"recordingStatus": "녹음 중 {{time}}"
},
"voiceErrors": {
"unsupported": "이 브라우저는 음성 입력을 지원하지 않습니다.",
"permission": "마이크 권한이 필요합니다.",
"notConfigured": "먼저 음성 변환 제공업체를 설정하세요.",
"tooLong": "녹음 시간이 너무 깁니다.",
"tooShort": "음성을 녹음하려면 조금 더 길게 눌러 주세요.",
"noInput": "마이크 입력이 감지되지 않았습니다.",
"failed": "오디오를 변환하지 못했습니다."
},
"slash": {
"ariaLabel": "슬래시 명령",
"label": "명령",
+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",
+37 -3
View File
@@ -73,6 +73,7 @@
"models": "模型",
"providers": "提供商",
"image": "图片",
"voice": "语音",
"browser": "网页",
"cliApps": "CLI 应用",
"mcp": "MCP",
@@ -99,7 +100,8 @@
"capabilities": "能力",
"apps": "应用",
"nativeHost": "原生宿主",
"hostSafety": "应用安全"
"hostSafety": "应用安全",
"voiceInput": "语音识别"
},
"models": {
"selectModel": "选择模型",
@@ -161,7 +163,13 @@
"engine": "引擎",
"logs": "日志",
"diagnostics": "诊断",
"contextWindow": "上下文窗口"
"contextWindow": "上下文窗口",
"transcription": "语音转写",
"transcriptionProvider": "提供商",
"transcriptionProviderStatus": "提供商状态",
"transcriptionModel": "模型",
"transcriptionLanguage": "语言",
"voiceLimits": "限制"
},
"help": {
"theme": "在浅色和深色外观之间切换。",
@@ -200,7 +208,12 @@
"diagnostics": "导出一份用于支持排查的小型运行报告。",
"localServiceAccessNative": "允许完全访问权限下的 shell 命令访问这台 Mac 上的服务。",
"webuiDefaultAccessNative": "用于没有单独项目权限的原生聊天。",
"contextWindow": "选择此模型配置的默认上下文预算。"
"contextWindow": "选择此模型配置的默认上下文预算。",
"transcription": "发送前先把麦克风输入转写到输入框。聊天渠道里的语音消息也使用同一套设置。",
"transcriptionProvider": "使用「提供商」中对应提供商的凭据。",
"transcriptionProviderStatus": "API Key 仍保存在 providers 里,不写进 transcription 设置。",
"transcriptionModel": "除非提供商需要自定义模型 ID,否则保持解析后的默认值即可。",
"transcriptionLanguage": "可选 ISO-639 语言提示,例如 en、zh、ja 或 ko。"
},
"timezone": {
"select": "选择时区",
@@ -391,6 +404,7 @@
"totalProviders": "共 {{count}} 个可用",
"webSearch": "网页搜索",
"imageGeneration": "图片生成",
"voiceInput": "语音识别",
"workspace": "工作区"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "原始 SKILL.md",
"rawInstructionsEmpty": "没有原始说明。",
"detailDescription": "{{name}} 的详情。"
},
"voice": {
"selectProvider": "选择提供商",
"configureProvider": "配置提供商",
"languageAuto": "自动"
}
},
"chat": {
@@ -677,6 +696,21 @@
"deepResearch": "深度研究",
"voice": "语音输入"
},
"voice": {
"hint": "点击进行听写或长按",
"stop": "停止录音",
"transcribing": "正在转写...",
"recordingStatus": "正在录音 {{time}}"
},
"voiceErrors": {
"unsupported": "当前浏览器不支持语音输入。",
"permission": "需要麦克风权限。",
"notConfigured": "请先配置转写提供商。",
"tooLong": "录音时间太长。",
"tooShort": "请稍微多录一会儿。",
"noInput": "没有检测到麦克风输入。",
"failed": "语音转写失败。"
},
"slash": {
"ariaLabel": "斜杠命令",
"label": "命令",
+37 -3
View File
@@ -73,6 +73,7 @@
"models": "模型",
"providers": "提供商",
"image": "圖片",
"voice": "語音",
"browser": "網頁",
"runtime": "系統",
"advanced": "安全",
@@ -99,7 +100,8 @@
"mcp": "MCP 服務",
"apps": "應用",
"nativeHost": "原生宿主",
"hostSafety": "App 安全"
"hostSafety": "App 安全",
"voiceInput": "語音辨識"
},
"rows": {
"theme": "主題",
@@ -142,7 +144,13 @@
"engine": "引擎",
"logs": "日誌",
"diagnostics": "診斷",
"contextWindow": "上下文視窗"
"contextWindow": "上下文視窗",
"transcription": "語音轉寫",
"transcriptionProvider": "提供商",
"transcriptionProviderStatus": "提供商狀態",
"transcriptionModel": "模型",
"transcriptionLanguage": "語言",
"voiceLimits": "限制"
},
"help": {
"theme": "在淺色與深色外觀之間切換。",
@@ -181,7 +189,12 @@
"diagnostics": "匯出一份用於支援排查的小型執行報告。",
"localServiceAccessNative": "允許完全訪問權限下的 shell 命令訪問這台 Mac 上的服務。",
"webuiDefaultAccessNative": "用於沒有單獨專案權限的原生聊天。",
"contextWindow": "選擇此模型配置的預設上下文預算。"
"contextWindow": "選擇此模型配置的預設上下文預算。",
"transcription": "送出前先把麥克風輸入轉寫到輸入框。聊天渠道的語音訊息也使用同一組設定。",
"transcriptionProvider": "使用「提供商」中對應提供商的憑證。",
"transcriptionProviderStatus": "API Key 仍保存在 providers 裡,不寫進 transcription 設定。",
"transcriptionModel": "除非提供商需要自訂模型 ID,否則保持解析後的預設值即可。",
"transcriptionLanguage": "可選 ISO-639 語言提示,例如 en、zh、ja 或 ko。"
},
"values": {
"light": "淺色",
@@ -283,6 +296,7 @@
"totalProviders": "共 {{count}} 個可用",
"webSearch": "網頁搜尋",
"imageGeneration": "圖片生成",
"voiceInput": "語音辨識",
"workspace": "工作區"
},
"usage": {
@@ -486,6 +500,11 @@
"rawInstructions": "原始 SKILL.md",
"rawInstructionsEmpty": "沒有原始說明。",
"detailDescription": "{{name}} 的詳細資訊。"
},
"voice": {
"selectProvider": "選擇提供商",
"configureProvider": "設定提供商",
"languageAuto": "自動"
}
},
"chat": {
@@ -678,6 +697,21 @@
"deepResearch": "深度研究",
"voice": "語音輸入"
},
"voice": {
"hint": "點擊進行聽寫或長按",
"stop": "停止錄音",
"transcribing": "正在轉寫...",
"recordingStatus": "正在錄音 {{time}}"
},
"voiceErrors": {
"unsupported": "目前瀏覽器不支援語音輸入。",
"permission": "需要麥克風權限。",
"notConfigured": "請先設定轉寫提供商。",
"tooLong": "錄音時間太長。",
"tooShort": "請稍微多錄一會兒。",
"noInput": "沒有偵測到麥克風輸入。",
"failed": "語音轉寫失敗。"
},
"slash": {
"ariaLabel": "斜線命令",
"label": "命令",