Skip to main content
Glama
Trandu1
by Trandu1

OpenRouter Voice MCP

Un pequeño servidor MCP (Python + FastMCP, stdio) que convierte texto en archivos de audio locales usando modelos de voz de OpenRouter. Modelo por defecto:

fish-audio/s2.1-pro-free:free

Diseñado para locución de videos en vietnamita: Codex o Claude Code escribe un guion de narración, llama a render_voiceover() y recibe una ruta absoluta a un MP3 que puede pasar directamente a FFmpeg.

Codex / Claude Code
        |  MCP stdio
OpenRouter Voice MCP
        |  HTTPS
OpenRouter  ->  fish-audio/s2.1-pro-free:free
        |
    MP3 bytes  ->  local file  ->  FFmpeg / video pipeline

Sin PyTorch, CUDA, descargas de modelos locales, LLM local ni puerto HTTP local. Solo Python, tres paquetes puramente Python y una clave API de OpenRouter.


Instalación

Requisitos: Python >= 3.10 en PATH, además de ffmpeg si quieres que render_long_voiceover() concatene segmentos. Obtén una clave API gratuita en https://openrouter.ai/keys.

Un solo comando hace todo: venv, dependencias, .env, pruebas de aceptación y registro con Claude Code y Codex:

git clone https://github.com/Trandu1/mcp_voice.git D:\VoiceAI\openrouter-voice-mcp
cd D:\VoiceAI\openrouter-voice-mcp
.\install.ps1 -ApiKey "sk-or-v1-..." -Register

Equivalente manual, si prefieres ver cada paso:

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
copy .env.example .env      # then set OPENROUTER_API_KEY=sk-or-v1-...
.\.venv\Scripts\python.exe tests\acceptance.py

En macOS / Linux no hay install.ps1; usa los pasos manuales con python3 -m venv .venv y .venv/bin/python, y luego regístrate como se muestra a continuación.

Registro con Claude Code

claude mcp add openrouter-voice --scope user -- `
  D:\VoiceAI\openrouter-voice-mcp\.venv\Scripts\python.exe `
  D:\VoiceAI\openrouter-voice-mcp\server.py
claude mcp get openrouter-voice     # expect: Connected

Registro con Codex

codex mcp add openrouter-voice -- `
  D:\VoiceAI\openrouter-voice-mcp\.venv\Scripts\python.exe `
  D:\VoiceAI\openrouter-voice-mcp\server.py
codex mcp list                      # expect: openrouter-voice

La clave API se lee de .env junto a server.py, por lo que nunca aparece en una línea de comandos ni en el archivo de configuración de ninguna CLI. También puedes exportar OPENROUTER_API_KEY en el entorno en su lugar: un valor exportado tiene prioridad sobre .env.


Related MCP server: MCP MeloTTS Audio Generator

Herramientas

Tool

Qué hace

health()

Config + estado de la clave. Solo sonda de autenticación gratuita, nunca renderiza audio.

render_voiceover(...)

La herramienta principal. Texto -> archivo de audio local.

render_long_voiceover(...)

Divide un guion largo en segmentos, renderiza cada uno y concatena con FFmpeg cuando está disponible.

preview_voice(text, voice)

Muestra corta, escrita en <output_dir>/previews y abierta en el reproductor predeterminado.

list_speech_models()

Todos los modelos de OpenRouter con output_modalities: speech (id, nombre, precio).

model_info(model)

Proveedor / nivel / precio / soporte de clonación de voz en vivo para un modelo.

render_voiceover

render_voiceover(
    text: str,
    output_path: str = "",        # absolute or relative; parents are created
    voice: str = "",              # empty = model default (correct for Fish Audio)
    response_format: str = "",    # "mp3" (default) or "pcm"
    instructions: str = "",       # only sent to providers that document it
    overwrite: bool = False,      # False never clobbers an existing file
    reference_audio_path: str = "",  # optional stateless voice cloning
    reference_text: str = "",
)

Devuelve:

{
  "status": "ok",
  "model": "fish-audio/s2.1-pro-free:free",
  "audio_path": "D:\\campaigns\\abc\\audio\\narration.mp3",
  "format": "mp3",
  "content_type": "audio/mpeg",
  "bytes": 123456,
  "elapsed_seconds": 2.31,
  "duration_seconds": 12.4,
  "generation_id": "gen-..."
}

Los bytes de audio se escriben en disco y nunca se devuelven codificados en base64 a través de MCP: el objetivo es un archivo real para FFmpeg.


Configuración

Todos los ajustes son variables de entorno (ver .env.example):

Variable

Default

Notas

OPENROUTER_API_KEY

Requerida. Nunca se registra ni se devuelve.

OPENROUTER_VOICE_MODEL

fish-audio/s2.1-pro-free:free

