Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/decolua/9router/9router-ttsnpx skills add decolua/9router --skill 9router-ttsgit clone --depth 1 https://github.com/decolua/9routerWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00070 | $0.00988 |
| Opus 5 | $0.00035 | $0.00494 |
| Sonnet 5 | $0.00014 | $0.00198 |
| Haiku 4.5 | $0.00007 | $0.00099 |
Grade A, and why
9router-tts scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
curl $NINEROUTER_URL/v1/models/tts | jq '.data[].id' Copies of this mod
3 near-identical copies found in the catalogue:
- 10router-tts — 89% identical, 24 lines differ
- extremerouter-tts — 88% identical, 8 lines differ
- zenrouter-tts — 88% identical, 24 lines differ
How it starts
The opening of the file, as written. The whole thing — 81 lines — stays where its author put it; the contents beside it link to each section on GitHub.
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
| Field | Required | Notes |
|---|---|---|
model |
yes | voice ID from /v1/models/tts |
input |
yes | text 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)
| Provider | model format |
Notes |
|---|---|---|
openai |
tts-1/alloy (model/voice) or just voice |
Default model gpt-4o-mini-tts |
elevenlabs |
<model_id>/<voice_id> or <voice_id> |
Default model eleven_flash_v2_5; list voices in Dashboard |
openrouter |
openai/gpt-4o-mini-tts/alloy |
Streamed via chat-completions audio modality |
edge-tts |
voice id e.g. vi-VN-HoaiMyNeural |
noAuth; default vi-VN-HoaiMyNeural |
google-tts |
language code e.g. en, vi |
noAuth |
local-device |
OS voice name (say -v ? / SAPI) |
noAuth; needs ffmpeg |
deepgram |
aura-asteria-en etc |
Token auth |
nvidia, inworld, cartesia, playht |
model/voice |
Provider-specific auth header |
coqui, tortoise |
speaker / voice id | Localhost noAuth |
hyperbolic |
model id | Body = {text} only |
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 81 lines · 70 tokens per session scan A 8f7b6ad7f846
9router-tts is a skill published in the GitHub repository decolua/9router (26,675 stars, last pushed 3d ago), licensed MIT. It adds 70 tokens to every session and 988 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
extremerouter-stt
Speech-to-text via ExtremeRouter /v1/audio/transcriptions using OpenAI Whisper / Groq / Gemini / Deepgram / AssemblyAI / NVIDIA / HuggingFace models. Use when the user wants to transcribe audio, convert speech to text, or get subtitles from audio files.
extremerouter
Entry point for ExtremeRouter — local/remote AI gateway with OpenAI-compatible REST for chat, image, TTS, embeddings, web search, web fetch. Use when the user mentions ExtremeRouter, NINEROUTERURL, or wants AI without writing provider boilerplate. This skill covers setup + indexes capability skills; fetch the relevant…
feednest
Read, search, highlight, and organize news from the user's RSS feeds through natural language.
tokonomix-gateway
Direct HTTP access to the Tokonomix AI gateway — OpenAI- and Anthropic-compatible endpoints for chat, image generation, image editing, vision consensus, embeddings, audio transcription and reranking, with EU data-residency routing through one key. Use when building an app, an agent framework, or a CI pipeline without…
extremerouter-image
Generate images via ExtremeRouter /v1/images/generations using OpenAI / Gemini Imagen / DALL-E / FLUX / MiniMax / SDWebUI / ComfyUI / Codex models. Use when the user wants to create, generate, draw, or render an image, picture, or text-to-image (txt2img).
extremerouter-tts
Text-to-speech via ExtremeRouter /v1/audio/speech using OpenAI / ElevenLabs / Deepgram / Edge TTS / Google TTS / Hyperbolic / Inworld voices. Use when the user wants to convert text to speech, generate audio, voiceover, narrate, or read text aloud.