Skip to main content
Glama
Sunwood-ai-labs

irodori-anime

Official

๐ŸŽ™๏ธ What it does

A local Gradio app built on Irodori-TTS v4.1 Anime. Generate a voice from a Japanese description, reuse the generated clip as a reference, and compare the next result beside it.

  • Five mature female voice presets and custom voice descriptions.

  • One-click ใ“ใฎ็”Ÿๆˆ้Ÿณๅฃฐใ‚’ๅ‚็…งใซใ™ใ‚‹ (use this generated voice as reference).

  • Separate reference A and generated B players; multiple reference clips are supported.

  • CPU inference with a uv lockfile, a Gradio API, and MCP support.

GitHub hosts the code; the documentation site hosts instructions. Audio generation runs on your own computer.

Related MCP server: LocalVoiceMode

๐Ÿ–ผ๏ธ Screenshots and voice samples

Irodori A/B comparison

The actual app with the first voice and its reference-conditioned result loaded.

Play each voice below. Unmute the player if necessary. These MP4 attachments contain audio only.

Portraits, voice prompts and standard audio players

๐Ÿš€ Quick start

Install Git, uv, Python 3.12 and FFmpeg. The first launch downloads model weights and can take time. The main model alone is approximately 3 GB; dependencies and the codec require additional disk and memory.

git clone https://github.com/Sunwood-ai-labs/irodori-anime-voice-studio.git
cd irodori-anime-voice-studio
uv sync --locked --python 3.12
uv run app.py