OPENROUTER_VOICE

vacío

Fish Audio no documenta IDs de voz predefinidos; déjalo vacío.

OPENROUTER_AUDIO_FORMAT

mp3

mp3 o pcm.

OPENROUTER_TIMEOUT_SECONDS

120

OPENROUTER_HTTP_REFERER

vacío

Se envía solo cuando está configurado.

OPENROUTER_APP_TITLE

OpenRouter Voice MCP

Se envía como X-OpenRouter-Title.

VOICE_OUTPUT_DIR

%USERPROFILE%\OpenRouterVoice\output

Se usa cuando el llamador no pasa output_path.

OPENROUTER_VOICE_FALLBACK_MODEL

vacío

Déjalo vacío. Solo configúralo si aceptas que se te cobre un modelo de pago cuando el gratuito no esté disponible.


Lo que la API realmente soporta

Verificado contra la API de voz de OpenRouter y la API de modelos en vivo (2026-08-25), no inferido de la API TTS más antigua de OpenAI:

  • El endpoint POST https://openrouter.ai/api/v1/audio/speech devuelve un flujo de bytes de audio crudo. Solo las respuestas que no son 200 llevan JSON.

  • Campos de nivel superior: model, input, voice, response_format, speed, input_references, provider.

  • response_format es mp3 o pcm. La API usa pcm por defecto, por lo que este servidor siempre envía el formato explícitamente.

  • instructions no es un campo de nivel superior. Es una opción de proveedor de OpenAI (provider.options.openai.instructions). Fish Audio no documenta opciones de proveedor, por lo que instructions se descarta para los modelos Fish y se informa en warnings — nunca se envían campos inventados.

  • speed solo es respetado por algunos proveedores (OpenAI, Azure); se descarta en otros lugares en lugar de ignorarse silenciosamente en el servidor.

  • Fish Audio no tiene IDs de voz predefinidos (alloy / nova / shimmer pertenecen a OpenAI). Deja voice vacío.

  • La clonación de voz está disponible: la API de endpoints informa supports_voice_cloning: true para fish-audio/s2.1-pro-free:free. Es sin estado: pasas una muestra de audio en base64 en input_references en cada solicitud. No hay un voice_id persistente que crear, por lo que este servidor no tiene una herramienta clone_voice; usa reference_audio_path en render_voiceover en su lugar.

  • Los encabezados de atribución son HTTP-Referer y X-OpenRouter-Title.

Límites del modelo gratuito

fish-audio/s2.1-pro-free:free es una variante gratuita:

  • 20 solicitudes/minuto, 50 solicitudes/día (1000/día una vez que se hayan comprado ≥ $10 de crédito en la cuenta).

  • La disponibilidad, la cola y la latencia no están garantizadas.

  • Cuando el modelo gratuito no está disponible, el servidor devuelve un error claro. Nunca cambia a un modelo de pago a menos que configures explícitamente OPENROUTER_VOICE_FALLBACK_MODEL.

Los fallos transitorios (408, 429, 5xx, errores de red) se reintentan dos veces con una breve retroceso exponencial. 400/401/403 nunca se reintentan.


Pruebas

.\.venv\Scripts\python.exe -m pytest tests -q --asyncio-mode=auto   # unit, mocked HTTP
.\.venv\Scripts\python.exe tests\smoke_test.py                      # live, needs a key
.\.venv\Scripts\python.exe tests\acceptance.py                      # full checklist

smoke_test.py y la mitad en vivo de acceptance.py se omiten limpiamente sin una clave. Una omisión se informa como SKIP, nunca como PASS.


Seguridad

  • La clave API vive en .env (ignorado por git) o en el entorno. Nunca se registra, nunca se escribe en una línea de comandos y nunca se devuelve a través de MCP.

  • health() y model_info() devuelven configuración, nunca credenciales.

  • El servidor solo habla stdio y no vincula ningún puerto TCP.

  • No ejecuta comandos de shell desde la entrada de herramientas. FFmpeg/ffprobe se invocan solo en archivos que este servidor acaba de escribir, y solo cuando están presentes.

  • Las escrituras de archivos van exactamente donde el llamador pide (Codex necesita escribir en directorios de campaña arbitrarios), pero se rechazan directorios, nombres de archivo de Windows no válidos y nombres de dispositivos reservados, y overwrite=False nunca sobrescribe.

Licencia

MIT

Install Server
A
license - permissive license
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Generate images, video, music and voice from your CLI or AI agent. On-brand AI media toolkit.

  • 15 media & data tools for AI agents: search, transcribe, subtitles, voiceover, translate & more.

  • OCR, transcription, file extraction, and image generation for AI agents via MCP.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Trandu1/mcp_voice'

If you have feedback or need assistance with the MCP directory API, please join our Discord server