ossicle
ossicle
Транскрибируйте локальные медиафайлы и URL-адреса с помощью Deepgram, как MCP-сервер для Claude и как автономный CLI. Расшифровки сохраняются на диск в формате Markdown; ничего объёмного никогда не возвращается инлайн.
Каждый заказ оценивается по измеренной длительности до отправки, и заказ, чья оценка превышает установленный предел стоимости, отклоняется сразу. Именно эта защита и есть суть пакета.
Требования
Node >= 20
ffprobeиffmpegвPATH(измерение длительности и загрузка в моно 16 кГц opus)yt-dlpвPATH, если нужен ввод по URLКлюч API Deepgram
Установка
npm install
npm run build
cp .env.example .env # then fill in DEEPGRAM_API_KEYКонфигурация
Конфигурация читается только из файла .env в корне пакета. Переменные окружения, переданные из шелла, и флаги claude mcp add --env намеренно игнорируются, так что сервер ведёт себя одинаково независимо от того, из какого проекта он запущен.
Переменная | Обязательная | По умолчанию | Назначение |
| да | Ключ API Deepgram | |
| нет |
| Модель транскрипции |
| нет |
| Цена за минуту аудио, используется для оценки |
| нет |
| Жёсткий предел стоимости заказа. Превышение — отказ, а не запрос |
| нет |
| Куда пишутся папки заказов. Относительные пути разрешаются от корня пакета |
| только для форматирования | Ключ для прохода форматирования. Транскрипции он не нужен | |
| нет |
| Модель, которую проход форматирования просит о структуре |
| нет |
| Ниже этого числа предложений форматирование добавляет абзацы и теги, но не заголовки |
MCP-сервер
claude mcp add ossicle -- node "<absolute path to this repo>/dist/index.js"transcribe
Вход | Тип | По умолчанию | Примечания |
| string | обязательно | Локальный путь к файлу или любой URL, который умеет скачивать yt-dlp |
| boolean |
| Экспериментально. Блоки с метками говорящих |
| string | модель из конфига | Переопределение модели Deepgram |
| string |
| Код языка речи |
| boolean |
| Повторная транскрипция даже при попадании в кэш. Снова стоит денег |
Возвращает путь к расшифровке, папку заказа, длительность, фактически потраченные и оценочные USD, флаг cached и превью длиной не более 500 символов. Полная расшифровка остаётся на диске.
Диаризация
Диаризация экспериментальна и по умолчанию выключена. На реальных записях Deepgram часто ошибается в приписывании реплик, так что вывод с метками говорящих читается хуже, чем простые абзацы. Поэтому флаг оставлен для тех случаев, где разделение по говорящим стоит этого риска, а не рекомендован как обычный режим. Он остаётся частью ключа кэша, так что его переключение никогда не вернёт устаревшую расшифровку.
format_transcript
Вход | Тип | По умолчанию | Примечания |
| string | обязательно |
|
| boolean |
| Повторный запрос структуры у модели. Снова стоит денег |
Второй, необязательный проход по уже готовой расшифровке на диске. См. Форматирование.
estimate_cost
Принимает тот же source и возвращает длительность, оценочные USD, предел и то, был бы заказ разрешён. Запрос к Deepgram не выполняется. URL всё равно скачивается, потому что иначе длительность неизвестна, так что эта операция бесплатна по части Deepgram, но не мгновенна.
CLI
transcribe ./interview.mp4 --diarize # experimental, labels are often wrong
transcribe ./lecture.mp3 --estimate
transcribe ./clip.mp4 --json | jq .transcript_pathФлаг | По умолчанию | Назначение |
| выкл | Экспериментально. Метки говорящих |
|
| Модель Deepgram |
|
| Язык речи |
|
| Каталог вывода |
| выкл | Повторная транскрипция даже при попадании в кэш |
| выкл | Вывести длительность и оценочные USD и выйти |
| выкл | Вывести один JSON-объект и ничего больше |
| Показать все флаги |
Коды выхода: 0 — успех, 2 — отказ из-за превышения предела стоимости, 3 — ошибка конфигурации или отсутствующего бинарника, 1 — всё остальное.
transcribe format ./output/interview-final-8a2c1d0b7e64
transcribe format ./interview.mp4 --forceПодкоманда format принимает папку заказа или локальный файл, который её создал, и принимает флаги --force и --json.
Форматирование
Сырая расшифровка точна, но почти нечитаема: либо один сплошной текст, либо абзацы, рубящиеся каждые четыре предложения правилом, которое не слышит говорящего. Проход форматирования исправляет это, не подпуская языковую модель к самим словам.
Расшифровка разбивается на предложения с номерами и отправляется дешёвой модели OpenRouter, которая возвращает только структуру: индексы, после которых идут разрывы абзацев, опциональные заголовки { startIndex, title } и от трёх до восьми тегов в kebab-case. Markdown затем пересобирается из сохранённого массива предложений. Потерять, переписать или выдумать предложение невозможно конструктивно, а не проверкой, потому что текст от модели вообще не возвращается.
Только по запросу.
transcribeникогда не форматирует за вас. Запускайтеformat_transcriptили подкомандуformat.Сбой только частичный. Предложения отправляются окнами. Окно, чей план невалиден или чей запрос стабильно не удаётся, повторяется, затем остаётся как простые абзацы и помечается в отчёте как пропущенный диапазон. Расшифровка никогда не становится хуже, чем сырой вывод.
Короткие расшифровки — без заголовков. Ниже
FORMAT_HEADINGS_MIN_SENTENCESмодель просят только об абзацах и тегах. Четырёхминутная голосовая заметка не нуждается в трёх выдуманных заголовках.Кэшируется как транскрипция. План записывается в
format.jsonв папке заказа. Повторный вызов перерисовывает из него и не тратит ничего;forceснова вызывает модель. Повторныйtranscribeпо уже отформатированному заказу применяет сохранённый план заново, а не затирает его.Тот же защитный предел стоимости. Форматирование оценивается до запроса и отклоняется сверх
MAX_COST_PER_JOB_USD. Каждый вызов — отдельный заказ для этой проверки: он никогда не суммируется с тем, что уже потрачено на Deepgram.
Структура вывода
<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Кэширование
Ключ кэша — это идентичность источника плюс опции, меняющие расшифровку: model, diarize и language. Локальные файлы опознаются по SHA-256 их байтов; URL — по идентификатору экстрактора yt-dlp, так что параметры отслеживания и сокращённые ссылки никогда не вызывают вторую платную транскрипцию.
Имя папки косметическое: для URL это название видео с последующим идентификатором видео, а для локального файла — имя файла. Заказ находится по хвостовому <key12> в одиночку, так что папка переиспользуется, что бы ни говорила её читаемая половина. Видео, переименованное его автором, или папка, названная старой версией этого инструмента, всё равно попадают в кэш, а не платят за ту же расшифровку дважды.
При попадании в кэш transcript.md перерисовывается из сохранённого response.json, а не возвращается старый Markdown, так что улучшения форматтера достигают старых заказов без затрат. Только --force / force: true вызывает Deepgram повторно.
Разработка
npm test # vitest
npm run typecheck
npm run buildНи один тест не запускает бинарник и не касается сети: ffprobe, ffmpeg и yt-dlp проходят через инъекцируемый исполнитель команд, а Deepgram — через инъекцируемый fetch.
This server cannot be installed
Maintenance
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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