personality: bool API, i18n across the app

- Collapse intent tri-state (respond/rewrite/compose) to `personality: bool` on /generate, /speak, and voicebox.speak. Drop respond entirely; keep compose as a standalone button via /profiles/{id}/compose. Remove /rewrite, /respond, and /speak profile endpoints.
- FloatingGenerateBox: Wand2 persona toggle + Dices compose button appear when the selected profile has a personality. ProfileCard badges Wand2 alongside the effects Sparkles.
- MCP bindings: default_intent column → default_personality: bool. Migration drops the legacy column.
- i18n: en / ja / zh-CN / zh-TW translation files filled out and wired through the capture, server, and profile UI.

```ts
voicebox.speak({
  text: "Deploy complete.",
  profile: "Morgan",
  personality: true, // rewrite through the profile's personality LLM
});
```
This commit is contained in:
Jamie Pine
2026-04-23 17:31:23 -07:00
parent 7c50e189cb
commit abf5dfda8c
41 changed files with 2146 additions and 1193 deletions
+357 -1
View File
@@ -14,6 +14,7 @@
"nav": {
"generate": "生成",
"stories": "故事",
"captures": "擷取",
"voices": "聲音",
"effects": "效果",
"audio": "音訊",
@@ -21,6 +22,138 @@
"settings": "設定",
"updateBadge": "更新"
},
"captures": {
"title": "擷取",
"beta": "Beta",
"searchPlaceholder": "搜尋轉錄文字……",
"snippetEmpty": "(無轉錄文字)",
"noTranscriptError": "此擷取尚無轉錄文字",
"captureCardLabel": "擷取 · {{when}}",
"playerVoiceLabel": "{{voice}} · {{captureId}}",
"header": {
"modelSummary": "Whisper {{stt}} · Qwen3 · {{llm}}"
},
"source": {
"dictation": "口述",
"recording": "錄音",
"file": "檔案"
},
"transcript": {
"refined": "精修",
"raw": "原始",
"refinedHint": "由 Qwen3 · {{model}} 精修",
"rawHint": "由 Whisper {{model}} 轉錄"
},
"actions": {
"configure": "設定",
"import": "匯入",
"importing": "上傳中…",
"dictate": "口述",
"stop": "停止",
"copy": "複製",
"refine": "精修",
"reRefine": "重新精修",
"sendTo": "傳送至",
"delete": "刪除",
"playAs": "以 {{name}} 播放",
"playAsFallback": "以聲音播放……",
"playAsGenerating": "生成中…",
"playAsStop": "停止 · {{name}}",
"playAsStopFallback": "停止 · 聲音",
"playAsDropdownLabel": "以聲音播放轉錄文字"
},
"empty": {
"noMatches": "找不到符合 \"{{query}}\" 的擷取",
"none": "尚無擷取。",
"loading": "載入擷取中…",
"pickOne": "選擇一個擷取以檢視其轉錄文字。",
"holdToRecord": "按住以錄音",
"toggleHandsFree": "切換免持模式",
"pressShortcut": "在您的電腦上任何位置按下快捷鍵以開始第一次擷取。",
"turnOnShortcut": "開啟全域快捷鍵以從任何地方口述——或點選上方的「口述」進行 App 內擷取。",
"openSettings": "開啟擷取設定"
},
"toast": {
"deleteFailed": "刪除失敗",
"playAsFailed": "以聲音播放失敗",
"noVoice": "無聲音檔案",
"noVoiceDescription": "使用「以聲音播放」前請先建立聲音檔案。",
"transcriptCopied": "已複製轉錄文字",
"copyFailed": "複製失敗",
"shortcutNotArmed": "快捷鍵已開啟,但尚未就緒",
"shortcutNotArmedDescription_one": "{{names}} 仍需下載。請開啟「擷取」分頁開始下載。",
"shortcutNotArmedDescription_other": "{{names}} 仍需下載。請開啟「擷取」分頁開始下載。"
},
"pill": {
"recording": "錄音中",
"transcribing": "轉錄中",
"refining": "精修中",
"speaking": "發話中",
"completed": "完成",
"stopAria": "停止錄音",
"errorFallback": "發生錯誤",
"errorCopyTooltip": "點選複製錯誤訊息"
},
"chord": {
"capturing": "擷取中…",
"pressShortcut": "請按下您的快捷鍵",
"noKeys": "尚未設定按鍵",
"unsupported": "「{{key}}」無法用於組合鍵。請改用修飾鍵或字母鍵。",
"notSet": "未設定"
},
"readiness": {
"title": "口述前還需要幾項準備",
"subheading": "在下列項目全部就緒前,快捷鍵將維持關閉。",
"downloadButton": "下載",
"downloading": "下載中…",
"downloadingPercent": "下載中… {{pct}}%",
"downloadStarted": "已開始下載",
"downloadStartedDescription": "{{name}} 正在下載。下載完成後快捷鍵會自動就緒。",
"downloadFailed": "下載失敗",
"stt": {
"label": "{{name}}(語音轉文字)",
"ready": "模型已下載。",
"missing": "用於轉錄您的音訊",
"missingWithSize": "用於轉錄您的音訊 · {{size}}"
},
"llm": {
"label": "{{name}}(精修)",
"ready": "模型已下載。",
"missing": "在貼上前清理原始轉錄文字",
"missingWithSize": "在貼上前清理原始轉錄文字 · {{size}}"
},
"inputMonitoring": {
"label": "輸入監控權限",
"ready": "macOS 允許 Voicebox 偵測您的全域快捷鍵。",
"missing": "macOS 需要允許 Voicebox 偵測全域快捷鍵。",
"openSettings": "開啟設定"
},
"accessibility": {
"label": "輔助使用權限",
"ready": "Voicebox 可將轉錄文字貼到其他 App。",
"missing": "需要此權限才能將轉錄文字貼到目前作用中的 App。",
"openSettings": "開啟設定"
}
},
"permissions": {
"accessibility": {
"title": "授予輔助使用權限以啟用自動貼上",
"body": "Voicebox 需要 <path>系統設定 → 私隱與安全性 → 輔助使用</path> 才能將轉錄文字貼到其他 App。即使沒有此權限,口述內容仍會出現在「擷取」分頁。",
"openSettings": "開啟設定",
"recheck": "我已啟用",
"rechecking": "檢查中…",
"stillMissing": "仍未偵測到。macOS 通常需要在切換權限後結束並重新開啟 Voicebox。"
},
"inputMonitoring": {
"title": "授予輸入監控權限以啟用全域快捷鍵",
"body": "Voicebox 需要 <path>系統設定 → 私隱與安全性 → 輸入監控</path> 才能偵測您的口述組合鍵。功能已開啟,但 macOS 在您允許前會封鎖按鍵事件。",
"openSettings": "開啟設定",
"recheck": "我已啟用",
"rechecking": "檢查中…",
"stillMissing": "仍未偵測到。macOS 通常需要在切換權限後結束並重新開啟 Voicebox。"
}
}
},
"voicesTab": {
"title": "聲音",
"loading": "載入聲音中…",
@@ -125,7 +258,10 @@
"noPreference": "無偏好",
"defaultEngineHint": "選擇此檔案時自動使用此引擎。",
"defaultEffects": "預設效果",
"defaultEffectsHint": "自動套用於使用此聲音所有新生成的效果。"
"defaultEffectsHint": "自動套用於使用此聲音所有新生成的效果。",
"personalityLabel": "個性",
"personalityPlaceholder": "選填。描述這個聲音是誰以及他們如何說話。例如:「一位脾氣暴躁的海盜,只會用航海比喻說話」。會驅動生成頁面上的「撰寫」按鈕和角色化重寫切換。",
"personalityHint": "留空則在生成頁面隱藏「撰寫」按鈕和角色切換。"
},
"avatar": {
"alt": "頭像預覽"
@@ -550,6 +686,18 @@
"effects": {
"none": "無效果",
"profileDefault": "檔案預設"
},
"compose": {
"tooltip": "撰寫",
"ariaLabel": "以角色撰寫一句台詞",
"failedTitle": "撰寫失敗",
"failedDescription": "無法從此個性生成文字。"
},
"persona": {
"tooltipActive": "以角色發話中",
"tooltipInactive": "以角色發話",
"ariaLabelActive": "以角色發話中",
"ariaLabelInactive": "以角色發話"
}
},
"main": {
@@ -571,6 +719,8 @@
"tabs": {
"general": "一般",
"generation": "生成",
"captures": "擷取",
"mcp": "MCP",
"gpu": "GPU",
"logs": "日誌",
"changelog": "更新日誌",
@@ -678,6 +828,212 @@
"open": "開啟"
}
},
"captures": {
"dictation": {
"title": "口述",
"description": "使用全域快捷鍵從電腦上任何位置進行擷取。",
"globalShortcut": {
"title": "全域快捷鍵",
"description": "按住快捷鍵以從電腦上任何位置錄音。放開後進行轉錄。第一次開啟時 macOS 會要求輸入監控權限。"
},
"pushToTalk": {
"title": "按住說話快捷鍵",
"description": "在系統任何位置按住這些按鍵即可錄音。放開後停止並轉錄。",
"change": "變更"
},
"toggle": {
"title": "切換快捷鍵",
"description": "按一次開始免持錄音。再按一次停止。通常為按住說話加上 Space。",
"change": "變更"
},
"chordPicker": {
"pttTitle": "設定按住說話快捷鍵",
"pttDescription": "按住您要使用的按鍵,然後放開並點選「儲存」。右側修飾鍵徽章會顯示按鍵是左側或右側的變體。",
"toggleTitle": "設定切換快捷鍵",
"toggleDescription": "按住您要使用的按鍵,然後放開並點選「儲存」。請選擇與按住說話組合鍵不同的按鍵。"
},
"preview": {
"title": "預覽",
"description": "按住快捷鍵時螢幕上顯示的內容。"
},
"copyToClipboard": {
"title": "將轉錄文字複製到剪貼簿",
"description": "擷取完成時,清理過的轉錄文字會出現在您的剪貼簿。"
},
"autoPaste": {
"title": "自動貼到目前作用中的文字欄位",
"description": "若另一個 App 中已聚焦於文字輸入,直接貼進去。Voicebox 會儲存並還原您原本剪貼簿上的內容。"
}
},
"transcription": {
"title": "轉錄",
"description": "選擇用於擷取的語音轉文字模型。",
"model": {
"title": "轉錄模型",
"description": "Whisper 隨 Voicebox 提供,完全在您的電腦上執行。",
"base": "Whisper Base · 74M · {{tail}}",
"small": "Whisper Small · 244M · {{tail}}",
"medium": "Whisper Medium · 769M · {{tail}}",
"large": "Whisper Large · 1.5B · {{tail}}",
"turbo": "Whisper Turbo · 精簡版 Large v3 · {{tail}}",
"tail": {
"fast": "快速",
"balanced": "平衡",
"higher": "較高準確度",
"best": "最高準確度",
"nearBest": "接近最佳,快速"
}
},
"language": {
"title": "語言",
"description": "自動偵測適用於大多數擷取。若您總是說同一種語言,可以鎖定它。",
"auto": "自動偵測",
"en": "英文",
"es": "西班牙文",
"fr": "法文",
"de": "德文",
"ja": "日文",
"zh": "中文",
"hi": "印地文"
},
"archive": {
"title": "封存音訊",
"description": "在每筆轉錄文字旁保留原始錄音。"
}
},
"refinement": {
"title": "精修",
"description": "可選擇在轉錄文字上執行本地 LLM,以清除贅詞、補上標點與修正自我更正。",
"auto": {
"title": "自動精修轉錄文字",
"description": "每次擷取後執行。您仍可在「擷取」分頁中切換原始與精修版本。"
},
"model": {
"title": "精修模型",
"description": "較大的模型較慢,但對於細微的自我更正與專業詞彙處理得更好。",
"size06": "Qwen3 · 0.6B · 400 MB · {{tail}}",
"size17": "Qwen3 · 1.7B · 1.1 GB · {{tail}}",
"size4": "Qwen3 · 4B · 2.5 GB · {{tail}}",
"tail": {
"veryFast": "非常快",
"fast": "快速",
"fullQuality": "完整品質"
}
},
"smartCleanup": {
"title": "智慧清理",
"description": "移除贅詞(嗯、呃、那個之類),還原標點符號,修正大小寫,且不重新改寫。"
},
"selfCorrection": {
"title": "移除自我更正",
"description": "當您說到一半改變想法時(「其實不對……」、「等等,我是想說……」),刪掉收回的部分,只保留最終意圖。"
},
"preserveTechnical": {
"title": "保留技術術語",
"description": "完整保留所說的程式碼識別字、指令名稱與縮寫。當您要對程式碼提示進行口述時請開啟。"
}
},
"playback": {
"title": "播放",
"description": "「擷取」分頁中「以聲音播放」動作的預設聲音。",
"defaultVoice": {
"title": "預設聲音",
"description": "當您點選「以聲音播放」但未先選擇聲音時使用。每筆擷取仍可個別變更。",
"noClonedVoices": "尚無複製聲音",
"noneSelected": "未選擇",
"clonedVoices": "複製聲音"
}
},
"storage": {
"title": "儲存",
"description": "擷取會以成對的音訊與轉錄文字檔形式,儲存在您的 Voicebox 資料目錄中。",
"retention": {
"title": "保留期限",
"description": "擷取保留的時間長度。同時適用於音訊與轉錄文字。",
"forever": "永久保留",
"d90": "90 天",
"d30": "30 天",
"d7": "7 天"
},
"clearAll": {
"title": "清除所有擷取",
"description": "永久刪除每一筆擷取與其音訊。此操作無法復原。",
"action": "清除擷取"
}
},
"sidebar": {
"aboutTitle": "關於擷取",
"aboutBody": "在電腦上任何位置按住快捷鍵說話,Voicebox 會將您的聲音轉成文字。可以用任何複製的聲音重播、貼到任何 App,或送進您的程式碼代理。",
"differencesTitle": "有何不同",
"local": {
"title": "完全在本機。",
"body": "Whisper 與精修 LLM 都在您的硬體上執行。沒有雲端、沒有帳號,您的聲音永遠不會離開電腦。"
},
"playAs": {
"title": "以任何聲音播放。",
"body": "轉錄文字可以用您複製過的任何聲音檔案讀回。"
},
"crossPlatform": {
"title": "跨平台。",
"body": "在 macOS、Windows 與 Linux 上享有相同的快捷鍵與相同的流程。"
}
}
},
"mcp": {
"install": {
"title": "安裝到您的代理",
"description": "App 開啟時 Voicebox 會提供本地 MCP 伺服器。將以下其中一段程式碼貼到您的代理 MCP 設定中。",
"http": {
"title": "HTTP(建議)",
"description": "適用於支援 HTTP MCP 的客戶端——Claude Code、Cursor、Windsurf、VS Code。"
},
"claudeCode": {
"title": "Claude Code 一行指令",
"description": "透過 Claude Code CLI 註冊。"
},
"stdio": {
"title": "Stdio(備用)",
"description": "適用於只能啟動 stdio 程序的客戶端。Shim 二進位檔隨 App 提供。"
},
"copy": "複製",
"copied": "已複製"
},
"defaultVoice": {
"title": "預設聲音",
"description": "當代理呼叫 voicebox.speak 卻未指定聲音檔案,且沒有對應客戶端綁定時使用。",
"label": "預設播放聲音",
"labelHint": "與「擷取」分頁的「以聲音播放」下拉選單共用——一個用於被動播放的預設聲音。",
"none": "(無)"
},
"bindings": {
"title": "個別代理聲音",
"description": "將特定代理綁定到特定聲音,讓您不用看就能聽出是誰在說話。代理透過 X-Voicebox-Client-Id 標頭(stdio 則用 VOICEBOX_CLIENT_ID 環境變數)識別自己。",
"empty": "尚無綁定。請在下方新增,然後將您的 MCP 客戶端設定為傳送對應的 <code>X-Voicebox-Client-Id</code>。",
"lastSeen": "最後出現於 {{when}}",
"lastSeenTitle": "最後出現於 {{when}}",
"neverConnected": "從未連線",
"defaultOption": "(預設)",
"removeAria": "移除 {{client}} 的綁定",
"add": {
"title": "新增綁定",
"clientIdPlaceholder": "客戶端 ID(例如 claude-code)",
"labelPlaceholder": "標籤(選填)",
"action": "新增綁定"
}
},
"sidebar": {
"aboutTitle": "關於 MCP",
"aboutBody": "Model Context Protocol 讓您的 AI 程式碼代理——Claude Code、Cursor、Windsurf——可以呼叫 Voicebox 工具。以複製的聲音說話、轉錄音訊、瀏覽擷取。",
"toolsTitle": "可用工具",
"tools": {
"speak": "以聲音檔案說出文字。",
"transcribe": "對片段執行 Whisper STT。",
"listCaptures": "近期口述 / 錄音。",
"listProfiles": "可用的聲音檔案。"
},
"postSpeak": "也提供 <code>POST /speak</code> 介面,供 shell 指令稿、ACP、A2A 使用。"
}
},
"gpu": {
"cpuOnly": "僅 CPU",
"vramUsed": "{{mb}} MB 顯示記憶體",