rebrand: rename VoiceBox to TalkBox throughout codebase
CI / frontend-quality (push) Canceled after 0s

- All 'voicebox'/'Voicebox'/'VOICEBOX' strings replaced with 'talkbox'/'TalkBox'/'TALKBOX'
- Port changed from 17493 to 17494 (avoids conflict with upstream VoiceBox)
- MCP tool namespace: voicebox.* -> talkbox.*
- App bundle ID: sh.voicebox.app -> com.talkbox.app
- Binary names: voicebox-server -> talkbox-server, voicebox-mcp -> talkbox-mcp
- Docker user/group: voicebox -> talkbox
- Database: voicebox.db -> talkbox.db
- Env vars: VOICEBOX_* -> TALKBOX_*
- Asset files renamed: voicebox-logo.* -> talkbox-logo.*, etc.
- External binaries in tauri.conf.json updated to talkbox-server/talkbox-mcp
This commit is contained in:
2026-08-24 19:45:56 -07:00
parent eaef8dd838
commit b8815e94ea
205 changed files with 1593 additions and 1593 deletions
+17 -17
View File
@@ -1,7 +1,7 @@
"""Voicebox MCP tool implementations.
"""TalkBox MCP tool implementations.
Thin wrappers over existing services/routes. Tools are registered with dotted
names (``voicebox.speak`` etc.) so they look natural in agent logs —
names (``talkbox.speak`` etc.) so they look natural in agent logs —
the Python function name stays snake_case.
"""
@@ -33,17 +33,17 @@ MAX_TRANSCRIBE_BYTES = 200 * 1024 * 1024 # 200 MB
def register_tools(mcp: FastMCP) -> None:
"""Attach all Voicebox tools to the given FastMCP instance."""
"""Attach all TalkBox tools to the given FastMCP instance."""
@mcp.tool(
name="voicebox.speak",
name="talkbox.speak",
description=(
"Speak text in a Voicebox voice profile. Returns a generation id "
"Speak text in a TalkBox voice profile. Returns a generation id "
"the caller can poll at /generate/{id}/status. Audio plays on the "
"user's speakers and is saved to the Captures / History tab."
),
)
async def voicebox_speak(
async def talkbox_speak(
text: str,
profile: str | None = None,
engine: str | None = None,
@@ -79,7 +79,7 @@ def register_tools(mcp: FastMCP) -> None:
raise ValueError(
"No voice profile resolved. Pass `profile=` with a "
"voice profile name or id, or set a default voice in "
"Voicebox → Settings → MCP."
"TalkBox → Settings → MCP."
)
binding = None
@@ -113,14 +113,14 @@ def register_tools(mcp: FastMCP) -> None:
db.close()
@mcp.tool(
name="voicebox.transcribe",
name="talkbox.transcribe",
description=(
"Transcribe an audio clip to text using Voicebox's local Whisper. "
"Transcribe an audio clip to text using TalkBox's local Whisper. "
"Pass exactly one of `audio_base64` (bytes as base64) or "
"`audio_path` (absolute local file path — loopback callers only)."
),
)
async def voicebox_transcribe(
async def talkbox_transcribe(
audio_base64: str | None = None,
audio_path: str | None = None,
language: str | None = None,
@@ -132,7 +132,7 @@ def register_tools(mcp: FastMCP) -> None:
)
# Absolute-path mode: validate and transcribe in place. Restricted
# to loopback callers so a Voicebox bound on 0.0.0.0 doesn't double
# to loopback callers so a TalkBox bound on 0.0.0.0 doesn't double
# as an unauthenticated arbitrary-local-file read primitive.
if audio_path is not None:
if not request_is_loopback():
@@ -171,13 +171,13 @@ def register_tools(mcp: FastMCP) -> None:
tmp_path.unlink(missing_ok=True)
@mcp.tool(
name="voicebox.list_captures",
name="talkbox.list_captures",
description=(
"List recent voice captures (dictations, recordings, uploads) "
"with their transcripts. Most-recent first."
),
)
async def voicebox_list_captures(
async def talkbox_list_captures(
limit: int = 20, offset: int = 0
) -> dict[str, Any]:
if not (1 <= limit <= 200):
@@ -199,13 +199,13 @@ def register_tools(mcp: FastMCP) -> None:
db.close()
@mcp.tool(
name="voicebox.list_profiles",
name="talkbox.list_profiles",
description=(
"List available voice profiles (both cloned voices and presets). "
"Use the returned `name` with voicebox.speak(profile=...)."
"Use the returned `name` with talkbox.speak(profile=...)."
),
)
async def voicebox_list_profiles() -> dict[str, Any]:
async def talkbox_list_profiles() -> dict[str, Any]:
db = next(get_db())
try:
profiles = await profiles_service.list_profiles(db)
@@ -318,7 +318,7 @@ async def _transcribe_file(
) and not whisper._is_model_cached(model_size):
raise ValueError(
f"Whisper model '{model_size}' is not yet downloaded. Open "
"Voicebox → Settings → Models to download it first."
"TalkBox → Settings → Models to download it first."
)
text = await whisper.transcribe(str(path), language, model_size)