<?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: ixilig</title>
    <description>The latest articles on DEV Community by ixilig (@ixilig).</description>
    <link>https://dev.to/ixilig</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%2F4234074%2F461b1ab1-5773-408b-abc4-2bc640e5488b.jpeg</url>
      <title>DEV Community: ixilig</title>
      <link>https://dev.to/ixilig</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ixilig"/>
    <language>en</language>
    <item>
      <title>Offline subtitle generator with local Whisper (no API fees)</title>
      <dc:creator>ixilig</dc:creator>
      <pubDate>Mon, 09 Nov 2026 13:20:37 +0000</pubDate>
      <link>https://dev.to/ixilig/offline-subtitle-generator-with-local-whisper-no-api-fees-1g6c</link>
      <guid>https://dev.to/ixilig/offline-subtitle-generator-with-local-whisper-no-api-fees-1g6c</guid>
      <description>&lt;p&gt;Per-minute subtitle APIs add up, and they mean uploading your video to someone else's server. I wanted a small tool that makes an .srt file entirely on my own machine, so I wrapped faster-whisper in a short Python script.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;faster-whisper transcribes the audio locally (the model is downloaded once, then it works offline).&lt;/li&gt;
&lt;li&gt;The script writes the segments out as a standard SRT file.&lt;/li&gt;
&lt;li&gt;Optionally, ffmpeg burns the subtitles into a copy of the video.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python autosub.py video.mp4 &lt;span class="nt"&gt;--lang&lt;/span&gt; en &lt;span class="nt"&gt;--model&lt;/span&gt; small
python autosub.py video.mp4 &lt;span class="nt"&gt;--burn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A real run
&lt;/h2&gt;

&lt;p&gt;I ran it on a short synthetic English speech clip (3 sentences) with the tiny model. Actual output of v1.1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
00:00:00,000 --&amp;gt; 00:00:04,560
Welcome everyone. Today I will show you
something absolutely incredible that

2
00:00:04,560 --&amp;gt; 00:00:05,520
nobody expected.

3
00:00:06,400 --&amp;gt; 00:00:10,692
This is the craziest moment of the entire
stream. I cannot believe this just

4
00:00:10,692 --&amp;gt; 00:00:11,200
happened.

5
00:00:12,080 --&amp;gt; 00:00:15,920
Thank you all for watching and see you
tomorrow.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A bug I almost shipped
&lt;/h2&gt;

&lt;p&gt;My first version passed its own test, but when I read the output line by line, words were missing: "nobody expected." and "happened." had vanished. The wrapping function kept only the first two lines of any long segment and silently dropped the rest. Version 1.1 splits long segments into several cues instead (max two lines each) and shares the time between them. The package now includes a small offline test that checks that every word survives. Lesson: "the test passed" is not the same as "I read the output".&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tested on English with the tiny and small models, SRT output and --burn. Other languages use the same engine, but I have not tested them all.&lt;/li&gt;
&lt;li&gt;Cue timing inside a split segment is proportional to text length, so it is an approximation.&lt;/li&gt;
&lt;li&gt;On CPU, expect roughly real-time speed or slower with the small model.&lt;/li&gt;
&lt;li&gt;I am a student developer and this was built together with Claude (an AI assistant); I ran and checked the code myself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;

&lt;p&gt;The packaged version (script, README, requirements, test) is on Gumroad for $9: &lt;a href="https://ixilig.gumroad.com/l/glopkp" rel="noopener noreferrer"&gt;https://ixilig.gumroad.com/l/glopkp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback and bug reports are welcome.&lt;/p&gt;

</description>
      <category>python</category>
      <category>whisper</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
