mcpField
9
9router-tts

9router-tts

github.com/decoluaCreative & media31.6k131 installsUpdated today
Repository

About 9router-tts

9router-tts is a skill for using 9Router text-to-speech services in workflows that convert text to audio. It supports model and voice discovery and returns either raw audio bytes or Base64 audio in JSON.

Key features

  1. 01Generate speech from text
  2. 02Discover TTS models and voices
  3. 03Return MP3 or JSON responses
  4. 04Use provider-specific voice identifiers

Use cases

  1. 01Create an MP3 file from text
  2. 02Select available voices by language
  3. 03Receive Base64 audio in an application
  4. 04Generate speech through different providers

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/decolua/9router --skill 9router-tts

After installing, type/9router-ttsin Claude Code to confirm it loaded.

Details

From the project README

9Router — Text-to-Speech

Requires NINEROUTER_URL (and NINEROUTER_KEY if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.

Discover

# 1) List models
curl $NINEROUTER_URL/v1/models/tts | jq '.data[].id'
# 2) Per-model metadata (params, voicesUrl if voice-by-id)
curl "$NINEROUTER_URL/v1/models/info?id=el/eleven_multilingual_v2"
# 3) List voices (elevenlabs, edge-tts, deepgram, inworld, local-device). Optional ?lang=vi
curl "$NINEROUTER_URL/v1/audio/voices?provider=edge-tts&lang=vi" | jq '.data[].model'

model field in /v1/audio/speech = voice ID directly (e.g. edge-tts/vi-VN-HoaiMyNeural, el/<voice_id>, or openai/tts-1 model+default voice).

Endpoint

POST $NINEROUTER_URL/v1/audio/speech

FieldRequiredNotes
modelyesvoice ID from /v1/models/tts
inputyestext to speak

Query ?response_format=mp3 (default, raw bytes) or ?response_format=json ({audio: base64, format}).

Examples

Save MP3:

curl -X POST "$NINEROUTER_URL/v1/audio/speech" \
  -H "Authorization: Bearer $NINEROUTER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"openai/tts-1","input":"Hello world"}' \
  --output speech.mp3

JS (save file):

import { writeFile } from "node:fs/promises";
const r = await fetch(`${process.env.NINEROUTER_URL}/v1/audio/speech`, {
  method: "POST",
  headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ model: "el/eleven_multilingual_v2", input: "Xin chào" }),
});
await writeFile("speech.mp3", Buffer.from(await r.arrayBuffer()));

Response shape

Default → raw audio bytes (Content-Type audio/mp3).

?response_format=json:

{ "audio": "SUQzBAAAA...", "format": "mp3" }

Provider quirks (model format)

Providermodel formatNotes
openaitts-1/alloy (model/voice) or just voiceDefault model gpt-4o-mini-tts
elevenlabs<model_id>/<voice_id> or <voice_id>Default model eleven_flash_v2_5; list voices in Dashboard
openrouteropenai/gpt-4o-mini-tts/alloyStreamed via chat-completions audio modality
edge-ttsvoice id e.g. vi-VN-HoaiMyNeuralnoAuth; default vi-VN-HoaiMyNeural
google-ttslanguage code e.g. en, vinoAuth
local-deviceOS voice name (say -v ? / SAPI)noAuth; needs ffmpeg
deepgramaura-asteria-en etcToken auth
nvidia, inworld, cartesia, playhtmodel/voiceProvider-specific auth header
coqui, tortoisespeaker / voice idLocalhost noAuth
hyperbolicmodel idBody = {text} only

Comments

Markdown supported