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.
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.
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" }
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.
A top-level "voice" param selects the spoken voice — inert unless audio_digest is requested, and defaults to "alloy" when omitted.
| Voice | Provider | Languages |
|---|---|---|
alloy (default) · echo · fable · onyx · nova · shimmer | OpenAI gpt-4o-mini-tts | Multilingual — follows the text/translate target |
Fritz-PlayAI | Groq/PlayAI playai-tts | English (+ 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.
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.
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.
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.
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.
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.
$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.
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.