{"id":38739,"date":"2026-02-06T15:41:03","date_gmt":"2026-02-06T12:41:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38739"},"modified":"2026-02-06T15:41:03","modified_gmt":"2026-02-06T12:41:03","slug":"python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/","title":{"rendered":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f: Neden Otomatik Altyaz\u0131?<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital \u00e7a\u011f\u0131nda video i\u00e7eri\u011fi, bilgi aktar\u0131m\u0131n\u0131n, e\u011flencenin ve ileti\u015fimin temel ta\u015flar\u0131ndan biri haline gelmi\u015ftir. YouTube, TikTok, e\u011fitim platformlar\u0131 ve kurumsal sunumlar gibi \u00e7e\u015fitli alanlarda videolar\u0131n \u00f6nemi her ge\u00e7en g\u00fcn artmaktad\u0131r. Bu videolar\u0131n eri\u015filebilirli\u011fini, etkile\u015fimini ve k\u00fcresel eri\u015fimini art\u0131rman\u0131n en etkili yollar\u0131ndan biri ise altyaz\u0131 eklemektir.<\/p>\n<p>Altyaz\u0131lar sadece i\u015fitme engelli bireyler i\u00e7in bir zorunluluk olmakla kalmaz, ayn\u0131 zamanda g\u00fcr\u00fclt\u00fcl\u00fc ortamlarda video izleyenler, farkl\u0131 dilleri konu\u015fan izleyiciler ve hatta i\u00e7eri\u011fi daha iyi anlamak isteyen herkes i\u00e7in b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Ayr\u0131ca, arama motoru optimizasyonu (SEO) a\u00e7\u0131s\u0131ndan da altyaz\u0131lar, video i\u00e7eri\u011finin metin olarak taranabilmesini sa\u011flayarak ke\u015ffedilebilirli\u011fini art\u0131r\u0131r.<\/p>\n<p>Geleneksel olarak altyaz\u0131 olu\u015fturma s\u00fcreci olduk\u00e7a zahmetli ve zaman al\u0131c\u0131yd\u0131. Videoyu manuel olarak dinleyip, her kelimeyi yaz\u0131p, zaman damgalar\u0131n\u0131 ayarlamak b\u00fcy\u00fck bir emek gerektiriyordu. Ancak yapay zeka ve g\u00fc\u00e7l\u00fc medya i\u015fleme ara\u00e7lar\u0131n\u0131n geli\u015fimiyle birlikte bu s\u00fcre\u00e7 art\u0131k otomatikle\u015ftirilebilir ve \u00e7ok daha verimli hale getirilebilir.<\/p>\n<p>Bu teknik makalede, Python programlama dilinin esnekli\u011fini, OpenAI&#8217;\u0131n son teknoloji \u00fcr\u00fcn\u00fc konu\u015fmadan metne (Speech-to-Text) d\u00f6n\u00fc\u015ft\u00fcrme modeli Whisper&#8217;\u0131n g\u00fcc\u00fcn\u00fc ve medya i\u015fleme konusunda end\u00fcstri standard\u0131 olan FFmpeg&#8217;in yeteneklerini birle\u015ftirerek videolara nas\u0131l otomatik altyaz\u0131 olu\u015fturulaca\u011f\u0131n\u0131 ve eklenece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, bu \u00fc\u00e7 g\u00fc\u00e7l\u00fc arac\u0131 kullanarak karma\u015f\u0131k g\u00f6r\u00fcnen bu s\u00fcreci anla\u015f\u0131l\u0131r ve uygulanabilir bir rehbere d\u00f6n\u00fc\u015ft\u00fcrmektir.<\/p>\n<h3>B\u00f6l\u00fcm 1: Kullanaca\u011f\u0131m\u0131z Ara\u00e7lar\u0131 Tan\u0131yal\u0131m<\/h3>\n<p>Bu projenin temelini olu\u015fturan \u00fc\u00e7 ana bile\u015feni derinlemesine anlayarak i\u015fe ba\u015flayal\u0131m. Her bir arac\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden tercih edildi\u011fini ve projemizdeki rol\u00fcn\u00fc kavrayal\u0131m.<\/p>\n<h4>Python: Esnek ve G\u00fc\u00e7l\u00fc Bir Programlama Dili<\/h4>\n<p>Python, basit s\u00f6zdizimi, geni\u015f k\u00fct\u00fcphane ekosistemi ve farkl\u0131 platformlarda \u00e7al\u0131\u015fabilme yetene\u011fi sayesinde veri bilimi, yapay zeka, web geli\u015ftirme ve otomasyon gibi bir\u00e7ok alanda pop\u00fclerli\u011fini koruyan \u00e7ok y\u00f6nl\u00fc bir programlama dilidir. Projemizde Python&#8217;\u0131 tercih etmemizin ba\u015fl\u0131ca nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Kolay \u00d6\u011frenilebilirlik ve Okunabilirlik:<\/b> Python&#8217;\u0131n temiz ve sezgisel s\u00f6zdizimi, karma\u015f\u0131k g\u00f6revleri bile anla\u015f\u0131l\u0131r kodlarla ifade etmeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><b>Geni\u015f K\u00fct\u00fcphane Deste\u011fi:<\/b> Whisper API&#8217;sini kullanmak, dosya i\u015flemleri yapmak ve FFmpeg komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in zengin k\u00fct\u00fcphane se\u00e7enekleri sunar (\u00f6rne\u011fin, <code>openai<\/code>, <code>ffmpeg-python<\/code>, <code>subprocess<\/code>).<\/li>\n<li><b>Otomasyon Yetene\u011fi:<\/b> Video i\u015fleme ve altyaz\u0131 olu\u015fturma ad\u0131mlar\u0131n\u0131 bir araya getiren bir otomasyon beti\u011fi yazmak i\u00e7in ideal bir dildir.<\/li>\n<li><b>Platform Ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131:<\/b> Yazd\u0131\u011f\u0131m\u0131z kodun Windows, macOS veya Linux gibi farkl\u0131 i\u015fletim sistemlerinde sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Projemizde Python, t\u00fcm i\u015f ak\u0131\u015f\u0131n\u0131 y\u00f6netecek, Whisper modelini \u00e7a\u011f\u0131racak, FFmpeg komutlar\u0131n\u0131 tetikleyecek ve dosya i\u015flemlerini koordine edecek orkestrat\u00f6r g\u00f6revi g\u00f6recektir.<\/p>\n<h4>OpenAI Whisper: Devrim Niteli\u011finde Konu\u015fmadan Metne D\u00f6n\u00fc\u015ft\u00fcrme Modeli<\/h4>\n<p>OpenAI taraf\u0131ndan geli\u015ftirilen Whisper, insan konu\u015fmas\u0131n\u0131 metne d\u00f6n\u00fc\u015ft\u00fcrme (Automatic Speech Recognition &#8211; ASR) konusunda \u00e7\u0131\u011f\u0131r a\u00e7an bir yapay zeka modelidir. Geni\u015f ve \u00e7e\u015fitli bir veri k\u00fcmesi \u00fczerinde e\u011fitilmi\u015f olmas\u0131 sayesinde, bir\u00e7ok dilde y\u00fcksek do\u011frulukta transkripsiyon yapabilme yetene\u011fine sahiptir.<\/p>\n<h5>Whisper&#8217;\u0131n Temel \u00d6zellikleri:<\/h5>\n<ul>\n<li><b>Y\u00fcksek Do\u011fruluk:<\/b> Farkl\u0131 aksanlar, arka plan g\u00fcr\u00fclt\u00fcs\u00fc ve teknik terimler kar\u015f\u0131s\u0131nda bile etkileyici bir do\u011fruluk sergiler.<\/li>\n<li><b>\u00c7ok Dillilik:<\/b> Sadece \u0130ngilizce de\u011fil, onlarca farkl\u0131 dilde (T\u00fcrk\u00e7e dahil) transkripsiyon yapabilir ve hatta diller aras\u0131 \u00e7eviri yetene\u011fine sahiptir.<\/li>\n<li><b>Zaman Damgalar\u0131:<\/b> Konu\u015fman\u0131n metne d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesinin yan\u0131 s\u0131ra, her kelimenin veya c\u00fcmlenin videodaki ba\u015flang\u0131\u00e7 ve biti\u015f zamanlar\u0131n\u0131 da sa\u011flayarak altyaz\u0131 dosyalar\u0131 i\u00e7in kritik olan zaman damgalar\u0131n\u0131 otomatik olarak olu\u015fturur.<\/li>\n<li><b>Farkl\u0131 Model Boyutlar\u0131:<\/b> <code>tiny<\/code>, <code>base<\/code>, <code>small<\/code>, <code>medium<\/code>, <code>large<\/code> gibi farkl\u0131 boyutlarda modeller sunar. Bu modeller, do\u011fruluk ve h\u0131z aras\u0131nda bir denge sunar. Daha k\u00fc\u00e7\u00fck modeller daha h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131rken, daha b\u00fcy\u00fck modeller daha do\u011fru sonu\u00e7lar verir ve genellikle GPU gerektirir.<\/li>\n<\/ul>\n<p>Projemizde Whisper, videodan ayr\u0131\u015ft\u0131r\u0131lan ses dosyas\u0131n\u0131 alacak ve bu sesi otomatik olarak metne (ve SRT format\u0131na uygun zaman damgalar\u0131na) d\u00f6n\u00fc\u015ft\u00fcrecektir.<\/p>\n<h4>FFmpeg: Medya \u0130\u015fleme \u0130\u00e7in \u0130svi\u00e7re \u00c7ak\u0131s\u0131<\/h4>\n<p>FFmpeg, ses ve video dosyalar\u0131n\u0131 i\u015flemek i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131, komut sat\u0131r\u0131 tabanl\u0131 g\u00fc\u00e7l\u00fc bir \u00e7er\u00e7evedir. Medya d\u00f6n\u00fc\u015ft\u00fcrme, ak\u0131\u015f, filtreleme ve kodlama gibi say\u0131s\u0131z i\u015flemi ger\u00e7ekle\u015ftirebilir. Medya d\u00fcnyas\u0131nda bir &#8220;\u0130svi\u00e7re \u00e7ak\u0131s\u0131&#8221; olarak kabul edilir.<\/p>\n<h5>FFmpeg&#8217;in Projemizdeki Rol\u00fc:<\/h5>\n<ul>\n<li><b>Ses Ayr\u0131\u015ft\u0131rma:<\/b> Videodan sadece ses par\u00e7as\u0131n\u0131 (genellikle MP3 veya WAV format\u0131nda) ay\u0131klamak i\u00e7in kullan\u0131lacakt\u0131r. Whisper&#8217;\u0131n do\u011frudan video dosyalar\u0131yla \u00e7al\u0131\u015fmak yerine ses dosyalar\u0131n\u0131 tercih etmesi nedeniyle bu ad\u0131m kritik \u00f6neme sahiptir.<\/li>\n<li><b>Altyaz\u0131 Entegrasyonu (Hardcode):<\/b> Olu\u015fturulan altyaz\u0131 dosyas\u0131n\u0131 (SRT) videoya kal\u0131c\u0131 olarak &#8220;yakmak&#8221; (hardcode etmek) i\u00e7in kullan\u0131lacakt\u0131r. Bu sayede altyaz\u0131lar videonun bir par\u00e7as\u0131 haline gelir ve herhangi bir oynat\u0131c\u0131da otomatik olarak g\u00f6r\u00fcn\u00fcr.<\/li>\n<li><b>Video Format D\u00f6n\u00fc\u015ft\u00fcrme (Opsiyonel):<\/b> Gerekirse, farkl\u0131 video formatlar\u0131 aras\u0131nda d\u00f6n\u00fc\u015ft\u00fcrme yapmak veya video \u00e7\u00f6z\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc ayarlamak i\u00e7in de kullan\u0131labilir.<\/li>\n<\/ul>\n<p>FFmpeg&#8217;in komut sat\u0131r\u0131 aray\u00fcz\u00fc sayesinde, Python beti\u011fimizden kolayca \u00e7a\u011fr\u0131larak medya i\u015fleme g\u00f6revlerini otomatikle\u015ftirebiliriz.<\/p>\n<h3>B\u00f6l\u00fcm 2: Ortam Kurulumu<\/h3>\n<p>Projemize ba\u015flamadan \u00f6nce gerekli t\u00fcm yaz\u0131l\u0131mlar\u0131 ve k\u00fct\u00fcphaneleri sistemimize kurmam\u0131z gerekmektedir. Bu b\u00f6l\u00fcm, ad\u0131m ad\u0131m kurulum s\u00fcrecini anlatmaktad\u0131r.<\/p>\n<h4>2.1 Python ve Pip Kurulumu<\/h4>\n<p>Python&#8217;\u0131n sisteminizde kurulu oldu\u011fundan emin olun. Genellikle modern i\u015fletim sistemlerinde Python \u00f6n y\u00fckl\u00fc olarak gelir. Ancak g\u00fcncel bir s\u00fcr\u00fcme sahip olmak \u00f6nemlidir (Python 3.8 veya \u00fczeri \u00f6nerilir).<br \/>\nKomut istemcinizi (CMD, PowerShell, Terminal) a\u00e7arak Python s\u00fcr\u00fcm\u00fcn\u00fcz\u00fc kontrol edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">python --version\npip --version<\/code><\/pre>\n<p>E\u011fer Python kurulu de\u011filse, resmi python.org adresinden i\u015fletim sisteminize uygun kurulum dosyas\u0131n\u0131 indirip kurun. Kurulum s\u0131ras\u0131nda &#8220;Add Python to PATH&#8221; se\u00e7ene\u011fini i\u015faretlemeyi unutmay\u0131n. Pip (Python&#8217;\u0131n paket y\u00f6neticisi) genellikle Python ile birlikte gelir.<\/p>\n<h4>2.2 Sanal Ortam Olu\u015fturma (\u00d6nerilen)<\/h4>\n<p>Python projelerinde ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlemek i\u00e7in sanal ortamlar kullanmak en iyi uygulamad\u0131r. Bu, projenize \u00f6zel bir izole Python ortam\u0131 olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\"># Proje klas\u00f6r\u00fcn\u00fcze gidin\ncd \/yol\/to\/proje_klasoru\n\n<h2>Sanal ortam olu\u015fturun (venv ad\u0131 iste\u011fe ba\u011fl\u0131d\u0131r)<\/h2>\npython -m venv venv\n\n<h2>Sanal ortam\u0131 etkinle\u015ftirin<\/h2>\n<h2>Windows i\u00e7in:<\/h2>\n.\\venv\\Scripts\\activate\n<h2>macOS\/Linux i\u00e7in:<\/h2>\nsource venv\/bin\/activate<\/code><\/pre>\n<p>Sanal ortam etkinle\u015ftirildi\u011finde, komut istemcinizin ba\u015f\u0131nda <code>(venv)<\/code> gibi bir ibare g\u00f6receksiniz. Art\u0131k kuraca\u011f\u0131n\u0131z t\u00fcm Python paketleri bu sanal ortam i\u00e7inde izole edilecektir.<\/p>\n<h4>2.3 FFmpeg Kurulumu<\/h4>\n<p>FFmpeg, komut sat\u0131r\u0131 tabanl\u0131 bir ara\u00e7 oldu\u011fundan, sisteminizin PATH de\u011fi\u015fkenine eklenmesi gerekir.<\/p>\n<h5>Windows i\u00e7in:<\/h5>\n<ol>\n<li>FFmpeg&#8217;in resmi sitesinden (ffmpeg.org\/download.html) en son s\u00fcr\u00fcm\u00fc indirin. Genellikle &#8220;Builds&#8221; b\u00f6l\u00fcm\u00fcnden <code>gyan.dev<\/code> veya <code>BtbN<\/code> gibi kaynaklardan <code>ffmpeg-master-latest-win64-gpl.zip<\/code> gibi bir dosya indirilir.<\/li>\n<li>\u0130ndirilen ZIP dosyas\u0131n\u0131 a\u00e7\u0131n ve i\u00e7indeki <code>bin<\/code> klas\u00f6r\u00fcn\u00fc (\u00f6rne\u011fin, <code>C:\\ffmpeg\\bin<\/code>) kolayca eri\u015filebilecek bir yere ta\u015f\u0131y\u0131n.<\/li>\n<li>Bu <code>bin<\/code> klas\u00f6r\u00fcn\u00fcn yolunu sisteminizin PATH de\u011fi\u015fkenine ekleyin:\n<ul>\n<li>&#8220;Ba\u015flat&#8221; men\u00fcs\u00fcn\u00fc a\u00e7\u0131n ve &#8220;ortam de\u011fi\u015fkenleri&#8221; yaz\u0131n.<\/li>\n<li>&#8220;Sistem ortam de\u011fi\u015fkenlerini d\u00fczenleyin&#8221; se\u00e7ene\u011fini se\u00e7in.<\/li>\n<li>&#8220;Ortam De\u011fi\u015fkenleri&#8230;&#8221; butonuna t\u0131klay\u0131n.<\/li>\n<li>&#8220;Sistem de\u011fi\u015fkenleri&#8221; alt\u0131nda <code>Path<\/code> de\u011fi\u015fkenini bulun ve &#8220;D\u00fczenle&#8221;ye t\u0131klay\u0131n.<\/li>\n<li>&#8220;Yeni&#8221;ye t\u0131klay\u0131n ve FFmpeg <code>bin<\/code> klas\u00f6r\u00fcn\u00fcn tam yolunu yap\u0131\u015ft\u0131r\u0131n (\u00f6rne\u011fin, <code>C:\\ffmpeg\\bin<\/code>).<\/li>\n<li>T\u00fcm pencereleri &#8220;Tamam&#8221; diyerek kapat\u0131n.<\/li>\n<\/ul>\n<\/li>\n<li>Yeni bir komut istemcisi a\u00e7arak FFmpeg&#8217;in do\u011fru kurulup kurulmad\u0131\u011f\u0131n\u0131 kontrol edin:\n<pre><code class=\"language-bash\">ffmpeg -version<\/code><\/pre>\n<\/li>\n<\/ol>\n<h5>macOS i\u00e7in:<\/h5>\n<p>Homebrew kullan\u0131yorsan\u0131z kurulum \u00e7ok daha basittir:<\/p>\n<pre><code class=\"language-bash\">brew install ffmpeg<\/code><\/pre>\n<p>Homebrew kurulu de\u011filse, [brew.sh](https:\/\/brew.sh\/) adresinden kurulum talimatlar\u0131n\u0131 takip edebilirsiniz.<\/p>\n<h5>Linux i\u00e7in (Ubuntu\/Debian tabanl\u0131):<\/h5>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install ffmpeg<\/code><\/pre>\n<p>Di\u011fer Linux da\u011f\u0131t\u0131mlar\u0131 i\u00e7in kendi paket y\u00f6neticinizi kullan\u0131n (\u00f6rne\u011fin, Fedora i\u00e7in <code>sudo dnf install ffmpeg<\/code>).<\/p>\n<h4>2.4 Gerekli Python K\u00fct\u00fcphanelerini Kurma<\/h4>\n<p>Sanal ortam\u0131n\u0131z etkinle\u015ftirilmi\u015fken, Whisper modelini ve FFmpeg komutlar\u0131n\u0131 Python&#8217;dan y\u00f6netmek i\u00e7in gerekli k\u00fct\u00fcphaneleri kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">pip install openai-whisper # veya sadece pip install whisper\npip install ffmpeg-python\npip install tqdm # \u0130lerleme \u00e7ubu\u011fu i\u00e7in, opsiyonel ama kullan\u0131\u015fl\u0131\npip install torch torchvision torchaudio --index-url https:\/\/download.pytorch.org\/whl\/cu118 # GPU deste\u011fi i\u00e7in (CUDA 11.8 \u00f6rne\u011fi), CPU i\u00e7in sadece pip install torch<\/code><\/pre>\n<p>*   <code>openai-whisper<\/code>: OpenAI Whisper modelini kullanmak i\u00e7in ana k\u00fct\u00fcphane.<br \/>\n*   <code>ffmpeg-python<\/code>: Python&#8217;dan FFmpeg komutlar\u0131n\u0131 daha Pythonik bir \u015fekilde \u00e7al\u0131\u015ft\u0131rmay\u0131 sa\u011flayan bir sarmalay\u0131c\u0131 (wrapper). <code>subprocess<\/code> mod\u00fcl\u00fcyle de \u00e7al\u0131\u015f\u0131labilir ancak <code>ffmpeg-python<\/code> daha kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   <code>tqdm<\/code>: D\u00f6ng\u00fclerde veya uzun s\u00fcren i\u015flemlerde ilerleme \u00e7ubu\u011fu g\u00f6stermek i\u00e7in kullan\u0131l\u0131r, kullan\u0131c\u0131 deneyimini art\u0131r\u0131r.<br \/>\n*   <code>torch<\/code>: Whisper&#8217;\u0131n alt\u0131nda yatan derin \u00f6\u011frenme \u00e7er\u00e7evesi. GPU deste\u011fi i\u00e7in PyTorch&#8217;un CUDA \u00f6zellikli s\u00fcr\u00fcm\u00fcn\u00fc kurman\u0131z \u00f6nemlidir. E\u011fer GPU&#8217;nuz yoksa veya kullanmak istemiyorsan\u0131z, sadece <code>pip install torch<\/code> yeterli olacakt\u0131r (bu durumda CPU \u00fczerinde \u00e7al\u0131\u015f\u0131r ve daha yava\u015f olabilir). Yukar\u0131daki komut CUDA 11.8 i\u00e7indir, kendi CUDA s\u00fcr\u00fcm\u00fcn\u00fcze g\u00f6re PyTorch&#8217;un resmi sitesinden (<code>pytorch.org\/get-started\/locally\/<\/code>) do\u011fru kurulum komutunu bulmal\u0131s\u0131n\u0131z.<\/p>\n<h3>B\u00f6l\u00fcm 3: Altyaz\u0131 Olu\u015fturma ve Videoya Ekleme S\u00fcreci<\/h3>\n<p>\u015eimdi, t\u00fcm bile\u015fenler haz\u0131r oldu\u011funa g\u00f6re, videomuza otomatik altyaz\u0131 ekleme s\u00fcrecini ad\u0131m ad\u0131m uygulayal\u0131m. Bu s\u00fcre\u00e7 \u00fc\u00e7 ana a\u015famadan olu\u015fur: sesi videodan ay\u0131klama, sesi metne d\u00f6n\u00fc\u015ft\u00fcrerek altyaz\u0131 dosyas\u0131 olu\u015fturma ve altyaz\u0131y\u0131 videoya entegre etme.<\/p>\n<h4>3.1 Ad\u0131m 1: Videodan Sesi Ay\u0131klama<\/h4>\n<p>Whisper modeli do\u011frudan video dosyalar\u0131yla \u00e7al\u0131\u015fmak yerine ses dosyalar\u0131n\u0131 (MP3, WAV vb.) tercih eder. Bu nedenle ilk ad\u0131m\u0131m\u0131z, hedef videomuzdan ses par\u00e7as\u0131n\u0131 ay\u0131klamak olacakt\u0131r. Bu i\u015flemi FFmpeg ile ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<pre><code class=\"language-python\">import ffmpeg\nimport os\n\ndef extract_audio(video_path, audio_path):\n    \"\"\"\n    Belirtilen video dosyas\u0131ndan sesi ay\u0131klayarak MP3 format\u0131nda kaydeder.\n    \"\"\"\n    if os.path.exists(audio_path):\n        print(f\"Ses dosyas\u0131 zaten mevcut: {audio_path}\")\n        return\n\n    print(f\"Sesi ay\u0131klan\u0131yor: {video_path} -> {audio_path}\")\n    try:\n        (\n            ffmpeg\n            .input(video_path)\n            .output(audio_path, acodec='libmp3lame', ar='16000') # libmp3lame ile MP3 kodlama, 16kHz \u00f6rnekleme h\u0131z\u0131\n            .run(overwrite_output=True, capture_stderr=True)\n        )\n        print(f\"Ses ba\u015far\u0131yla ay\u0131kland\u0131: {audio_path}\")\n    except ffmpeg.Error as e:\n        print(f\"Hata: Ses ay\u0131klanamad\u0131. STDERR: {e.stderr.decode()}\")\n        raise\n\n<h2>\u00d6rnek kullan\u0131m:<\/h2>\n<h2>video_input_path = \"input_video.mp4\"<\/h2>\n<h2>audio_output_path = \"extracted_audio.mp3\"<\/h2>\n<h2>extract_audio(video_input_path, audio_output_path)<\/code><\/pre>\n<\/h2>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><br \/>\n*   <code>ffmpeg.input(video_path)<\/code>: FFmpeg&#8217;e giri\u015f videosunu belirtir.<br \/>\n*   <code>.output(audio_path, acodec='libmp3lame', ar='16000')<\/code>: \u00c7\u0131k\u0131\u015f dosyas\u0131n\u0131 ve ses kode\u011fini (MP3 i\u00e7in <code>libmp3lame<\/code>), \u00f6rnekleme h\u0131z\u0131n\u0131 (Whisper i\u00e7in 16kHz \u00f6nerilir) ayarlar.<br \/>\n*   <code>.run(overwrite_output=True, capture_stderr=True)<\/code>: FFmpeg komutunu \u00e7al\u0131\u015ft\u0131r\u0131r. <code>overwrite_output=True<\/code> mevcut dosyay\u0131 \u00fczerine yazar, <code>capture_stderr=True<\/code> hata mesajlar\u0131n\u0131 yakalamak i\u00e7indir.<br \/>\n*   Hata y\u00f6netimi (<code>try-except<\/code> blo\u011fu) ekleyerek FFmpeg komutunun ba\u015far\u0131s\u0131z olmas\u0131 durumunda kullan\u0131c\u0131ya bilgi verilir.<\/p>\n<h4>3.2 Ad\u0131m 2: OpenAI Whisper ile Altyaz\u0131 (SRT) Olu\u015fturma<\/h4>\n<p>Ses dosyas\u0131 elimizde oldu\u011funa g\u00f6re, \u015fimdi Whisper modelini kullanarak bu sesi metne d\u00f6n\u00fc\u015ft\u00fcrecek ve zaman damgalar\u0131yla birlikte bir SRT (SubRip) format\u0131nda altyaz\u0131 dosyas\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-python\">import whisper\nimport os\nimport tqdm # \u0130lerleme \u00e7ubu\u011fu i\u00e7in\n\ndef generate_subtitles(audio_path, srt_path, model_name=\"small\", language=\"tr\"):\n    \"\"\"\n    Ses dosyas\u0131ndan altyaz\u0131 (SRT) dosyas\u0131 olu\u015fturur.\n    \"\"\"\n    if os.path.exists(srt_path):\n        print(f\"Altyaz\u0131 dosyas\u0131 zaten mevcut: {srt_path}\")\n        return\n\n    print(f\"Whisper modeli y\u00fckleniyor: {model_name}...\")\n    try:\n        # GPU varsa 'cuda', yoksa 'cpu' kullan\u0131r\n        device = \"cuda\" if whisper.torch.cuda.is_available() else \"cpu\"\n        model = whisper.load_model(model_name, device=device)\n        print(f\"Model {device} \u00fczerinde y\u00fcklendi.\")\n    except Exception as e:\n        print(f\"Hata: Whisper modeli y\u00fcklenemedi. {e}\")\n        print(\"GPU kullan\u0131rken sorun ya\u015f\u0131yorsan\u0131z, 'pip install torch --index-url https:\/\/download.pytorch.org\/whl\/cpu' ile sadece CPU s\u00fcr\u00fcm\u00fcn\u00fc kurmay\u0131 deneyin.\")\n        raise\n\n    print(f\"Ses d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcyor: {audio_path} -> {srt_path}\")\n    try:\n        # tqdm ile ilerleme \u00e7ubu\u011fu ekleyebiliriz (Whisper'\u0131n kendi ilerleme \u00e7ubu\u011fu da var)\n        # Whisper'\u0131n transcribe metodunun bir progress callback'i yok, bu y\u00fczden d\u0131\u015far\u0131dan bir tqdm sarmalay\u0131c\u0131 eklemek zor.\n        # Ancak Whisper'\u0131n kendi transkripsiyon s\u00fcreci genellikle terminalde ilerleme g\u00f6sterir.\n        result = model.transcribe(audio_path, language=language, verbose=True) # verbose=True ile ilerleme g\u00f6zlemlenebilir\n        \n        # SRT format\u0131na d\u00f6n\u00fc\u015ft\u00fcrme\n        with open(srt_path, \"w\", encoding=\"utf-8\") as srt_file:\n            for i, segment in enumerate(result[\"segments\"]):\n                start_time = format_timestamp(segment[\"start\"])\n                end_time = format_timestamp(segment[\"end\"])\n                text = segment[\"text\"].strip()\n                \n                srt_file.write(f\"{i + 1}\\n\")\n                srt_file.write(f\"{start_time} --> {end_time}\\n\")\n                srt_file.write(f\"{text}\\n\\n\")\n        \n        print(f\"Altyaz\u0131 dosyas\u0131 ba\u015far\u0131yla olu\u015fturuldu: {srt_path}\")\n    except Exception as e:\n        print(f\"Hata: Altyaz\u0131 olu\u015fturulamad\u0131. {e}\")\n        raise\n\ndef format_timestamp(seconds):\n    \"\"\"Saniye cinsinden zaman\u0131 SRT format\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.\"\"\"\n    milliseconds = int((seconds - int(seconds)) * 1000)\n    seconds = int(seconds)\n    minutes, seconds = divmod(seconds, 60)\n    hours, minutes = divmod(minutes, 60)\n    return f\"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}\"\n\n<h2>\u00d6rnek kullan\u0131m:<\/h2>\n<h2>audio_input_path = \"extracted_audio.mp3\"<\/h2>\n<h2>srt_output_path = \"subtitles.srt\"<\/h2>\n<h2>generate_subtitles(audio_input_path, srt_output_path, model_name=\"medium\", language=\"tr\")<\/code><\/pre>\n<\/h2>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><br \/>\n*   <code>whisper.load_model(model_name, device=device)<\/code>: Belirtilen Whisper modelini y\u00fckler. <code>model_name<\/code> olarak <code>tiny<\/code>, <code>base<\/code>, <code>small<\/code>, <code>medium<\/code>, <code>large<\/code> gibi se\u00e7enekler mevcuttur. <code>medium<\/code> veya <code>large<\/code> modelleri genellikle daha iyi do\u011fruluk sunar ancak daha fazla i\u015flem g\u00fcc\u00fc (tercihen GPU) ve zaman gerektirir. <code>device<\/code> parametresi ile modelin CPU veya GPU&#8217;da \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtebiliriz.<br \/>\n*   <code>model.transcribe(audio_path, language=language, verbose=True)<\/code>: Ses dosyas\u0131n\u0131 transkribe eder. <code>language<\/code> parametresi, konu\u015fman\u0131n dilini belirtir (\u00f6rne\u011fin, &#8220;tr&#8221; T\u00fcrk\u00e7e i\u00e7in). <code>verbose=True<\/code> konsolda ilerleme durumunu g\u00f6sterir.<br \/>\n*   <code>result[\"segments\"]<\/code>: Transkripsiyon sonucunda elde edilen her bir konu\u015fma par\u00e7as\u0131n\u0131 ve zaman damgalar\u0131n\u0131 i\u00e7eren bir listedir.<br \/>\n*   <code>format_timestamp<\/code> fonksiyonu, Whisper&#8217;dan gelen saniye cinsinden zaman\u0131 SRT format\u0131n\u0131n gerektirdi\u011fi <code>HH:MM:SS,ms<\/code> format\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<br \/>\n*   SRT dosyas\u0131, her bir altyaz\u0131 segmenti i\u00e7in s\u0131ras\u0131yla bir numara, zaman aral\u0131\u011f\u0131 ve metin i\u00e7eren basit bir metin dosyas\u0131d\u0131r.<\/p>\n<h4>3.3 Ad\u0131m 3: Altyaz\u0131y\u0131 Videoya Entegre Etme (Hardcode)<\/h4>\n<p>Altyaz\u0131 dosyam\u0131z (SRT) haz\u0131r oldu\u011funa g\u00f6re, son ad\u0131m olarak bu altyaz\u0131lar\u0131 orijinal videomuza kal\u0131c\u0131 olarak &#8220;yakaca\u011f\u0131z&#8221; (hardcode edece\u011fiz). Bu, altyaz\u0131lar\u0131n videonun bir par\u00e7as\u0131 haline gelmesini ve herhangi bir oynat\u0131c\u0131da veya platformda otomatik olarak g\u00f6r\u00fcnmesini sa\u011flar. Bu i\u015flemi yine FFmpeg ile yapaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-python\">import ffmpeg\nimport os\n\ndef burn_subtitles_to_video(video_path, srt_path, output_video_path, font_size=24, font_color=\"white\", font_name=\"Arial\", outline_color=\"black\"):\n    \"\"\"\n    Altyaz\u0131 dosyas\u0131n\u0131 videoya kal\u0131c\u0131 olarak yakar (hardcode).\n    \"\"\"\n    if os.path.exists(output_video_path):\n        print(f\"\u00c7\u0131k\u0131\u015f video dosyas\u0131 zaten mevcut: {output_video_path}\")\n        return\n\n    print(f\"Altyaz\u0131lar videoya yak\u0131l\u0131yor: {video_path} + {srt_path} -> {output_video_path}\")\n    try:\n        # FFmpeg'in subtitles filtresi ile altyaz\u0131lar\u0131 videoya yakma\n        # font_name, font_size, PrimaryColour, OutlineColour, Alignment gibi bir\u00e7ok stil ayar\u0131 yap\u0131labilir.\n        # PrimaryColour ve OutlineColour AARRGGBB format\u0131ndad\u0131r (Alpha, Red, Green, Blue).\n        # &H00FFFFFF = Beyaz (tam opak)\n        # &H00000000 = Siyah (tam opak)\n        \n        style_string = (\n            f\"Fontname={font_name},\"\n            f\"FontSize={font_size},\"\n            f\"PrimaryColour=&H00{font_color.upper()},\" # \u00d6rn: &H00FFFFFF (Beyaz)\n            f\"OutlineColour=&H00{outline_color.upper()},\" # \u00d6rn: &H00000000 (Siyah)\n            \"BorderStyle=1,\" # 1: Outline+Shadow, 3: Opaque Box\n            \"Outline=1,\"     # Outline kal\u0131nl\u0131\u011f\u0131\n            \"Shadow=0,\"      # G\u00f6lge kal\u0131nl\u0131\u011f\u0131\n            \"Alignment=2,\"   # 2: Orta Alt\n            \"MarginV=20\"     # Dikey marj (alt kenardan uzakl\u0131k)\n        )\n\n        (\n            ffmpeg\n            .input(video_path)\n            .output(\n                output_video_path,\n                vf=f\"subtitles='{srt_path.replace(':', '\\\\:')}':force_style='{style_string}'\",\n                acodec='copy', # Ses ak\u0131\u015f\u0131n\u0131 yeniden kodlamadan kopyala\n                vcodec='libx264' # Video kode\u011fini belirle, h264 i\u00e7in libx264\n            )\n            .run(overwrite_output=True, capture_stderr=True)\n        )\n        print(f\"Altyaz\u0131l\u0131 video ba\u015far\u0131yla olu\u015fturuldu: {output_video_path}\")\n    except ffmpeg.Error as e:\n        print(f\"Hata: Altyaz\u0131lar videoya yak\u0131lamad\u0131. STDERR: {e.stderr.decode()}\")\n        raise\n\n<h2>\u00d6rnek kullan\u0131m:<\/h2>\n<h2>video_input_path = \"input_video.mp4\"<\/h2>\n<h2>srt_input_path = \"subtitles.srt\"<\/h2>\n<h2>output_video_path = \"output_video_with_subtitles.mp4\"<\/h2>\n<h2>burn_subtitles_to_video(video_input_path, srt_input_path, output_video_path, font_size=28, font_color=\"FFFF00\", outline_color=\"000000\") # Sar\u0131 metin, siyah \u00e7er\u00e7eve<\/code><\/pre>\n<\/h2>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><br \/>\n*   <code>ffmpeg.input(video_path)<\/code>: Giri\u015f videosunu belirtir.<br \/>\n*   <code>.output(output_video_path, vf=..., acodec='copy', vcodec='libx264')<\/code>: \u00c7\u0131k\u0131\u015f videosunu ve video filtresini (<code>vf<\/code>), ses ve video kodeklerini ayarlar.<br \/>\n*   <code>vf=f\"subtitles='{srt_path}':force_style='{style_string}'\"<\/code>: Bu k\u0131s\u0131m en \u00f6nemli noktad\u0131r. <code>subtitles<\/code> filtresi, belirtilen SRT dosyas\u0131n\u0131 videoya uygular.<br \/>\n    *   <code>srt_path.replace(':', '\\\\:')<\/code>: Windows sistemlerinde dosya yolu i\u00e7inde <code>C:\\<\/code> gibi bir ifade varsa, FFmpeg&#8217;in bunu yanl\u0131\u015f yorumlamamas\u0131 i\u00e7in <code>:<\/code> karakterinin ka\u00e7\u0131r\u0131lmas\u0131 gerekebilir.<br \/>\n    *   <code>force_style='...'<\/code>: Altyaz\u0131n\u0131n stilini \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Burada yaz\u0131 tipi, boyutu, rengi, d\u0131\u015f \u00e7izgi rengi, hizalama gibi bir\u00e7ok parametre ayarlanabilir.<br \/>\n        *   <code>Fontname<\/code>: Yaz\u0131 tipi (\u00f6rne\u011fin, &#8220;Arial&#8221;, &#8220;Verdana&#8221;).<br \/>\n        *   <code>FontSize<\/code>: Yaz\u0131 boyutu.<br \/>\n        *   <code>PrimaryColour<\/code>: Metin rengi (RGB veya AARRGGBB hex kodu, <code>&H00RRGGBB<\/code> format\u0131nda).<br \/>\n        *   <code>OutlineColour<\/code>: D\u0131\u015f \u00e7izgi rengi.<br \/>\n        *   <code>BorderStyle<\/code>: 1 (D\u0131\u015f \u00e7izgi + G\u00f6lge) veya 3 (Opak Kutu).<br \/>\n        *   <code>Outline<\/code>: D\u0131\u015f \u00e7izgi kal\u0131nl\u0131\u011f\u0131.<br \/>\n        *   <code>Shadow<\/code>: G\u00f6lge kal\u0131nl\u0131\u011f\u0131.<br \/>\n        *   <code>Alignment<\/code>: Metnin videodaki konumu (1-9 aras\u0131, 2 genellikle orta alt).<br \/>\n        *   <code>MarginV<\/code>: Dikey marj (altyaz\u0131n\u0131n alt kenardan ne kadar yukar\u0131da olaca\u011f\u0131).<br \/>\n*   <code>acodec='copy'<\/code>: Ses ak\u0131\u015f\u0131n\u0131 yeniden kodlamadan kopyalar, bu da i\u015flem s\u00fcresini k\u0131salt\u0131r ve kalite kayb\u0131n\u0131 \u00f6nler.<br \/>\n*   <code>vcodec='libx264'<\/code>: Video ak\u0131\u015f\u0131n\u0131 H.264 format\u0131nda kodlar. Bu, \u00e7o\u011fu platformda uyumlu ve iyi s\u0131k\u0131\u015ft\u0131rma sa\u011flayan pop\u00fcler bir kodektir.<\/p>\n<h3>B\u00f6l\u00fcm 4: T\u00fcm S\u00fcreci Birle\u015ftiren Python Beti\u011fi ve Geli\u015fmi\u015f Konular<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendi\u011fimiz t\u00fcm ad\u0131mlar\u0131 tek bir Python beti\u011finde birle\u015ftirelim ve kullan\u0131c\u0131 dostu bir ara\u00e7 olu\u015ftural\u0131m. Ayr\u0131ca, performans, do\u011fruluk ve hata y\u00f6netimi gibi geli\u015fmi\u015f konulara da de\u011finelim.<\/p>\n<h4>4.1 Ana Betik (main.py)<\/h4>\n<pre><code class=\"language-python\">import os\nimport argparse\nfrom datetime import datetime\nimport ffmpeg\nimport whisper\n\n<h2>Daha \u00f6nceki fonksiyonlar\u0131 buraya kopyalayabilir veya ayr\u0131 bir utils.py dosyas\u0131nda tutabilirsiniz.<\/h2>\n<h2>Basitlik i\u00e7in burada tekrar tan\u0131mlanm\u0131\u015ft\u0131r.<\/h2>\n\ndef extract_audio(video_path, audio_path):\n    if os.path.exists(audio_path):\n        print(f\"Ses dosyas\u0131 zaten mevcut: {audio_path}\")\n        return True\n\n    print(f\"Sesi ay\u0131klan\u0131yor: {video_path} -> {audio_path}\")\n    try:\n        (\n            ffmpeg\n            .input(video_path)\n            .output(audio_path, acodec='libmp3lame', ar='16000')\n            .run(overwrite_output=True, capture_stderr=True)\n        )\n        print(f\"Ses ba\u015far\u0131yla ay\u0131kland\u0131: {audio_path}\")\n        return True\n    except ffmpeg.Error as e:\n        print(f\"Hata: Ses ay\u0131klanamad\u0131. STDERR: {e.stderr.decode()}\")\n        return False\n\ndef format_timestamp(seconds):\n    milliseconds = int((seconds - int(seconds)) * 1000)\n    seconds = int(seconds)\n    minutes, seconds = divmod(seconds, 60)\n    hours, minutes = divmod(minutes, 60)\n    return f\"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}\"\n\ndef generate_subtitles(audio_path, srt_path, model_name=\"small\", language=\"tr\"):\n    if os.path.exists(srt_path):\n        print(f\"Altyaz\u0131 dosyas\u0131 zaten mevcut: {srt_path}\")\n        return True\n\n    print(f\"Whisper modeli y\u00fckleniyor: {model_name}...\")\n    try:\n        device = \"cuda\" if whisper.torch.cuda.is_available() else \"cpu\"\n        model = whisper.load_model(model_name, device=device)\n        print(f\"Model {device} \u00fczerinde y\u00fcklendi.\")\n    except Exception as e:\n        print(f\"Hata: Whisper modeli y\u00fcklenemedi. {e}\")\n        print(\"GPU kullan\u0131rken sorun ya\u015f\u0131yorsan\u0131z, 'pip install torch --index-url https:\/\/download.pytorch.org\/whl\/cpu' ile sadece CPU s\u00fcr\u00fcm\u00fcn\u00fc kurmay\u0131 deneyin.\")\n        return False\n\n    print(f\"Ses d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcyor: {audio_path} -> {srt_path}\")\n    try:\n        result = model.transcribe(audio_path, language=language, verbose=True)\n        \n        with open(srt_path, \"w\", encoding=\"utf-8\") as srt_file:\n            for i, segment in enumerate(result[\"segments\"]):\n                start_time = format_timestamp(segment[\"start\"])\n                end_time = format_timestamp(segment[\"end\"])\n                text = segment[\"text\"].strip()\n                \n                srt_file.write(f\"{i + 1}\\n\")\n                srt_file.write(f\"{start_time} --> {end_time}\\n\")\n                srt_file.write(f\"{text}\\n\\n\")\n        \n        print(f\"Altyaz\u0131 dosyas\u0131 ba\u015far\u0131yla olu\u015fturuldu: {srt_path}\")\n        return True\n    except Exception as e:\n        print(f\"Hata: Altyaz\u0131 olu\u015fturulamad\u0131. {e}\")\n        return False\n\ndef burn_subtitles_to_video(video_path, srt_path, output_video_path, font_size=24, font_color=\"FFFFFF\", font_name=\"Arial\", outline_color=\"000000\"):\n    if os.path.exists(output_video_path):\n        print(f\"\u00c7\u0131k\u0131\u015f video dosyas\u0131 zaten mevcut: {output_video_path}\")\n        return True\n\n    print(f\"Altyaz\u0131lar videoya yak\u0131l\u0131yor: {video_path} + {srt_path} -> {output_video_path}\")\n    try:\n        style_string = (\n            f\"Fontname={font_name},\"\n            f\"FontSize={font_size},\"\n            f\"PrimaryColour=&H00{font_color},\"\n            f\"OutlineColour=&H00{outline_color},\"\n            \"BorderStyle=1,\"\n            \"Outline=1,\"\n            \"Shadow=0,\"\n            \"Alignment=2,\"\n            \"MarginV=20\"\n        )\n\n        (\n            ffmpeg\n            .input(video_path)\n            .output(\n                output_video_path,\n                vf=f\"subtitles='{srt_path.replace(':', '\\\\:')}':force_style='{style_string}'\",\n                acodec='copy',\n                vcodec='libx264'\n            )\n            .run(overwrite_output=True, capture_stderr=True)\n        )\n        print(f\"Altyaz\u0131l\u0131 video ba\u015far\u0131yla olu\u015fturuldu: {output_video_path}\")\n        return True\n    except ffmpeg.Error as e:\n        print(f\"Hata: Altyaz\u0131lar videoya yak\u0131lamad\u0131. STDERR: {e.stderr.decode()}\")\n        return False\n\ndef main():\n    parser = argparse.ArgumentParser(description=\"Python, OpenAI Whisper ve FFmpeg kullanarak videolara otomatik altyaz\u0131 ekler.\")\n    parser.add_argument(\"video_file\", type=str, help=\"\u0130\u015flenecek video dosyas\u0131n\u0131n yolu.\")\n    parser.add_argument(\"--model\", type=str, default=\"small\", choices=[\"tiny\", \"base\", \"small\", \"medium\", \"large\", \"large-v2\"],\n                        help=\"Kullan\u0131lacak Whisper modeli (tiny, base, small, medium, large).\")\n    parser.add_argument(\"--lang\", type=str, default=\"tr\", help=\"Konu\u015fman\u0131n dili (\u00f6rn: en, tr, de).\")\n    parser.add_argument(\"--font_size\", type=int, default=24, help=\"Altyaz\u0131 yaz\u0131 boyutu.\")\n    parser.add_argument(\"--font_color\", type=str, default=\"FFFFFF\", help=\"Altyaz\u0131 yaz\u0131 rengi (hex kodu, \u00f6rn: FFFFFF beyaz i\u00e7in).\")\n    parser.add_argument(\"--font_name\", type=str, default=\"Arial\", help=\"Altyaz\u0131 yaz\u0131 tipi.\")\n    parser.add_argument(\"--outline_color\", type=str, default=\"000000\", help=\"Altyaz\u0131 d\u0131\u015f \u00e7izgi rengi (hex kodu, \u00f6rn: 000000 siyah i\u00e7in).\")\n    parser.add_argument(\"--output_suffix\", type=str, default=\"_subtitled\", help=\"\u00c7\u0131k\u0131\u015f video dosyas\u0131na eklenecek sonek.\")\n\n    args = parser.parse_args()\n\n    video_input_path = args.video_file\n    \n    if not os.path.exists(video_input_path):\n        print(f\"Hata: Video dosyas\u0131 bulunamad\u0131: {video_input_path}\")\n        return\n\n    base_name = os.path.splitext(os.path.basename(video_input_path))[0]\n    output_dir = \"output_files\"\n    os.makedirs(output_dir, exist_ok=True)\n\n    audio_output_path = os.path.join(output_dir, f\"{base_name}.mp3\")\n    srt_output_path = os.path.join(output_dir, f\"{base_name}.srt\")\n    output_video_path = os.path.join(output_dir, f\"{base_name}{args.output_suffix}.mp4\")\n\n    start_time = datetime.now()\n    print(f\"\u0130\u015flem ba\u015flad\u0131: {start_time}\")\n\n    # 1. Sesi Ay\u0131kla\n    if not extract_audio(video_input_path, audio_output_path):\n        return\n\n    # 2. Altyaz\u0131 Olu\u015ftur\n    if not generate_subtitles(audio_output_path, srt_output_path, args.model, args.lang):\n        return\n\n    # 3. Altyaz\u0131y\u0131 Videoya Yak\n    if not burn_subtitles_to_video(video_input_path, srt_output_path, output_video_path, \n                                   args.font_size, args.font_color, args.font_name, args.outline_color):\n        return\n    \n    end_time = datetime.now()\n    print(f\"\u0130\u015flem tamamland\u0131: {end_time}\")\n    print(f\"Toplam s\u00fcre: {end_time - start_time}\")\n    print(f\"Final video: {output_video_path}\")\n\nif __name__ == \"__main__\":\n    main()<\/code><\/pre>\n<h4>4.2 Beti\u011fi \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Yukar\u0131daki kodu <code>main.py<\/code> ad\u0131yla kaydedin. Ard\u0131ndan, sanal ortam\u0131n\u0131z etkinle\u015ftirilmi\u015fken komut istemcinizden \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">python main.py input_video.mp4 --model medium --lang tr --font_size 28 --font_color FFFF00 --outline_color 000000<\/code><\/pre>\n<p>*   <code>input_video.mp4<\/code>: \u0130\u015flemek istedi\u011finiz video dosyas\u0131n\u0131n yolu.<br \/>\n*   <code>--model medium<\/code>: <code>medium<\/code> boyutlu Whisper modelini kullan\u0131r. Daha h\u0131zl\u0131 ancak daha az do\u011fru sonu\u00e7lar i\u00e7in <code>small<\/code> veya <code>base<\/code> kullanabilirsiniz. En iyi do\u011fruluk i\u00e7in <code>large<\/code> veya <code>large-v2<\/code> kullan\u0131n (GPU gerektirir).<br \/>\n*   <code>--lang tr<\/code>: Konu\u015fma dilini T\u00fcrk\u00e7e olarak ayarlar.<br \/>\n*   <code>--font_size 28<\/code>: Altyaz\u0131 font boyutunu 28 yapar.<br \/>\n*   <code>--font_color FFFF00<\/code>: Altyaz\u0131 metin rengini sar\u0131 yapar.<br \/>\n*   <code>--outline_color 000000<\/code>: Altyaz\u0131 d\u0131\u015f \u00e7izgi rengini siyah yapar.<\/p>\n<h4>4.3 Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h4>\n<h5>4.3.1 Performans ve GPU Kullan\u0131m\u0131<\/h5>\n<p>*   <strong>Whisper Modeli Se\u00e7imi:<\/strong> <code>tiny<\/code> ve <code>base<\/code> modeller CPU \u00fczerinde nispeten h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131rken, <code>small<\/code>, <code>medium<\/code> ve <code>large<\/code> modelleri GPU (\u00f6zellikle NVIDIA CUDA) kullan\u0131ld\u0131\u011f\u0131nda \u00e7ok daha h\u0131zl\u0131d\u0131r. E\u011fer bir NVIDIA GPU&#8217;nuz varsa, PyTorch&#8217;u CUDA deste\u011fiyle kurdu\u011funuzdan emin olun (B\u00f6l\u00fcm 2.4&#8217;teki talimatlara bak\u0131n).<br \/>\n*   <strong>Bellek Kullan\u0131m\u0131:<\/strong> <code>large<\/code> model, \u00f6zellikle uzun videolar i\u00e7in \u00f6nemli miktarda VRAM (GPU belle\u011fi) veya RAM gerektirebilir. Bellek s\u0131n\u0131rlamalar\u0131 ya\u015f\u0131yorsan\u0131z daha k\u00fc\u00e7\u00fck bir model kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<br \/>\n*   <strong>Paralelle\u015ftirme:<\/strong> Birden fazla videoyu i\u015flerken, her video i\u00e7in ayr\u0131 bir i\u015flem veya i\u015f par\u00e7ac\u0131\u011f\u0131 (thread) kullanarak i\u015flemi paralelle\u015ftirebilir ve toplam s\u00fcreyi k\u0131saltabilirsiniz. Python&#8217;\u0131n <code>concurrent.futures<\/code> mod\u00fcl\u00fc bu konuda yard\u0131mc\u0131 olabilir.<\/p>\n<h5>4.3.2 Do\u011fruluk ve Dil Se\u00e7imi<\/h5>\n<p>*   <strong>Ses Kalitesi:<\/strong> Whisper&#8217;\u0131n do\u011frulu\u011fu, giri\u015f sesinin kalitesiyle do\u011frudan orant\u0131l\u0131d\u0131r. Arka plan g\u00fcr\u00fclt\u00fcs\u00fc, yank\u0131 veya d\u00fc\u015f\u00fck kay\u0131t kalitesi transkripsiyon do\u011frulu\u011funu olumsuz etkiler.<br \/>\n*   <strong>Konu\u015fma H\u0131z\u0131 ve Netli\u011fi:<\/strong> Konu\u015fmac\u0131n\u0131n net ve makul bir h\u0131zda konu\u015fmas\u0131, daha do\u011fru sonu\u00e7lar al\u0131nmas\u0131na yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Dil Belirtme:<\/strong> <code>--lang<\/code> parametresiyle do\u011fru dili belirtmek, Whisper&#8217;\u0131n o dile odaklanmas\u0131n\u0131 sa\u011flayarak do\u011frulu\u011fu art\u0131r\u0131r. Whisper otomatik dil tespiti yapabilse de, manuel belirtme genellikle daha g\u00fcvenilirdir.<br \/>\n*   <strong>Model Boyutu:<\/strong> Daha b\u00fcy\u00fck modeller (\u00f6rne\u011fin, <code>large<\/code> veya <code>large-v2<\/code>) genellikle daha y\u00fcksek do\u011fruluk sunar ancak daha yava\u015f \u00e7al\u0131\u015f\u0131r ve daha fazla kaynak gerektirir.<\/p>\n<h5>4.3.3 Hata Y\u00f6netimi ve Sa\u011flaml\u0131k<\/h5>\n<p>*   <strong>Dosya Kontrolleri:<\/strong> Betik, giri\u015f video dosyas\u0131n\u0131n varl\u0131\u011f\u0131n\u0131 kontrol etmeli ve ara \u00e7\u0131kt\u0131 dosyalar\u0131n\u0131n (ses, SRT) zaten mevcut olup olmad\u0131\u011f\u0131n\u0131 sorgulayarak gereksiz i\u015flemleri atlamal\u0131d\u0131r.<br \/>\n*   <strong>Try-Except Bloklar\u0131:<\/strong> FFmpeg komutlar\u0131 veya Whisper modeli y\u00fckleme\/\u00e7al\u0131\u015ft\u0131rma s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 yakalamak i\u00e7in <code>try-except<\/code> bloklar\u0131 kullanmak, beti\u011fin \u00e7\u00f6kmesini engeller ve kullan\u0131c\u0131ya anlaml\u0131 hata mesajlar\u0131 sunar.<br \/>\n*   <strong>Ge\u00e7ici Dosyalar:<\/strong> Ay\u0131klanan ses dosyalar\u0131 veya olu\u015fturulan SRT dosyalar\u0131 gibi ge\u00e7ici dosyalar\u0131n i\u015fleme sonunda silinmesi (veya belirli bir klas\u00f6rde tutulmas\u0131), disk alan\u0131n\u0131n d\u00fczenli kalmas\u0131na yard\u0131mc\u0131 olur. Benim beti\u011fim <code>output_files<\/code> klas\u00f6r\u00fcnde tutmay\u0131 tercih ediyor.<\/p>\n<h5>4.3.4 Altyaz\u0131 Stili ve Konumland\u0131rma<\/h5>\n<p>*   <strong>FFmpeg <code>subtitles<\/code> Filtresi:<\/strong> FFmpeg&#8217;in <code>subtitles<\/code> filtresi, altyaz\u0131lar\u0131n g\u00f6r\u00fcn\u00fcm\u00fc \u00fczerinde olduk\u00e7a detayl\u0131 kontrol sa\u011flar. <code>force_style<\/code> parametresiyle <code>Fontname<\/code>, <code>FontSize<\/code>, <code>PrimaryColour<\/code>, <code>OutlineColour<\/code>, <code>Alignment<\/code>, <code>MarginV<\/code> gibi bir\u00e7ok ayar\u0131 yapabilirsiniz.<br \/>\n*   <strong>Renk Kodlar\u0131:<\/strong> Renkler genellikle AARRGGBB (Alpha, Red, Green, Blue) format\u0131nda hex kodlar\u0131 olarak belirtilir. Python beti\u011fimizde <code>font_color=\"FFFFFF\"<\/code> gibi sadece RGB k\u0131sm\u0131n\u0131 al\u0131p <code>&H00<\/code> \u00f6n ekini ekleyerek tam opak (Alpha=00) renkler olu\u015fturuyoruz.<br \/>\n*   <strong>Hizalama:<\/strong> <code>Alignment<\/code> parametresi, altyaz\u0131n\u0131n ekrandaki konumunu belirler. 2 (orta alt), 1 (sol alt), 3 (sa\u011f alt) gibi de\u011ferler alabilir.<\/p>\n<h5>4.3.5 Batch \u0130\u015fleme<\/h5>\n<p>Birden fazla video dosyas\u0131n\u0131 i\u015flemek i\u00e7in ana beti\u011fi bir d\u00f6ng\u00fc i\u00e7ine alabilirsiniz. Belirli bir klas\u00f6rdeki t\u00fcm <code>.mp4<\/code> dosyalar\u0131n\u0131 bulup her biri i\u00e7in bu s\u00fcreci tekrarlayan bir yap\u0131 kurmak olduk\u00e7a kolayd\u0131r.<\/p>\n<pre><code class=\"language-python\"># main.py dosyas\u0131nda main() fonksiyonunun i\u00e7inde veya ayr\u0131 bir fonksiyonda\n<h2>video_files_to_process = [\"video1.mp4\", \"video2.mp4\", \"folder\/video3.mp4\"]<\/h2>\n<h2>for video_file in video_files_to_process:<\/h2>\n<h2># Mevcut arg\u00fcmanlar\u0131 kullanarak her bir video i\u00e7in main() i\u00e7indeki ad\u0131mlar\u0131 tekrarla<\/h2>\n<h2># Veya main() fonksiyonunu bu d\u00f6ng\u00fcye uygun hale getirerek \u00e7a\u011f\u0131r\u0131n<\/h2>\n<h2>process_single_video(video_file, args.model, args.lang, ...)<\/code><\/pre>\n<\/h2>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 teknik makalede, Python, OpenAI Whisper ve FFmpeg&#8217;in g\u00fc\u00e7l\u00fc kombinasyonunu kullanarak videolara otomatik altyaz\u0131 olu\u015fturma ve ekleme s\u00fcrecini ad\u0131m ad\u0131m inceledik. Videodan ses ay\u0131klamadan, Whisper ile konu\u015fmay\u0131 metne d\u00f6n\u00fc\u015ft\u00fcrmeye ve FFmpeg ile altyaz\u0131lar\u0131 videoya kal\u0131c\u0131 olarak yakmaya kadar her a\u015famay\u0131 detayland\u0131rd\u0131k.<\/p>\n<p>Bu y\u00f6ntem, i\u00e7erik \u00fcreticileri, e\u011fitimciler ve geli\u015ftiriciler i\u00e7in manuel altyaz\u0131 olu\u015fturma y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltarak zaman ve maliyet tasarrufu sa\u011flar. Ayr\u0131ca, olu\u015fturulan altyaz\u0131lar sayesinde videolar\u0131n\u0131z\u0131n eri\u015filebilirli\u011fini art\u0131rabilir, daha geni\u015f bir kitleye ula\u015fabilir ve arama motorlar\u0131ndaki g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc iyile\u015ftirebilirsiniz.<\/p>\n<p>Unutulmamal\u0131d\u0131r ki, yapay zeka tabanl\u0131 sistemler m\u00fckemmel de\u011fildir. Ses kalitesi, aksanlar veya karma\u015f\u0131k terminoloji gibi fakt\u00f6rler transkripsiyon do\u011frulu\u011funu etkileyebilir. Bu nedenle, kritik uygulamalar i\u00e7in otomatik olu\u015fturulan altyaz\u0131lar\u0131n manuel olarak g\u00f6zden ge\u00e7irilmesi ve d\u00fczenlenmesi her zaman iyi bir uygulama olacakt\u0131r.<\/p>\n<p>Bu rehber, kendi otomatik altyaz\u0131 olu\u015fturma sisteminizi kurman\u0131z i\u00e7in sa\u011flam bir temel sunmaktad\u0131r. Bu temeli kullanarak kendi ihtiya\u00e7lar\u0131n\u0131za g\u00f6re daha da geli\u015ftirebilir, farkl\u0131 altyaz\u0131 stilleri deneyebilir, birden fazla dil deste\u011fi ekleyebilir veya bir web aray\u00fcz\u00fc ile entegre edebilirsiniz. Teknolojinin bu heyecan verici birle\u015fimini ke\u015ffetmeye devam edin ve video i\u00e7eri\u011finizin potansiyelini tam olarak ortaya \u00e7\u0131kar\u0131n!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber\nGiri\u015f: Neden Otomatik Altyaz\u0131?\nG\u00fcn\u00fcm\u00fcz\u00fcn","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-38739","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber Giri\u015f: Neden Otomatik Altyaz\u0131? G\u00fcn\u00fcm\u00fcz\u00fcn\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-06T12:41:03+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-02-06T12:41:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/\"},\"wordCount\":3080,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/\",\"name\":\"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-06T12:41:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber","og_description":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber Giri\u015f: Neden Otomatik Altyaz\u0131? G\u00fcn\u00fcm\u00fcz\u00fcn","og_url":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-06T12:41:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber","datePublished":"2026-02-06T12:41:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/"},"wordCount":3080,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/","name":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-06T12:41:03+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-openai-whisper-ve-ffmpeg-kullanarak-videolara-otomatik-altyazi-ekleme-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python, OpenAI Whisper ve FFmpeg Kullanarak Videolara Otomatik Altyaz\u0131 Ekleme: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38739"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38739\/revisions"}],"predecessor-version":[{"id":38740,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38739\/revisions\/38740"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}