mcpField
9
9router-stt

9router-stt

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

About 9router-stt

9router-stt is a skill for sending audio to 9Router’s transcription endpoint. It supports model discovery, optional transcription settings, and several output formats across providers.

Key features

  1. 01Discover available transcription models
  2. 02Transcribe audio through an API
  3. 03Set language and prompt hints
  4. 04Return JSON, text, or subtitles

Use cases

  1. 01Transcribe an audio recording
  2. 02Create SRT or VTT subtitles

Install

Copy the command and run it in a terminal.

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

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

Details

From the project README

9Router — Speech-to-Text

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

curl $NINEROUTER_URL/v1/models/stt | jq '.data[].id'
# Per-model params (language, response_format, prompt, temperature support)
curl "$NINEROUTER_URL/v1/models/info?id=openai/whisper-1"

model = STT model ID (e.g. openai/whisper-1, groq/whisper-large-v3, deepgram/nova-3, gemini/gemini-2.5-flash).

Endpoint

POST $NINEROUTER_URL/v1/audio/transcriptions (OpenAI Whisper compatible, multipart/form-data)

FieldRequiredNotes
modelyesfrom /v1/models/stt
fileyesaudio file (mp3, wav, m4a, webm, ogg, flac)
languagenoISO-639-1 (e.g. en, vi)
promptnohint text to guide transcription
response_formatnojson (default) / text / verbose_json / srt / vtt
temperatureno0–1

Examples

curl -X POST "$NINEROUTER_URL/v1/audio/transcriptions" \
  -H "Authorization: Bearer $NINEROUTER_KEY" \
  -F "model=openai/whisper-1" \
  -F "[email protected]" \
  -F "language=vi"

JS (Node):

import { createReadStream } from "node:fs";
const form = new FormData();
form.append("model", "groq/whisper-large-v3-turbo");
form.append("file", new Blob([await (await import("node:fs/promises")).readFile("audio.mp3")]), "audio.mp3");
const r = await fetch(`${process.env.NINEROUTER_URL}/v1/audio/transcriptions`, {
  method: "POST",
  headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}` },
  body: form,
});
const { text } = await r.json();
console.log(text);

Response shape

Default (response_format=json):

{ "text": "Xin chào, đây là bản ghi âm." }

verbose_json adds language, duration, segments[] with timestamps. srt / vtt return subtitle text.

Provider quirks

Providermodel formatNotes
openaiwhisper-1, gpt-4o-transcribe, gpt-4o-mini-transcribeNative OpenAI shape
groqwhisper-large-v3, whisper-large-v3-turbo, distil-whisper-large-v3-enFastest; OpenAI shape
geminigemini-2.5-flash, gemini-2.5-pro, gemini-2.5-flash-liteServer converts to generateContent with audio inline
deepgramnova-3, nova-2, whisper-largeToken auth; server adapts response
assemblyaiuniversal-3-pro, universal-2Async upload+poll handled server-side
nvidianvidia/parakeet-ctc-1.1b-asrNIM endpoint
huggingfaceopenai/whisper-large-v3, openai/whisper-smallHF Inference API
elevenlabsscribe_v1, scribe_v2Whisper-compatible shape; xi-api-key auth, not Bearer. Extra params: timestamps_granularity (word/character/none), tag_audio_events, and speaker labelling via either diarize=true or num_speakers (1–32) — sending both makes the request invalid, so diarize wins and num_speakers is dropped. Blank language is omitted upstream for auto-detect. srt/vtt and verbose_json segments are served from Scribe's own additional_formats render, so segments[] is omitted when the upstream render is unavailable rather than synthesized. Does not accept temperature or prompt — those are not forwarded.

Comments

Markdown supported