Open the URL printed in the terminal (normally http://127.0.0.1:7860). Local inference defaults to CPU/fp32 with two threads. Installation and configuration.

๐ŸŽง Voice workflow

  1. Choose a preset or write a Japanese caption and text, then generate B.

  2. Click ใ“ใฎ็”Ÿๆˆ้Ÿณๅฃฐใ‚’ๅ‚็…งใซใ™ใ‚‹ to place B into reference A.

  3. Change the text and generate again. A remains available for comparison.

  4. Clear the reference file list to return to voice design without a reference.

With multiple references, A previews the first clip while inference uses the ordered list (up to the model's 120-second limit). Download clips you want to keep. The same caption or seed does not guarantee the same voice; reference audio guides similarity.

๐Ÿ”Œ API and MCP

The app includes a Gradio MCP server. MCP agents can retrieve presets and generate speech on the CPU of the computer running the app. GitHub Pages hosts documentation, not an MCP endpoint.

Start and connect

Run from the repository root and keep the terminal open:

uv sync --locked --python 3.12
$env:INFERENCE_DEVICE = 'cpu'
uv run app.py

The app launches with mcp_server=True. Wait for model downloads and loading to finish. Add an HTTP MCP server in your client; configuration file keys vary by client.

Setting

Value

Suggested name

irodori-anime

Preferred transport

Streamable HTTP

Server URL

http://127.0.0.1:7860/gradio_api/mcp/

Legacy SSE endpoint

http://127.0.0.1:7860/gradio_api/mcp/sse

Schema inspection, not a connection URL

http://127.0.0.1:7860/gradio_api/mcp/schema

Match the port to GRADIO_SERVER_PORT if changed. This repository does not bundle a separate stdio MCP server. Installing the agent skill does not start the app or register the MCP connection.

Tools and generation

Discover the tool list after connecting; clients may prefix names with the server name.

Tool

Purpose

Inputs

apply_voice_preset

Retrieve text, caption and seed

name, e.g. 01_ๅคœใฎ็ง˜ๅฏ†; use the preset ID, not the character name

generate

Synthesize speech

text, caption, reference_audio, seconds_raw, seed_raw, num_steps

_on_schedule_change

UI sampling-schedule helper

Not needed for ordinary generation

Example request to your agent:

Use the irodori-anime MCP server to retrieve preset 01_ๅคœใฎ็ง˜ๅฏ†.
Generate a ten-second clip using its caption and seed, with 40 steps.
Save the WAV, use it as a reference for a different line, and preserve both A and B.

Example generate arguments:

{
  "text": "ใ“ใ‚“ใชๆ™‚้–“ใซใ€็งใ‚’ๆŽขใ—ใฆใ„ใŸใฎ๏ผŸ ใ„ใ„ใ‚ใ€ๅฐ‘ใ—ใ ใ‘ไป˜ใๅˆใฃใฆใ‚ใ’ใ‚‹ใ€‚",
  "caption": "่ฝใก็€ใ„ใŸไฝŽใ‚ใฎๅฃฐใฎๅคงไบบๅฅณๆ€งใ€‚้™ใ‹ใช่‡ชไฟกใจไฝ™่ฃ•ใŒใ‚ใ‚Šใ€ไธŠๅ“ใซใ‚†ใฃใใ‚Š่ฉฑใ™ใ€‚",
  "reference_audio": [],
  "seconds_raw": "10",
  "seed_raw": "42",
  "num_steps": 40
}

Duration and seed use strings; empty strings mean automatic duration and random seed. Results include the audio file URL and run log in MCP content. Download generated files to a persistent output directory.

Reference audio and A/B comparison

For MCP, reference_audio is an array of audio URLs reachable by the Gradio server. For example, add the following field alongside text and caption:

{
  "reference_audio": [
    "https://sunwood-ai-labs.github.io/irodori-anime-voice-studio/samples/voice-1.wav"
  ]
}

You can reuse the Gradio file URL returned by a previous generation. For local files, use upload_file_to_gradio if your client supplies it; this repository does not expose that helper itself. Otherwise use the Python API with handle_file. Do not substitute a Windows filesystem path for a URL.

Save reference A before generating B. MCP calls do not click the UI's reference button or automatically update its comparison panels. Preserve reference order; the model supports up to 120 seconds of reference audio.

Local MCP example: pass an absolute WAV path

A separate local stdio MCP server on the development PC generated speech with a local WAV path through generate_speech. This is different from the Gradio MCP server above. That local server is not bundled in this repository; cloning this project does not install a generate_speech tool.

Server

Generation tool

reference_audio

Duration and seed

This repository's Gradio MCP

generate

Array of audio URLs

seconds_raw: "10", seed_raw: "42"

Separately configured local stdio MCP on the development PC

generate_speech

One absolute local WAV path

seconds: 10, seed: 42

The following local generate_speech request is reconstructed from the saved metadata of the reference-conditioned generation using voice 1. It is not a captured wire request.

{
  "text": "ใพใŸไผšใˆใŸใ‚ใญใ€‚ใ‚ใชใŸใŒๆฅใ‚‹ใ“ใจใ€ใชใœใ‹ๅˆ†ใ‹ใฃใฆใ„ใŸใฎใ€‚ไปŠๅคœใฏๅฐ‘ใ—ใ ใ‘ใ€็งใฎ็ง˜ๅฏ†ใซไป˜ใๅˆใฃใฆใ€‚",
  "preset": "01_ๅคœใฎ็ง˜ๅฏ†",
  "seconds": 10,
  "steps": 40,
  "seed": 42,
  "reference_audio": "C:\\Prj\\Irodori-TTS-CPU\\outputs\\cool-beauty-five\\01_ๅคœใฎ็ง˜ๅฏ†.wav"
}

This path is the development PC's example. If using an equivalent local server, replace it with an existing, readable PCM WAV absolute path on the server's computer. Escape Windows backslashes as \\ in JSON. The preset supplies the caption, so this example omits caption. The saved generation metadata confirms CPU execution, enabled speaker conditioning, and a ten-second 48 kHz output.

Do not pass this JSON unchanged to Gradio's generate. Users of this repository should use the URL-array example above. For convenient local WAV uploads, the Python API supports handle_file, but that call uses the Python API rather than MCP. Always inspect the connected server's tool names and argument schema first.

The development PC's local MCP now defaults to automatic duration when seconds is omitted, just as with explicit null. The ten-second value above reproduces a historical fixed-length run; normally remove that field. Check that the complete line is spoken, and adjust the text length for approximate duration requests.

Verify the MCP connection

Save this as UTF-8 check_mcp.py, then run uv run check_mcp.py from the repository. It checks the handshake, tool list and preset call without generating audio.

import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

async def main():
    url = "http://127.0.0.1:7860/gradio_api/mcp/"
    async with streamablehttp_client(url) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            print([tool.name for tool in (await session.list_tools()).tools])
            result = await session.call_tool(
                "apply_voice_preset", {"name": "01_ๅคœใฎ็ง˜ๅฏ†"}
            )
            if result.isError:
                raise RuntimeError(result)
            print(result)

asyncio.run(main())

Troubleshooting and validation scope

Symptom

Check

Connection refused

App readiness, actual port, and whether its terminal is still running

404 / transport error

Streamable HTTP /gradio_api/mcp/ versus legacy /sse

Missing tools

Reconnect and discover tools. UI-only reference buttons are not MCP tools

Reference upload failure

A server-reachable URL or a completed upload is required

CPU generation timeout

A ten-second clip takes longer than ten seconds to generate; extend client timeouts and avoid duplicate jobs

Cloud agent cannot connect

127.0.0.1 refers to the connecting machine; use an MCP client on the same PC

The locked Gradio 6.26.0 local environment was checked with a Streamable HTTP handshake, tool discovery and preset call. Real speech generation was separately checked through the Python API. This does not claim generation or file-upload validation for every MCP client.

๐Ÿ› ๏ธ Agent skill

irodori-voice-studio guides local CPU speech generation, the five presets, reference reuse, and A/B comparisons.

Ask Codex's skill-installer to install the skill:

Install the skill from https://github.com/Sunwood-ai-labs/irodori-anime-voice-studio/tree/main/skills/irodori-voice-studio

Then invoke $irodori-voice-studio, for example: โ€œUse voice 1 as a reference, generate a new ten-second line, and save A and B.โ€ The app checkout and runtime are required separately. Keeping the skill in this repository does not register it globally.

๐Ÿ“š Documentation

๐Ÿงช Development and validation

uv run python -m unittest test_voice_workflow -v
npm ci --prefix docs
npm run build --prefix docs

Workflow tests exercise real Gradio file processing with mocked inference; they do not benchmark voice quality. Local Windows CPU smoke tests also completed real reference-conditioned generation. CI does not download model weights.

๐Ÿ™ Credits and license

Derived from hugging-apps/irodori-tts-anime-demo, revision 9d3707972aa237c0c2b895252563669a160e396b. Model: phasefield-audio/Irodori-TTS-v4.1-Anime. Vendored inference code: Aratako/Irodori-TTS. Codec: Semantic-DACVAE. Generated audio retains SilentCipher watermarking.

Code is provided under the MIT license. Refer to the model card for model usage conditions. Model weights and private credentials are not bundled. The samples directory contains the five explicitly published generated recordings and illustrations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables text-to-speech synthesis and voice cloning through GPT-SoVITS API integration. Supports multiple languages (Chinese, English, Japanese, Korean, Cantonese), dynamic model switching, and reference audio-based voice quality replication.
    4
    -
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A local voice interface providing high-performance speech recognition and natural text-to-speech with voice cloning capabilities. It enables AI assistants to speak, listen, and engage in character-based voice conversations through integrated MCP tools.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Adds voice conversation capabilities to AI agents via MCP, enabling local speech recognition and synthesis with tools like speak, listen, and ask_by_voice for interactive voice interactions.
    MIT