FrameFetch
For agents → Try it free
Audio briefings

Video to Audio API

Turn any YouTube, TikTok, Instagram Reels, Reddit, or Pinterest video URL into a spoken mp3 briefing — in one API call. Pick from six voices, and optionally get the briefing spoken in another language entirely. YouTube link in, spoken Spanish briefing out — no separate transcription, summarization, or text-to-speech step.

Read the docs Pricing

Why this matters now

Not every use case wants a transcript to read — sometimes you want something to listen to: a commute-friendly briefing of a competitor's video, an accessibility-friendly audio summary for a visually impaired user, or a spoken digest an agent can hand off to a voice assistant. FrameFetch turns a bare video URL into a spoken mp3 briefing without you running your own summarization pipeline, your own text-to-speech integration, or your own signed-storage layer for the result.

One call, mp3 briefing out

Add "audio_digest" to fields on /v1/extract (or /v1/transcript) and FrameFetch runs the transcript through an LLM for a short gist, then synthesizes that gist to speech. The response carries audio_digest: { url, seconds, voice, provider }url is a time-limited (24h) signed link straight to the mp3, and seconds is the estimated spoken duration (also the billing basis). audio_digest auto-includes digest (and digest auto-includes transcript), so one field is all you need to ask for.

curl -X POST https://framefetch.net/v1/extract \
  -H "Authorization: Bearer <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "fields": ["audio_digest"]
  }'
"digest": { "gist": "A first-person clip from the San Diego Zoo; the narrator points out the elephants and their very long trunks.", "topics": ["zoo", "elephants"] },
"audio_digest": {
  "url": "https://.../audio_digest_a1b2c3.mp3?X-Amz-...",
  "seconds": 24,
  "voice": "alloy",
  "provider": "openai"
}
Combine with translate — audio in any language

Add a top-level "translate": "<iso-639-1>" to the same call and FrameFetch generates the digest directly in that target language — in the same LLM pass, not a second one — so the mp3 speaks it too. A YouTube link goes in; a spoken Spanish briefing comes out:

curl -X POST https://framefetch.net/v1/extract \
  -H "Authorization: Bearer <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "fields": ["audio_digest"],
    "translate": "es",
    "voice": "nova"
  }'
"digest": { "gist": "Un vídeo en primera persona desde el zoológico de San Diego; el narrador señala a los elefantes y sus larguísimas trompas.", "topics": ["zoológico", "elefantes"] },
"audio_digest": {
  "url": "https://.../audio_digest_d4e5f6.mp3?X-Amz-...",
  "seconds": 24,
  "voice": "nova",
  "provider": "openai",
  "lang": "es"
}

Prefer the transcript translated as text instead of an audio briefing? Drop "audio_digest" and keep "transcript" in fields alongside translate — see the Video Subtitles API for translated .srt/.vtt output.

Pick a voice

A top-level "voice" param selects the spoken voice — inert unless audio_digest is requested, and defaults to "alloy" when omitted.

VoiceProviderLanguages
alloy (default) · echo · fable · onyx · nova · shimmerOpenAI gpt-4o-mini-ttsMultilingual — follows the text/translate target
Fritz-PlayAIGroq/PlayAI playai-ttsEnglish (+ Arabic) only — fallback when no OpenAI key is configured

FrameFetch prefers OpenAI whenever a key is configured (it's multilingual); Groq/PlayAI is the fallback. Requesting a translate target outside English/Arabic with only a Groq key configured degrades audio_digest to a warning rather than producing mismatched audio — see below.

Best-effort, never charged on failure

Text-to-speech is treated exactly like digest and translate: best-effort, never a hard failure of the whole call. If no TTS provider is configured (neither OPENAI_API_KEY nor GROQ_API_KEY) or the only configured provider can't speak the requested language, audio_digest is simply omitted, a plain-English string is appended to the top-level warnings array, and the call is not billed for the audio — the rest of the response (transcript, digest, metadata) stays intact. These degrade cases never surface as an HTTP error code, only as a warning string.

Use it from an AI agent (MCP)

FrameFetch ships an MCP server at POST https://framefetch.net/mcp. The framefetch_extract tool takes the same fields: ["audio_digest"], translate, and voice arguments — identical behavior to the HTTP API, so an agent can ask for a spoken briefing (in any supported language) the same way it asks for a transcript.

FAQ
What is the audio_digest field?

A spoken mp3 rendering of the video's LLM digest (a short gist of the transcript), returned as a time-limited signed URL. Add "audio_digest" to fields on /v1/extract or /v1/transcript.

Can I get the briefing in another language?

Yes. Add a top-level translate param with an ISO-639-1 language code and the digest is generated directly in that language, so the audio speaks it — one call, e.g. a YouTube link in and a Spanish spoken briefing out.

Which voices are available?

Six OpenAI gpt-4o-mini-tts voices — alloy (default), echo, fable, onyx, nova, shimmer — plus Groq/PlayAI's Fritz-PlayAI as an English/Arabic-only fallback when no OpenAI key is configured. Pick one with the top-level voice param.

How is it priced?

$0.000375 per estimated spoken second (about 3-4¢ for a typical 90-second briefing), on top of the digest and transcript it's derived from — and only charged when the mp3 is actually produced.

What happens if text-to-speech fails or isn't configured?

audio_digest degrades gracefully: the field is omitted, a warning is added to the response's warnings array, and the call is not charged for the audio. The rest of the extraction — transcript, digest, metadata — is unaffected.

Which platforms does it work on?

Any platform FrameFetch supports a transcript for: YouTube (incl. Shorts), TikTok, Instagram Reels, Reddit, and Pinterest.