Skip to main content
Glama

ossicle

Transcribe archivos multimedia locales y URL con Deepgram, como servidor MCP para Claude Code y como CLI independiente. Las transcripciones se escriben en disco como Markdown; nada grande se devuelve nunca en línea.

Cada trabajo se tasa a partir de su duración medida antes de enviar nada, y un trabajo cuya estimación supera el tope configurado por trabajo se rechaza de plano. Esa salvaguarda es la razón de ser del paquete.

Requisitos

  • Node >= 20

  • ffprobe y ffmpeg en PATH (medición de duración y subida de opus mono a 16 kHz)

  • yt-dlp en PATH, si quieres entrada de URL

  • Una clave de API de Deepgram

Instalación

npm install
npm run build
cp .env.example .env    # then fill in DEEPGRAM_API_KEY

Configuración

La configuración se lee solo del archivo .env en la raíz del paquete. Las variables exportadas en la shell y las opciones claude mcp add --env se ignoran a propósito, de modo que el servidor se comporta igual sin importar qué proyecto lo haya lanzado.

Variable

Obligatoria

Predeterminado

Significado

DEEPGRAM_API_KEY

Clave de API de Deepgram

DEEPGRAM_MODEL

no

nova-3

Modelo de transcripción

DEEPGRAM_USD_PER_MINUTE

no

0.0043

Precio por minuto de audio, usado para la estimación

MAX_COST_PER_JOB_USD

no

1.00

Tope máximo por trabajo. Superarlo es un rechazo, nunca una pregunta

TRANSCRIPTION_OUTPUT_DIR

no

./output

Dónde se escriben las carpetas de trabajo. Las rutas relativas se resuelven contra la raíz del paquete

OPENROUTER_API_KEY

solo para formatear

Clave para el pase de formateo. La transcripción nunca la necesita

OPENROUTER_MODEL

no

openai/gpt-4o-mini

Modelo al que el pase de formateo pide la estructura

FORMAT_HEADINGS_MIN_SENTENCES

no

120

Por debajo de este número de frases, el formateo añade párrafos y etiquetas, pero no secciones

Servidor MCP

claude mcp add ossicle -- node "<absolute path to this repo>/dist/index.js"

transcribe

Entrada

Tipo

Predeterminado

Notas

source

string

obligatorio

Ruta de archivo local o cualquier URL que yt-dlp pueda descargar

diarize

boolean

false

Experimental. Bloques ## Speaker N [mm:ss] etiquetados por hablante

model

string

el modelo configurado

Anulación del modelo de Deepgram

language

string

en

Código de idioma hablado

force

boolean

false

Volver a transcribir incluso con un acierto de caché. Cuesta dinero otra vez

Devuelve la ruta de la transcripción, la carpeta del trabajo, la duración, el USD estimado y el realmente gastado, una marca cached y una vista previa limitada a 500 caracteres. La transcripción completa queda en disco.

Diarización

La diarización es experimental y está desactivada por defecto. En grabaciones reales, Deepgram atribuye mal los turnos con la suficiente frecuencia como para que la salida etiquetada por hablante se lea peor que los párrafos normales, así que la opción se mantiene para los casos en los que la separación de hablantes vale ese riesgo, en lugar de recomendarse como una opción normal. Sigue formando parte de la clave de caché, de modo que cambiarla nunca devuelve una transcripción obsoleta.

format_transcript

Entrada

Tipo

Predeterminado

Notas

target

string

obligatorio

El job_dir de un resultado de transcribe, o la ruta del archivo local original

force

boolean

false

Volver a pedirle la estructura al modelo. Cuesta dinero otra vez

Un segundo pase opcional sobre una transcripción ya en disco. Ver Formato.

estimate_cost

Acepta la misma source y devuelve la duración, el USD estimado, el tope y si el trabajo estaría permitido. No se hace ninguna petición a Deepgram. Una URL sí se descarga, porque de otro modo la duración es incognoscible, así que esto no tiene cargos de Deepgram, pero no es instantáneo.

CLI

transcribe ./interview.mp4 --diarize   # experimental, labels are often wrong
transcribe ./lecture.mp3 --estimate
transcribe ./clip.mp4 --json | jq .transcript_path

Opción

Predeterminado

Significado

--diarize

desactivado

Experimental. Etiqueta hablantes

--model <name>

DEEPGRAM_MODEL, si no nova-3

Modelo de Deepgram

--language <code>

en

Idioma hablado

--out <dir>

TRANSCRIPTION_OUTPUT_DIR, si no ./output

Directorio de salida

--force

desactivado

Volver a transcribir incluso con un acierto de caché

