<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muneeb Khan</title>
    <description>The latest articles on DEV Community by Muneeb Khan (@muneeb_k).</description>
    <link>https://dev.to/muneeb_k</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4135179%2F5d518e20-533d-4b7a-a388-206f0fc60f34.jpg</url>
      <title>DEV Community: Muneeb Khan</title>
      <link>https://dev.to/muneeb_k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muneeb_k"/>
    <language>en</language>
    <item>
      <title>Building Capite: a self-hosted AI video caption generator with faster-whisper and FFmpeg</title>
      <dc:creator>Muneeb Khan</dc:creator>
      <pubDate>Mon, 21 Sep 2026 07:21:57 +0000</pubDate>
      <link>https://dev.to/muneeb_k/building-capite-a-self-hosted-ai-video-caption-generator-with-faster-whisper-and-ffmpeg-1lj2</link>
      <guid>https://dev.to/muneeb_k/building-capite-a-self-hosted-ai-video-caption-generator-with-faster-whisper-and-ffmpeg-1lj2</guid>
      <description>&lt;p&gt;Short-form video — TikTok, Reels, Shorts — runs on word-animated captions now. Getting them usually means Submagic, CapCut Pro, or OpusClip: a monthly subscription, a cap on minutes, and your footage sitting on someone else's server before you've even published it.&lt;/p&gt;

&lt;p&gt;I built Capite to avoid that trade entirely: free, open source, self-hosted.&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Capite transcribes video audio locally, aligns word boundaries to the millisecond, applies one of 27 motion typography presets (Hormozi, MrBeast, Submagic bounce, karaoke, and others), and burns it into the video at broadcast quality. Docker or plain Python, no API keys, no watermark, no minute cap.&lt;/p&gt;

&lt;p&gt;Architecture&lt;/p&gt;

&lt;p&gt;Transcription and rendering are decoupled on purpose, so editing a transcript doesn't mean re-running the AI model:&lt;/p&gt;

&lt;p&gt;Video upload&lt;br&gt;
   → faster-whisper (CTranslate2): word timestamps + language detection&lt;br&gt;
   → Next.js 16 studio: word-chip transcript editor, typo fixes, timing nudges&lt;br&gt;
   → pysubs2: compiles {\k} karaoke, scale, and highlight tags into an .ass script&lt;br&gt;
   → FFmpeg + libass: burns the video at CRF 18, or exports the raw subtitle file&lt;br&gt;
Why faster-whisper instead of stock Whisper&lt;/p&gt;

&lt;p&gt;Vanilla OpenAI Whisper in PyTorch is heavier than most local setups want to carry. faster-whisper, built on CTranslate2, gets a real CPU speedup with INT8 quantization and still returns the millisecond-level word boundaries the animation engine depends on, no GPU required.&lt;/p&gt;

&lt;p&gt;Why .ass scripts instead of canvas rendering&lt;/p&gt;

&lt;p&gt;A lot of open-source caption tools render by capturing frames from a headless browser canvas or compositing with OpenCV — both are slow and memory-heavy at scale. Capite writes standard .ass (Advanced SubStation Alpha) subtitle scripts and lets FFmpeg's native libass filter composite the typography during encoding, in one pass.&lt;/p&gt;

&lt;p&gt;Features&lt;br&gt;
27 motion presets, grouped by category (Trending, Clean &amp;amp; Tech, Editorial &amp;amp; Film, Pop &amp;amp; Expressive).&lt;br&gt;
A transcript editor where clicking a word scrubs the video to that exact millisecond, with 0.1s timing nudges.&lt;br&gt;
Re-encoding after an edit takes under 5 seconds — it skips the transcription step entirely.&lt;br&gt;
Export to MP4, .srt, .vtt, .txt, or .ass for Premiere, Resolve, or Final Cut.&lt;br&gt;
100+ languages, with font fallback for CJK, Arabic, Devanagari, Hebrew, Cyrillic.&lt;br&gt;
Running it&lt;br&gt;
git clone &lt;a href="https://github.com/muneebkhan08/Capite.git" rel="noopener noreferrer"&gt;https://github.com/muneebkhan08/Capite.git&lt;/a&gt;&lt;br&gt;
cd Capite&lt;br&gt;
docker compose up&lt;/p&gt;

&lt;p&gt;Open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/muneebkhan08/Capite" rel="noopener noreferrer"&gt;https://github.com/muneebkhan08/Capite&lt;/a&gt;&lt;br&gt;
Release: &lt;a href="https://github.com/muneebkhan08/Capite/releases/tag/v1.0.0" rel="noopener noreferrer"&gt;https://github.com/muneebkhan08/Capite/releases/tag/v1.0.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. Issues and pull requests are welcome, especially on the CJK/Arabic subtitle wrapping, that's the part I trust least right now.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
