Generated: 2026-07-04 Status: Draft
When producing radio dramas or narrated audio from novel/story manuscripts, the intellectual work — script conversion, speaker attribution, performance direction — can be handled by Claude Code / Cowork agents, but agents have no "voice." This tool is an MCP server that wraps local TTS engines (AivisSpeech Engine first), providing agents with a speaker catalog (including license metadata), pronunciation dictionary registration, batch script synthesis, and mastering — enabling a fully local, autonomous workflow from manuscript to finished audio. The target user is an individual creator building creative workflows with Claude Code / Cowork (initially the author himself).
Unlike a traditional command-line pipeline (a self-contained CLI with embedded LLM calls), all judgment and creative work stays on the agent side; this tool handles only deterministic heavy lifting (engine management, synthesis, post-processing).
MCP server (stdio transport) exposing 6 tools:
| Tool | Summary |
|---|---|
list_speakers |
Returns speakers + styles from the connected engine, with each voice model's terms of use and credit line included as metadata so the agent can consider licensing during casting |
register_dictionary |
Bulk-registers a work-specific pronunciation dictionary (proper nouns, coined words) via the engine's /user_dict_word API |
synthesize_script |
Batch-synthesizes a script JSONL in the workspace (passed by file path). Line-hash cache re-synthesizes only changed lines. Runs as an async job for long works |
synthesize_line |
Single-line synthesis for retakes |
check_job |
Returns async job progress and failed lines in structured form |
master |
Concatenation, loudness normalization, and mp3/m4b export via ffmpeg. Auto-generates credit text from the terms of the models used |
Following the Go convention: single binary + subcommands (serve plus debug subcommands as needed).
- Input:
- Script JSONL — engine-independent intermediate format. One line = one utterance:
{"id", "scene", "speaker", "text", "style", "intensity", "speed", "pause_after_ms"}. The canonical schema definition lives in this MCP; the follow-up skill references it - Casting table — character name → engine speaker UUID + style ID mapping (with columns for license-check status and credit line)
- Pronunciation dictionary — list of word / reading / accent entries
- Script JSONL — engine-independent intermediate format. One line = one utterance:
- Output: per-line WAV files (named by line ID for retakes), master audio (mp3 / m4b), credit text. Tool results never contain audio bytes; they return workspace file paths plus a per-line success/duration summary (token economy)
- Scoping: one work = one workspace.
workspace_idisolates dictionaries, casting tables, synthesis caches, and jobs per work (same approach as data-toolbox-mcp)
config.toml(engine binary path, port, output root, ffmpeg path, etc.), following lite-series config conventions (sectioned TOML)-cflag to switch between multiple configs (same approach as ask-llm-mcp)
- AivisSpeech Engine — official binary installed by the user. The MCP server spawns it as a child process, health-checks it, and reaps it on shutdown (default port 10101, VOICEVOX-compatible HTTP API)
- ffmpeg — used only by the
mastertool. Must be pre-installed (runtime dependency) - Zero Go library dependencies — net/http + os/exec only. No cloud APIs, no credentials
- Go: single-binary distribution and the org's zero-external-dependency policy. Ports the data-toolbox-mcp skeleton (workspace scoping, structured errors
{code, message, details}, surfacing child-process exit status, no internal ID exposure) - v1 targets AivisSpeech Engine only: the API is VOICEVOX-compatible, so the engine abstraction stays in the design while verification is focused on one engine. Adding VOICEVOX ENGINE (wider voice roster) is a future extension
- MCP manages the engine lifecycle: spawn if not running, reap on shutdown. Zero preparation work for the agent/user, enabling truly autonomous workflows
- macOS only (v1): engine spawning and model paths are OS-dependent and the primary goal is local macOS production, so v1 focuses on darwin-arm64. Windows / Linux to be considered later
- Complements existing tools: the "voice" alongside data-toolbox-mcp (data-analysis hands) and ask-llm-mcp (consultation mouth). The follow-up radio-drama skill (skills-series, separate project) will be its first consumer
- Explicitly out of scope: script conversion / voice-script authoring / casting decisions (the agent's job), BGM/SE mixing (post-process in a DAW), voice model training/cloning, cloud TTS, streaming playback, the skills-series skill (separate RFP)
Conclusions of a deep-research comparison (25 sources, 24 claims verified 3-0):
- AivisSpeech Engine — runs Style-Bert-VITS2-family models in AIVMX (ONNX) format with CPU inference. Officially supports macOS 13+ (Apple Silicon recommended), LGPL-3.0 only. SBV2-family Japanese quality (accent/intonation) is current state of the art. Per-line emotional control via style IDs +
intonationScale(0.0–2.0) - Direct Style-Bert-VITS2 use was rejected (macOS unsupported officially + AGPL-3.0). Kokoro-family (MIT/Apache 2.0, fast) was rejected for having only 2 Japanese voices, failing the multi-speaker casting requirement. VOICEVOX remains a future candidate for expanding character voices
- config.toml loading; engine lifecycle management (spawn / health check / reap)
- Workspace management (create / list / delete)
list_speakers,synthesize_line,synthesize_script(synchronous, small-scale)- Script JSONL schema v1 + casting table definition
- Tests: engine mocked with httptest + dummy MCP client harness
- Async job execution for
synthesize_script+check_job - Line-hash cache (differential re-synthesis)
register_dictionarymaster(ffmpeg concat / loudness normalization / mp3-m4b) + automatic credit generation- Speaker license metadata curation
- E2E verification with a real (short) work
- docs/{en,ja} three layers, README.md / README.ja.md, CHANGELOG.md, AGENTS.md
- make build (darwin-arm64, Developer ID signed + notarized)
- v0.1.0 release, umbrella submodule update, org profile update, check-org.sh
Each phase is independently reviewable.
None. Fully local operation (engine on localhost; no cloud APIs, OAuth, or credentials).
Series: util-series
Reason: same lineage as data-toolbox-mcp / ask-gemini-mcp / ask-llm-mcp — MCP servers that give agents capabilities. The design is settled and the use case is clear, so util-series rather than lab-series (experimental). Development starts in _wip/voice-studio-mcp/ and is added to the umbrella as a submodule at integration time.
- AivisSpeech Engine constraints:
- Non-streaming (returns WAV after full synthesis) — acceptable since this use case is batch generation
- Some VOICEVOX APIs return
501 Not Implemented(/synthesis_morphing,/cancellable_synthesis, etc.) - Requires 1.5GB+ RAM; first startup and first model load take time
- Intel Macs are not actively verified upstream (Apple Silicon assumed)
- Voice model terms: each AIVMX model has its own terms of use (separate from the software's LGPL-3.0). Since the output is distributable media, the casting table carries license-check status and
masterauto-generates credits - ffmpeg: must be pre-installed when using
master
- 2026-07-04 TTS foundation research: deep-research workflow (25 sources, 24 claims verified 3-0) compared macOS-local Japanese TTS. Conclusion: AivisSpeech (SBV2 family, LGPL-3.0, official macOS support) for quality-first batch generation; kokoro family for real-time. This project adopts AivisSpeech as it is batch-oriented
- Architecture pivot: initially considered a Go CLI pipeline with embedded LLM calls (manuscript → script → voice script → audio); changed to the premise that agents (Claude Code / Cowork) do the script work themselves, and this tool provides only the synthesis part as an MCP server
- Naming: compared voice-studio-mcp / audio-drama-mcp / tts-toolbox-mcp / speech-forge-mcp; chose voice-studio-mcp as it conveys the scope beyond synthesis (dictionary, casting info, mastering)
- v1 engine scope: AivisSpeech only; the VOICEVOX-compatible API keeps multi-engine extension open
- Engine lifecycle: MCP spawns/reaps the engine as a child process (no human preparation in autonomous workflows)
- master scope: included in v1 (ffmpeg runtime dependency accepted). BGM/SE mixing explicitly out of scope
- Skill separation: this RFP covers the MCP server only. The radio-drama skill (skills-series) with script-conversion procedures is a separate project after the MCP ships. The script JSONL schema is canonically owned by the MCP
- Platform: v1 is macOS (darwin-arm64) only, limiting OS branching and verification cost in engine management
- Workspace adoption: one work = one workspace, isolating dictionary/casting/cache/jobs (data-toolbox-mcp approach)
- Series placement: util-series (consistent with the MCP server lineage)