--estimate

desactivado

Imprime la duración y el USD estimado y sale

--json

desactivado

Imprime un único objeto JSON y nada más en stdout

--help

Lista todas las opciones

Códigos de salida: 0 éxito, 2 rechazado por superar el tope de coste, 3 error de configuración o binario ausente, 1 cualquier otra cosa.

transcribe format ./output/interview-final-8a2c1d0b7e64
transcribe format ./interview.mp4 --force

El subcomando format acepta una carpeta de trabajo o el archivo local que la produjo, y admite --force y --json.

Formato

Una transcripción en bruto es precisa y casi ilegible: un muro de texto, o párrafos cortados cada cuatro frases por una regla que no oye al hablante. El pase de formateo lo soluciona sin dejar que un modelo de lenguaje se acerque a las palabras.

La transcripción se divide en frases numeradas y se envía a un modelo barato de OpenRouter, que responde solo con estructura: los índices tras los que va un salto de párrafo, encabezados de sección opcionales { startIndex, title } y de tres a ocho etiquetas de tema en kebab-case. El Markdown se reconstruye a partir de la matriz de frases almacenada. Una frase omitida, reformulada o inventada es imposible por construcción, no por revisión, porque el modelo nunca devuelve texto.

  • Adopción voluntaria. transcribe nunca formatea por ti. Ejecuta format_transcript o transcribe format.

  • Solo fallos parciales. Las frases se envían en ventanas. Una ventana cuyo plan no es válido o cuya petición sigue fallando se reintenta y, si no, se deja como párrafos normales y se notifica como un rango omitido. La transcripción nunca queda peor que la representación sin formatear.

  • Las transcripciones cortas no tienen secciones. Por debajo de FORMAT_HEADINGS_MIN_SENTENCES solo se le piden al modelo párrafos y etiquetas. Una nota de voz de cuatro minutos no necesita tres secciones inventadas.

  • Cacheada como la transcripción. El plan se escribe en format.json dentro de la carpeta del trabajo. Una segunda llamada vuelve a renderizar a partir de él y no gasta nada; force vuelve a llamar al modelo. Volver a ejecutar transcribe sobre un trabajo formateado reaplica el plan almacenado en lugar de sobrescribirlo.

  • La misma salvaguarda de coste. El formateo se tasa antes de cualquier petición y se rechaza por encima de MAX_COST_PER_JOB_USD. Cada invocación es su propio trabajo a esos efectos: nunca se suma a lo que Deepgram ya haya costado.

Estructura de salida

<TRANSCRIPTION_OUTPUT_DIR>/<slug>-<key12>/

  URL sources:   never-gonna-give-you-up-dQw4w9WgXcQ-1f3b9c2d4e5a/
  Local files:   interview-final-8a2c1d0b7e64/
  audio.opus       the 16 kHz mono upload
  audio.<ext>      the yt-dlp download, for URL sources, kept so re-runs never re-fetch
  response.json    Deepgram's raw response
  format.json      the structure plan, once the transcript has been formatted
  transcript.md    YAML front matter plus the rendered transcript

Caché

La clave de caché es la identidad de la fuente más las opciones que cambian la transcripción: model, diarize y language. Los archivos locales se identifican por un SHA-256 de sus bytes; las URL, por el id del extractor de yt-dlp, de modo que los parámetros de seguimiento y las variantes de enlace corto nunca provocan una segunda transcripción de pago.

El nombre de la carpeta es cosmético: para una URL es el título del vídeo seguido del id del vídeo, y para un archivo local, el nombre del archivo. Un trabajo se encuentra solo por el <key12> final, así que una carpeta se reutiliza diga lo que diga su mitad legible. Un vídeo cuyo subidor haya cambiado el nombre, o una carpeta nombrada por una versión anterior de esta herramienta, sigue dando con la caché en lugar de pagar dos veces por la misma transcripción.

Un acierto vuelve a renderizar transcript.md a partir del response.json almacenado en lugar de devolver el Markdown anterior, de modo que las mejoras del formateador llegan a los trabajos antiguos sin coste. Solo --force / force: true vuelve a llamar a Deepgram.

Desarrollo

npm test          # vitest
npm run typecheck
npm run build

Ninguna prueba lanza un binario ni toca la red: ffprobe, ffmpeg y yt-dlp pasan por un ejecutor de comandos inyectable, y Deepgram pasa por un fetch inyectable.

-
license - not tested
-
quality - not tested
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 Connectors

  • MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.

  • MCP server for the FFmpeg Micro video transcoding API — create, monitor, download transcodes.

  • 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/PSNapier/ossicle'

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