{"id":42449,"date":"2026-06-10T21:15:13","date_gmt":"2026-06-10T18:15:13","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/"},"modified":"2026-06-10T21:15:13","modified_gmt":"2026-06-10T18:15:13","slug":"tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/","title":{"rendered":"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?"},"content":{"rendered":"<h2>Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?<\/h2>\n<p>Web&#8217;de gezinirken ses seviyelerindeki tutars\u0131zl\u0131klar, aniden y\u00fckselen reklam sesleri veya f\u0131s\u0131lt\u0131 gibi kalan diyaloglar \u00e7o\u011fu zaman can s\u0131k\u0131c\u0131 olabilir. Bu t\u00fcr durumlar, genel multimedya deneyimini olumsuz etkileyerek, s\u00fcrekli olarak ses ayarlar\u0131yla oynamam\u0131za neden olur. Peki, taray\u0131c\u0131n\u0131z\u0131n ses \u00e7\u0131k\u0131\u015f\u0131n\u0131 ger\u00e7ek zamanl\u0131 olarak optimize eden, t\u00fcm bu sorunlar\u0131 ortadan kald\u0131ran yerel bir ses kompres\u00f6r\u00fc entegre eden bir taray\u0131c\u0131 uzant\u0131s\u0131 geli\u015ftirerek bu deneyimi nas\u0131l iyile\u015ftirebiliriz? Bu makale, taray\u0131c\u0131 uzant\u0131lar\u0131 d\u00fcnyas\u0131na ad\u0131m atarak, Web Audio API kullanarak taray\u0131c\u0131n\u0131z\u0131n ses ak\u0131\u015f\u0131n\u0131 nas\u0131l i\u015fleyebilece\u011finizi ve dinamik aral\u0131\u011f\u0131 optimize eden bir ses kompres\u00f6r\u00fcn\u00fc nas\u0131l entegre edebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h2>Web&#8217;de Ses Kalitesi Sorunlar\u0131 ve \u00c7\u00f6z\u00fcm Aray\u0131\u015flar\u0131<\/h2>\n<p>\u0130nternet, e\u011flence, bilgi ve ileti\u015fim i\u00e7in vazge\u00e7ilmez bir platform haline geldi. Ancak, farkl\u0131 web siteleri ve medya kaynaklar\u0131 aras\u0131nda gezinirken kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z en yayg\u0131n sorunlardan biri, ses seviyelerindeki tutars\u0131zl\u0131kt\u0131r. Bir YouTube videosu izlerken ses seviyesi ideal olabilirken, ba\u015fka bir sekmede a\u00e7t\u0131\u011f\u0131n\u0131z haber sitesindeki otomatik oynayan bir reklam aniden kulaklar\u0131n\u0131z\u0131 t\u0131rmalayabilir. Ya da bir filmi izlerken diyaloglar \u00e7ok k\u0131s\u0131kken, aksiyon sahneleri birden bire \u00e7ok y\u00fcksek sesle \u00e7alabilir. Bu durum, kullan\u0131c\u0131lar\u0131n s\u00fcrekli olarak ses ayarlar\u0131yla u\u011fra\u015fmas\u0131na ve genel deneyimin kalitesinin d\u00fc\u015fmesine yol a\u00e7ar.<\/p>\n<p>Bu t\u00fcr ses seviyesi dengesizlikleri, i\u00e7eri\u011fin \u00fcretildi\u011fi farkl\u0131 standartlardan, yay\u0131nc\u0131lar\u0131n kulland\u0131\u011f\u0131 farkl\u0131 ses miksajlar\u0131ndan veya basit\u00e7e medya t\u00fcrlerinin do\u011fas\u0131ndan kaynaklanabilir. \u00d6rne\u011fin, bir podcast genellikle konu\u015fma a\u011f\u0131rl\u0131kl\u0131 oldu\u011fu i\u00e7in daha dar bir dinamik aral\u0131\u011fa sahipken, bir aksiyon filmi \u00e7ok geni\u015f bir dinamik aral\u0131kta sesler i\u00e7erebilir. Taray\u0131c\u0131lar, varsay\u0131lan olarak bu farkl\u0131l\u0131klar\u0131 otomatik olarak dengeleyecek yerle\u015fik bir mekanizma sunmazlar. \u0130\u015fte tam da bu noktada, yerel bir ses kompres\u00f6r\u00fc entegre eden bir taray\u0131c\u0131 uzant\u0131s\u0131 devreye girerek, bu soruna zarif ve etkili bir \u00e7\u00f6z\u00fcm sunar. Bir ses kompres\u00f6r\u00fc, ses sinyalinin dinamik aral\u0131\u011f\u0131n\u0131 (en k\u0131s\u0131k ses ile en y\u00fcksek ses aras\u0131ndaki fark) azaltarak, daha tutarl\u0131 ve dengeli bir dinleme deneyimi sa\u011flar. Bu sayede, \u00e7ok y\u00fcksek sesler otomatik olarak k\u0131s\u0131l\u0131rken, \u00e7ok k\u0131s\u0131k sesler de anla\u015f\u0131labilir seviyelere y\u00fckseltilebilir.<\/p>\n<p>Taray\u0131c\u0131 uzant\u0131lar\u0131n\u0131n g\u00fcc\u00fc, kullan\u0131c\u0131lar\u0131n taray\u0131c\u0131 deneyimini ki\u015fiselle\u015ftirmelerine ve geli\u015ftirmelerine olanak tan\u0131mas\u0131ndan gelir. Bir uzant\u0131 arac\u0131l\u0131\u011f\u0131yla, taray\u0131c\u0131n\u0131n varsay\u0131lan i\u015flevselli\u011fine yeni \u00f6zellikler ekleyebilir, mevcut davran\u0131\u015flar\u0131 de\u011fi\u015ftirebilir veya tamamen yeni ara\u00e7lar sunabiliriz. Ses kompres\u00f6r\u00fc uzant\u0131s\u0131 da bu mant\u0131kla \u00e7al\u0131\u015f\u0131r; taray\u0131c\u0131n\u0131n ses \u00e7\u0131k\u0131\u015f\u0131n\u0131 yakalar, ger\u00e7ek zamanl\u0131 olarak i\u015fler ve ard\u0131ndan i\u015flenmi\u015f sesi kullan\u0131c\u0131ya sunar. Bu, sadece ses seviyesi tutars\u0131zl\u0131klar\u0131n\u0131 gidermekle kalmaz, ayn\u0131 zamanda i\u015fitme engelli kullan\u0131c\u0131lar i\u00e7in diyaloglar\u0131 daha anla\u015f\u0131l\u0131r hale getirmek veya g\u00fcr\u00fclt\u00fcl\u00fc ortamlarda medya t\u00fcketimini kolayla\u015ft\u0131rmak gibi ek faydalar da sa\u011flayabilir. K\u0131sacas\u0131, bir taray\u0131c\u0131 uzant\u0131s\u0131 ile ses deneyimini temelden d\u00f6n\u00fc\u015ft\u00fcrme potansiyeline sahibiz. Bu, sadece teknik bir ba\u015far\u0131 de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n g\u00fcnl\u00fck web kullan\u0131m\u0131n\u0131 daha konforlu ve keyifli hale getiren pratik bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h2>Web Audio API: Taray\u0131c\u0131da Ses \u0130\u015flemenin Kalbi<\/h2>\n<p>Taray\u0131c\u0131da geli\u015fmi\u015f ses i\u015fleme yetenekleri sunan Web Audio API, modern web uygulamalar\u0131 i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. Bu API, sadece ses \u00e7almakla kalmaz, ayn\u0131 zamanda sesi ger\u00e7ek zamanl\u0131 olarak analiz etme, de\u011fi\u015ftirme ve sentezleme imkan\u0131 sunar. Bir taray\u0131c\u0131 uzant\u0131s\u0131na yerel bir ses kompres\u00f6r\u00fc ekleme hedefimizde, Web Audio API, ses ak\u0131\u015f\u0131n\u0131 yakalamak, dinamik kompresyon uygulamak ve i\u015flenmi\u015f sesi geri oynatmak i\u00e7in temel bir bile\u015fen olarak g\u00f6rev yapar. Neden bu kadar \u00f6nemli oldu\u011funu anlamak i\u00e7in, API&#8217;nin temel yap\u0131s\u0131na ve sundu\u011fu imkanlara yak\u0131ndan bakal\u0131m.<\/p>\n<p>Web Audio API, bir ses ba\u011flam\u0131 (<code>AudioContext<\/code>) etraf\u0131nda in\u015fa edilmi\u015ftir. Bu ba\u011flam, t\u00fcm ses i\u015flemlerinin ger\u00e7ekle\u015fti\u011fi bir grafi\u011fi y\u00f6netir. Bu grafikte, ses kaynaklar\u0131 (<code>Source Nodes<\/code>), ses i\u015fleme d\u00fc\u011f\u00fcmleri (<code>AudioNodes<\/code>) ve bir hedef d\u00fc\u011f\u00fcm (<code>Destination Node<\/code>) bulunur. Ses, bu d\u00fc\u011f\u00fcmler aras\u0131nda bir ak\u0131\u015f (stream) olarak hareket eder. \u00d6rne\u011fin, bir ses dosyas\u0131ndan gelen ses (<code>AudioBufferSourceNode<\/code>) veya bir mikrofon giri\u015finden gelen ses (<code>MediaStreamSourceNode<\/code>) bir kaynak d\u00fc\u011f\u00fcm olabilir. Bu ses daha sonra bir veya daha fazla i\u015fleme d\u00fc\u011f\u00fcm\u00fcnden ge\u00e7irilerek (\u00f6rne\u011fin, bir <code>GainNode<\/code> ile ses seviyesi ayarlanabilir, bir <code>AnalyserNode<\/code> ile frekans spektrumu analiz edilebilir veya bir <code>DynamicsCompressorNode<\/code> ile dinamik aral\u0131k s\u0131k\u0131\u015ft\u0131r\u0131labilir) en sonunda <code>AudioContext<\/code>&#8216;in hedef d\u00fc\u011f\u00fcm\u00fcne (genellikle hoparl\u00f6rler veya kulakl\u0131klar) ula\u015f\u0131r.<\/p>\n<p>Yerel ses kompres\u00f6r\u00fcm\u00fcz i\u00e7in en kritik d\u00fc\u011f\u00fcmlerden biri <code>DynamicsCompressorNode<\/code>&#8216;dur. Bu d\u00fc\u011f\u00fcm, ses sinyalinin dinamik aral\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in tasarlanm\u0131\u015ft\u0131r ve standart bir ses kompres\u00f6r\u00fcn\u00fcn t\u00fcm temel parametrelerini sunar: <code>threshold<\/code> (e\u015fik), <code>ratio<\/code> (oran), <code>attack<\/code> (sald\u0131r\u0131), <code>release<\/code> (b\u0131rakma) ve <code>knee<\/code> (diz). <code>Threshold<\/code>, sesin hangi seviyenin \u00fczerine \u00e7\u0131kt\u0131\u011f\u0131nda kompresyonun ba\u015flayaca\u011f\u0131n\u0131 belirler. <code>Ratio<\/code>, e\u015fi\u011fi a\u015fan ses seviyelerinin ne kadar s\u0131k\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 ifade eder; \u00f6rne\u011fin, 4:1 oran\u0131, e\u015fi\u011fi 4 dB a\u015fan bir sesin \u00e7\u0131k\u0131\u015fta sadece 1 dB a\u015fmas\u0131n\u0131 sa\u011flar. <code>Attack<\/code>, kompres\u00f6r\u00fcn e\u015fik a\u015f\u0131ld\u0131\u011f\u0131nda s\u0131k\u0131\u015ft\u0131rmaya ne kadar h\u0131zl\u0131 ba\u015flayaca\u011f\u0131n\u0131, <code>Release<\/code> ise ses e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde s\u0131k\u0131\u015ft\u0131rmay\u0131 ne kadar h\u0131zl\u0131 b\u0131rakaca\u011f\u0131n\u0131 kontrol eder. Bu parametreleri ayarlayarak, farkl\u0131 ses t\u00fcrleri ve dinleme senaryolar\u0131 i\u00e7in optimize edilmi\u015f kompresyon efektleri elde edebiliriz.<\/p>\n<p>Bir taray\u0131c\u0131 uzant\u0131s\u0131nda, Web Audio API&#8217;yi kullanarak bir sekmenin ses ak\u0131\u015f\u0131n\u0131 yakalamak i\u00e7in <code>chrome.tabCapture<\/code> API&#8217;sini veya <code>navigator.mediaDevices.getDisplayMedia()<\/code> (ekran payla\u015f\u0131m\u0131 i\u00e7in) ile elde edilen bir <code>MediaStream<\/code>&#8216;i kullanabiliriz. <code>chrome.tabCapture.capture()<\/code> metodunu kullanarak aktif sekmenin sesini bir <code>MediaStream<\/code> nesnesi olarak alabiliriz. Bu <code>MediaStream<\/code>, daha sonra bir <code>MediaStreamSourceNode<\/code> olarak <code>AudioContext<\/code>&#8216;e ba\u011flan\u0131r. Ard\u0131ndan, bu kaynak d\u00fc\u011f\u00fcmden gelen ses, <code>DynamicsCompressorNode<\/code>&#8216;a y\u00f6nlendirilir ve son olarak <code>AudioContext<\/code>&#8216;in hedef d\u00fc\u011f\u00fcm\u00fcne ba\u011flan\u0131r. Bu sayede, taray\u0131c\u0131da \u00e7al\u0131nan t\u00fcm sesler ger\u00e7ek zamanl\u0131 olarak kompres\u00f6rden ge\u00e7irilerek optimize edilir. Web Audio API&#8217;nin mod\u00fcler yap\u0131s\u0131, bu t\u00fcr karma\u015f\u0131k ses i\u015fleme zincirlerini kolayca kurmam\u0131za ve y\u00f6netmemize olanak tan\u0131r, b\u00f6ylece kullan\u0131c\u0131lara daha zengin ve kontrol edilebilir bir ses deneyimi sunabiliriz.<\/p>\n<h2>Taray\u0131c\u0131 Uzant\u0131s\u0131 Mimarisi ve \u0130zinler<\/h2>\n<p>Bir taray\u0131c\u0131 uzant\u0131s\u0131 geli\u015ftirmek, web uygulamalar\u0131ndan farkl\u0131 bir mimari anlay\u0131\u015f\u0131 gerektirir. Uzant\u0131lar, taray\u0131c\u0131ya entegre olan ve belirli yetkilere (izinlere) sahip olan k\u00fc\u00e7\u00fck yaz\u0131l\u0131m par\u00e7ac\u0131klar\u0131d\u0131r. Yerel bir ses kompres\u00f6r\u00fc uzant\u0131s\u0131 olu\u015fturmak i\u00e7in, bu mimarinin temel bile\u015fenlerini ve gerekli izinleri anlamak kritik \u00f6neme sahiptir. Uzant\u0131n\u0131n kalbi, <code>manifest.json<\/code> dosyas\u0131d\u0131r. Bu dosya, uzant\u0131n\u0131n meta verilerini (ad\u0131, s\u00fcr\u00fcm\u00fc, a\u00e7\u0131klamas\u0131), ikonlar\u0131n\u0131, izinlerini ve \u00e7e\u015fitli betiklerini tan\u0131mlar. Ses ak\u0131\u015f\u0131n\u0131 yakalamak ve i\u015flemek i\u00e7in do\u011fru izinlere sahip olmak, uzant\u0131m\u0131z\u0131n i\u015flevselli\u011fini sa\u011flaman\u0131n ilk ad\u0131m\u0131d\u0131r.<\/p>\n<p><code>manifest.json<\/code> dosyas\u0131nda belirtmemiz gereken temel izinler \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>\"activeTab\"<\/code>: Bu izin, kullan\u0131c\u0131n\u0131n aktif olarak bakt\u0131\u011f\u0131 sekme \u00fczerinde ge\u00e7ici olarak uzant\u0131n\u0131n \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. \u00d6zellikle <code>chrome.tabCapture<\/code> API&#8217;si ile ses yakalamak i\u00e7in gereklidir. Kullan\u0131c\u0131, uzant\u0131 ikonuna t\u0131klad\u0131\u011f\u0131nda veya bir k\u0131sayol kulland\u0131\u011f\u0131nda bu izin otomatik olarak verilir.<\/li>\n<li><code>\"scripting\"<\/code>: Bu izin, uzant\u0131m\u0131z\u0131n belirli web sayfalar\u0131na i\u00e7erik betikleri (<code>content scripts<\/code>) enjekte etmesine veya <code>chrome.scripting<\/code> API&#8217;sini kullanarak programatik olarak betikler \u00e7al\u0131\u015ft\u0131rmas\u0131na olanak tan\u0131r. Ses ak\u0131\u015f\u0131n\u0131 yakalama ve Web Audio API&#8217;yi ba\u015flatma gibi i\u015flemleri tetiklemek i\u00e7in kullan\u0131labilir.<\/li>\n<li><code>\"tabCapture\"<\/code>: Bu en kritik izinlerden biridir. <code>chrome.tabCapture<\/code> API&#8217;sini kullanarak aktif sekmenin sesini (veya videosunu) yakalamak i\u00e7in do\u011frudan bu izne ihtiyac\u0131m\u0131z vard\u0131r. Bu izin olmadan, taray\u0131c\u0131 sekmesinden ses ak\u0131\u015f\u0131 almam\u0131z m\u00fcmk\u00fcn olmaz.<\/li>\n<li><code>\"storage\"<\/code> (iste\u011fe ba\u011fl\u0131): Kullan\u0131c\u0131 ayarlar\u0131n\u0131 (\u00f6rne\u011fin, kompres\u00f6r parametreleri veya a\u00e7ma\/kapama durumu) kaydetmek i\u00e7in <code>chrome.storage<\/code> API&#8217;sini kullanmak istiyorsak bu izin gereklidir. Bu, kullan\u0131c\u0131 uzant\u0131y\u0131 her a\u00e7t\u0131\u011f\u0131nda ayarlar\u0131n korunmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Bir taray\u0131c\u0131 uzant\u0131s\u0131 genellikle \u00fc\u00e7 ana betik t\u00fcr\u00fcnden olu\u015fur:<\/p>\n<ol>\n<li><strong>Arka Plan Beti\u011fi (<code>background.js<\/code>)<\/strong>: Bu betik, uzant\u0131n\u0131n ana kontrol merkezidir. Taray\u0131c\u0131 a\u00e7\u0131ld\u0131\u011f\u0131nda veya uzant\u0131 y\u00fcklendi\u011finde \u00e7al\u0131\u015fmaya ba\u015flar ve uzant\u0131n\u0131n \u00f6mr\u00fc boyunca arka planda \u00e7al\u0131\u015fmaya devam eder. Di\u011fer uzant\u0131 bile\u015fenleri (popup, i\u00e7erik beti\u011fi) ile ileti\u015fim kurar, API \u00e7a\u011fr\u0131lar\u0131n\u0131 yapar ve olaylar\u0131 dinler (\u00f6rne\u011fin, uzant\u0131 ikonuna t\u0131klanmas\u0131, sekme de\u011fi\u015fimi). Ses yakalama ve Web Audio API&#8217;yi ba\u015flatma mant\u0131\u011f\u0131n\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131 burada yer alacakt\u0131r.<\/li>\n<li><strong>\u0130\u00e7erik Betikleri (<code>content.js<\/code>)<\/strong>: Bu betikler, web sayfalar\u0131n\u0131n i\u00e7eri\u011fine enjekte edilir ve do\u011frudan sayfan\u0131n DOM&#8217;u ile etkile\u015fime girebilir. Ancak, g\u00fcvenlik k\u0131s\u0131tlamalar\u0131 nedeniyle do\u011frudan uzant\u0131 API&#8217;lerine eri\u015femezler. Arka plan beti\u011fi ile mesajla\u015fma yoluyla ileti\u015fim kurarlar. Ses kompres\u00f6r\u00fc uzant\u0131m\u0131zda, do\u011frudan sayfan\u0131n sesini manip\u00fcle etmek yerine, arka plan beti\u011fi arac\u0131l\u0131\u011f\u0131yla t\u00fcm sekmenin sesini yakalayaca\u011f\u0131m\u0131z i\u00e7in i\u00e7erik beti\u011fine genellikle do\u011frudan bir ihtiyac\u0131m\u0131z olmayacakt\u0131r, ancak belirli bir sekmedeki bir medya elementini kontrol etmek gibi daha spesifik senaryolar i\u00e7in kullan\u0131labilir.<\/li>\n<li><strong>Kullan\u0131c\u0131 Aray\u00fcz\u00fc Beti\u011fi (<code>popup.js<\/code>)<\/strong>: Uzant\u0131 ikonuna t\u0131kland\u0131\u011f\u0131nda a\u00e7\u0131lan k\u00fc\u00e7\u00fck bir pencere olan popup (a\u00e7\u0131l\u0131r pencere) i\u00e7in kullan\u0131lan betiktir. Bu betik, <code>popup.html<\/code> dosyas\u0131ndaki HTML elementleri ile etkile\u015fime girer ve kullan\u0131c\u0131dan girdi al\u0131r (\u00f6rne\u011fin, kompres\u00f6r\u00fc a\u00e7ma\/kapama, parametreleri ayarlama). Bu betik de arka plan beti\u011fi ile mesajla\u015fma yoluyla ileti\u015fim kurarak ses i\u015fleme mant\u0131\u011f\u0131n\u0131 tetikler veya kontrol eder.<\/li>\n<\/ol>\n<p>Bu mimariyi do\u011fru bir \u015fekilde kurarak, uzant\u0131m\u0131z\u0131n hem g\u00fcvenli hem de i\u015flevsel olmas\u0131n\u0131 sa\u011flayabiliriz. \u0130zinlerin do\u011fru bir \u015fekilde tan\u0131mlanmas\u0131, uzant\u0131m\u0131z\u0131n taray\u0131c\u0131 taraf\u0131ndan g\u00fcvenilir kabul edilmesini ve gerekli API&#8217;lere eri\u015fimini garanti eder. \u00d6rne\u011fin, <code>manifest.json<\/code> dosyas\u0131n\u0131n temel yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibi olabilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\n{\n  \"manifest_version\": 3,\n  \"name\": \"Yerel Ses Kompres\u00f6r\u00fc\",\n  \"version\": \"1.0\",\n  \"description\": \"Taray\u0131c\u0131 sekmenizin sesini ger\u00e7ek zamanl\u0131 olarak s\u0131k\u0131\u015ft\u0131r\u0131r.\",\n  \"icons\": {\n    \"16\": \"icons\/icon16.png\",\n    \"48\": \"icons\/icon48.png\",\n    \"128\": \"icons\/icon128.png\"\n  },\n  \"background\": {\n    \"service_worker\": \"background.js\"\n  },\n  \"action\": {\n    \"default_popup\": \"popup.html\",\n    \"default_icon\": {\n      \"16\": \"icons\/icon16.png\",\n      \"48\": \"icons\/icon48.png\"\n    }\n  },\n  \"permissions\": [\n    \"activeTab\",\n    \"tabCapture\",\n    \"scripting\",\n    \"storage\"\n  ]\n}\n  <\/code><\/pre>\n<\/div>\n<p>Bu yap\u0131, uzant\u0131m\u0131z\u0131n temel ta\u015flar\u0131n\u0131 olu\u015fturur ve ses kompres\u00f6r\u00fcm\u00fcz\u00fc taray\u0131c\u0131 ortam\u0131nda hayata ge\u00e7irmemiz i\u00e7in sa\u011flam bir temel sunar. \u015eimdi, bu temel \u00fczerine in\u015fa ederek ses kompres\u00f6r\u00fcn\u00fc nas\u0131l entegre edece\u011fimize ge\u00e7ebiliriz.<\/p>\n<h2>Yerel Ses Kompres\u00f6r\u00fcn\u00fc Entegre Etme Ad\u0131mlar\u0131<\/h2>\n<p>Taray\u0131c\u0131 uzant\u0131m\u0131z\u0131n mimarisini anlad\u0131ktan ve gerekli izinleri belirledikten sonra, art\u0131k yerel ses kompres\u00f6r\u00fcn\u00fc entegre etmenin teknik ad\u0131mlar\u0131na odaklanabiliriz. Bu s\u00fcre\u00e7, aktif sekmenin ses ak\u0131\u015f\u0131n\u0131 yakalamay\u0131, bu ak\u0131\u015f\u0131 Web Audio API kullanarak bir <code>DynamicsCompressorNode<\/code>&#8216;dan ge\u00e7irmeyi ve son olarak i\u015flenmi\u015f sesi taray\u0131c\u0131n\u0131n ses \u00e7\u0131k\u0131\u015f\u0131na y\u00f6nlendirmeyi i\u00e7erir. T\u00fcm bu i\u015flemler, uzant\u0131m\u0131z\u0131n arka plan beti\u011finde (<code>background.js<\/code>) ger\u00e7ekle\u015fecektir.<\/p>\n<p><strong>1. Ses Ak\u0131\u015f\u0131n\u0131 Yakalama: Sekme Sesini Nas\u0131l Ele Ge\u00e7iririz?<\/strong><\/p>\n<p>Aktif sekmenin sesini yakalamak i\u00e7in <code>chrome.tabCapture.capture()<\/code> API&#8217;sini kullan\u0131r\u0131z. Bu metod, bir <code>MediaStream<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr ki bu da Web Audio API i\u00e7in bir giri\u015f kayna\u011f\u0131 olarak kullan\u0131labilir. Bu i\u015flem genellikle kullan\u0131c\u0131 uzant\u0131 ikonuna t\u0131klad\u0131\u011f\u0131nda veya popup&#8217;ta bir &#8220;Ba\u015flat&#8221; d\u00fc\u011fmesine bast\u0131\u011f\u0131nda tetiklenir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ background.js\nlet audioContext;\nlet compressorNode;\nlet mediaStreamSource;\nlet audioStream;\n\nasync function startCompressor() {\n  const currentTab = await getCurrentTab(); \/\/ Yard\u0131mc\u0131 fonksiyon: aktif sekmeyi bulur\n  if (!currentTab) return;\n\n  try {\n    \/\/ Aktif sekmenin ses ak\u0131\u015f\u0131n\u0131 yakala\n    audioStream = await chrome.tabCapture.capture({\n      audio: true\n    });\n\n    if (!audioStream) {\n      console.error(\"Ses ak\u0131\u015f\u0131 yakalanamad\u0131.\");\n      return;\n    }\n\n    \/\/ Web Audio API ba\u011flam\u0131n\u0131 olu\u015ftur\n    audioContext = new AudioContext();\n    mediaStreamSource = audioContext.createMediaStreamSource(audioStream);\n\n    \/\/ DynamicsCompressorNode olu\u015ftur\n    compressorNode = audioContext.createDynamicsCompressor();\n    \/\/ Varsay\u0131lan kompres\u00f6r ayarlar\u0131\n    compressorNode.threshold.setValueAtTime(-24, audioContext.currentTime); \/\/ dB\n    compressorNode.knee.setValueAtTime(30, audioContext.currentTime);     \/\/ dB\n    compressorNode.ratio.setValueAtTime(12, audioContext.currentTime);     \/\/ :1\n    compressorNode.attack.setValueAtTime(0.003, audioContext.currentTime); \/\/ seconds\n    compressorNode.release.setValueAtTime(0.25, audioContext.currentTime); \/\/ seconds\n\n    \/\/ D\u00fc\u011f\u00fcmleri birbirine ba\u011fla: Kaynak -> Kompres\u00f6r -> Hedef (hoparl\u00f6rler)\n    mediaStreamSource.connect(compressorNode);\n    compressorNode.connect(audioContext.destination);\n\n    console.log(\"Ses kompres\u00f6r\u00fc ba\u015flat\u0131ld\u0131.\");\n  } catch (error) {\n    console.error(\"Kompres\u00f6r ba\u015flat\u0131l\u0131rken hata olu\u015ftu:\", error);\n  }\n}\n\nfunction stopCompressor() {\n  if (audioContext) {\n    audioContext.close();\n    audioContext = null;\n  }\n  if (audioStream) {\n    audioStream.getTracks().forEach(track => track.stop());\n    audioStream = null;\n  }\n  console.log(\"Ses kompres\u00f6r\u00fc durduruldu.\");\n}\n\n\/\/ getCurrentTab yard\u0131mc\u0131 fonksiyonu\nasync function getCurrentTab() {\n  let [tab] = await chrome.tabs.query({\n    active: true,\n    lastFocusedWindow: true\n  });\n  return tab;\n}\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funda, <code>startCompressor<\/code> fonksiyonu, aktif sekmenin sesini yakalar ve bir <code>MediaStreamSourceNode<\/code> olarak <code>AudioContext<\/code>&#8216;e ba\u011flar. Ard\u0131ndan, bir <code>DynamicsCompressorNode<\/code> olu\u015fturulur ve ses ak\u0131\u015f\u0131 bu kompres\u00f6rden ge\u00e7irilerek son olarak <code>audioContext.destination<\/code>&#8216;a, yani taray\u0131c\u0131n\u0131n ses \u00e7\u0131k\u0131\u015f\u0131na y\u00f6nlendirilir. <code>stopCompressor<\/code> fonksiyonu ise t\u00fcm ses ba\u011flam\u0131n\u0131 ve ak\u0131\u015f\u0131 kapatarak kaynaklar\u0131 serbest b\u0131rak\u0131r.<\/p>\n<p><strong>2. Kompres\u00f6r Parametrelerini Anlama ve Ayarlama:<\/strong><\/p>\n<p><code>DynamicsCompressorNode<\/code>&#8216;un parametreleri, sesin nas\u0131l s\u0131k\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 belirler. Bu parametrelerin do\u011fru anla\u015f\u0131lmas\u0131 ve ayarlanmas\u0131, istenen ses kalitesini elde etmek i\u00e7in hayati \u00f6neme sahiptir:<\/p>\n<ul>\n<li><code>threshold<\/code> (E\u015fik): Ses seviyesinin hangi noktas\u0131n\u0131n \u00fczerinde kompresyonun ba\u015flayaca\u011f\u0131n\u0131 belirler. Genellikle -10 dB ile -50 dB aras\u0131nda bir de\u011fer al\u0131r. Daha d\u00fc\u015f\u00fck bir e\u015fik, daha fazla sesin s\u0131k\u0131\u015ft\u0131r\u0131laca\u011f\u0131 anlam\u0131na gelir.<\/li>\n<li><code>knee<\/code> (Diz): Kompresyonun e\u015fik \u00e7evresinde ne kadar yumu\u015fak veya sert ba\u015flayaca\u011f\u0131n\u0131 belirler. Y\u00fcksek bir diz de\u011feri, kompresyonun e\u015fi\u011fe yakla\u015f\u0131rken daha kademeli olarak ba\u015flamas\u0131n\u0131 sa\u011flar ve daha do\u011fal bir ses elde edilmesine yard\u0131mc\u0131 olur.<\/li>\n<li><code>ratio<\/code> (Oran): E\u015fi\u011fi a\u015fan ses seviyelerinin ne kadar s\u0131k\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 belirler. \u00d6rne\u011fin, 4:1 oran\u0131, e\u015fi\u011fi 4 dB a\u015fan bir sinyalin \u00e7\u0131k\u0131\u015fta sadece 1 dB a\u015faca\u011f\u0131 anlam\u0131na gelir. Daha y\u00fcksek bir oran, daha agresif bir kompresyona yol a\u00e7ar.<\/li>\n<li><code>attack<\/code> (Sald\u0131r\u0131): Ses seviyesi e\u015fi\u011fi a\u015ft\u0131\u011f\u0131nda kompres\u00f6r\u00fcn s\u0131k\u0131\u015ft\u0131rmaya ne kadar h\u0131zl\u0131 ba\u015flayaca\u011f\u0131n\u0131 belirler. K\u0131sa bir sald\u0131r\u0131 s\u00fcresi (ms cinsinden), ani y\u00fckseli\u015fleri h\u0131zla kontrol alt\u0131na al\u0131r.<\/li>\n<li><code>release<\/code> (B\u0131rakma): Ses seviyesi e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde kompres\u00f6r\u00fcn s\u0131k\u0131\u015ft\u0131rmay\u0131 ne kadar h\u0131zl\u0131 b\u0131rakaca\u011f\u0131n\u0131 belirler. Uzun bir b\u0131rakma s\u00fcresi, ses seviyesindeki ani d\u00fc\u015f\u00fc\u015flerde kompres\u00f6r\u00fcn yava\u015f\u00e7a devre d\u0131\u015f\u0131 kalmas\u0131n\u0131 sa\u011flar, bu da daha p\u00fcr\u00fczs\u00fcz bir ses ge\u00e7i\u015fi sunar.<\/li>\n<li><code>reduction<\/code> (Azaltma &#8211; salt okunur): Kompres\u00f6r\u00fcn o anki ses sinyaline uygulad\u0131\u011f\u0131 kazan\u00e7 azaltma miktar\u0131n\u0131 g\u00f6sterir.<\/li>\n<\/ul>\n<p>Bu parametrelerin de\u011ferlerini, dinlenen i\u00e7eri\u011fe ve kullan\u0131c\u0131n\u0131n tercihine g\u00f6re dinamik olarak de\u011fi\u015ftirebiliriz. \u00d6rne\u011fin, konu\u015fma a\u011f\u0131rl\u0131kl\u0131 i\u00e7erikler i\u00e7in farkl\u0131, m\u00fczik i\u00e7in farkl\u0131 \u00f6n ayarlar sunabiliriz. Kullan\u0131c\u0131 aray\u00fcz\u00fcm\u00fczde (popup.html ve popup.js) bu parametreleri kontrol eden kayd\u0131r\u0131c\u0131lar (sliders) veya d\u00fc\u011fmeler olu\u015fturarak, kullan\u0131c\u0131lar\u0131n kendi tercih ettikleri ses deneyimini olu\u015fturmalar\u0131na olanak tan\u0131yabiliriz.<\/p>\n<h2>Geli\u015fmi\u015f Kompres\u00f6r Ayarlar\u0131 ve Kullan\u0131c\u0131 Deneyimi<\/h2>\n<p>Yerel ses kompres\u00f6r\u00fc uzant\u0131m\u0131z\u0131 temel d\u00fczeyde \u00e7al\u0131\u015f\u0131r hale getirdikten sonra, kullan\u0131c\u0131 deneyimini zenginle\u015ftirmek ve uzant\u0131n\u0131n i\u015flevselli\u011fini art\u0131rmak i\u00e7in geli\u015fmi\u015f ayarlara ve optimizasyonlara odaklanabiliriz. Kullan\u0131c\u0131lar\u0131n farkl\u0131 ihtiya\u00e7lar\u0131na cevap verebilen ve taray\u0131c\u0131 performans\u0131n\u0131 olumsuz etkilemeyen bir uzant\u0131 sunmak, ba\u015far\u0131n\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>Farkl\u0131 Senaryolar \u0130\u00e7in \u00d6n Ayarlar: M\u00fczik, Konu\u015fma, Film<\/h3>\n<p>Ses kompres\u00f6r\u00fcn\u00fcn optimum ayarlar\u0131, i\u015flenen sesin t\u00fcr\u00fcne g\u00f6re b\u00fcy\u00fck \u00f6l\u00e7\u00fcde de\u011fi\u015fir. \u00d6rne\u011fin, bir podcast&#8217;teki konu\u015fma sesini s\u0131k\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lacak ayarlar, dinamik bir film m\u00fczi\u011fi veya y\u00fcksek enerjili bir m\u00fczik par\u00e7as\u0131 i\u00e7in uygun olmayabilir. Kullan\u0131c\u0131lara, farkl\u0131 medya t\u00fcrleri i\u00e7in \u00f6nceden tan\u0131mlanm\u0131\u015f ayar profilleri sunarak, manuel ayarlama zahmetinden kurtarabilir ve en iyi dinleme deneyimini kolayca se\u00e7melerini sa\u011flayabiliriz.<\/p>\n<ul>\n<li><strong>Konu\u015fma Profili (Podcast, Haber)<\/strong>: Konu\u015fma anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Genellikle daha d\u00fc\u015f\u00fck bir <code>threshold<\/code> (\u00f6rne\u011fin, -30 dB), daha y\u00fcksek bir <code>ratio<\/code> (\u00f6rne\u011fin, 8:1 veya daha y\u00fcksek) ve daha h\u0131zl\u0131 <code>attack<\/code> (\u00f6rne\u011fin, 1-5 ms) ve <code>release<\/code> (\u00f6rne\u011fin, 50-100 ms) s\u00fcreleri kullan\u0131r\u0131z. Bu, f\u0131s\u0131lt\u0131lar\u0131 y\u00fckseltirken ani ses patlamalar\u0131n\u0131 (\u00f6ks\u00fcr\u00fck, kahkaha) kontrol alt\u0131nda tutar.<\/li>\n<li><strong>M\u00fczik Profili (Dinamik)<\/strong>: M\u00fczikteki dinamik aral\u0131\u011f\u0131 korurken genel ses seviyesini dengelemek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Orta d\u00fczeyde bir <code>threshold<\/code> (\u00f6rne\u011fin, -20 dB), orta bir <code>ratio<\/code> (\u00f6rne\u011fin, 3:1 &#8211; 5:1), orta <code>attack<\/code> (\u00f6rne\u011fin, 10-30 ms) ve <code>release<\/code> (\u00f6rne\u011fin, 100-300 ms) s\u00fcreleri tercih edilebilir. Bu, m\u00fczi\u011fin enerjisini korurken genel ses seviyesini daha tutarl\u0131 hale getirir.<\/li>\n<li><strong>Film\/Oyun Profili<\/strong>: Diyaloglar\u0131 netle\u015ftirirken patlamalar gibi y\u00fcksek sesli efektleri kontrol alt\u0131nda tutar. Konu\u015fma profilinden biraz daha az agresif, m\u00fczik profilinden daha dinamik olabilir. \u00d6rne\u011fin, <code>threshold<\/code> -25 dB, <code>ratio<\/code> 6:1, <code>attack<\/code> 5-10 ms, <code>release<\/code> 150-250 ms gibi ayarlar kullan\u0131labilir.<\/li>\n<\/ul>\n<p>Bu \u00f6n ayarlar\u0131, <code>chrome.storage.local<\/code> kullanarak kaydedebilir ve kullan\u0131c\u0131 aray\u00fcz\u00fcnde bir a\u00e7\u0131l\u0131r men\u00fc (dropdown) ile se\u00e7ilebilir hale getirebiliriz. Kullan\u0131c\u0131 bir \u00f6n ayar\u0131 se\u00e7ti\u011finde, arka plan beti\u011findeki kompres\u00f6r d\u00fc\u011f\u00fcm\u00fcn\u00fcn parametreleri buna g\u00f6re g\u00fcncellenir.<\/p>\n<h3>Kullan\u0131c\u0131 Aray\u00fcz\u00fc \u00dczerinden Ayarlar\u0131 Kontrol Etme: Sliderlar ve Butonlar<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n kompres\u00f6r parametrelerini ger\u00e7ek zamanl\u0131 olarak ayarlayabilmesi, uzant\u0131n\u0131n kullan\u0131labilirli\u011fini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r. <code>popup.html<\/code> dosyam\u0131zda HTML kayd\u0131r\u0131c\u0131lar\u0131 (<code>&lt;input type=\"range\"&gt;<\/code>) ve d\u00fc\u011fmeler (<code>&lt;button&gt;<\/code>) kullanarak bir kontrol paneli olu\u015fturabiliriz. <code>popup.js<\/code> beti\u011fi, bu kontrollerden gelen de\u011fi\u015fiklikleri yakalayacak ve <code>chrome.runtime.sendMessage<\/code> API&#8217;si arac\u0131l\u0131\u011f\u0131yla arka plan beti\u011fine iletecektir. Arka plan beti\u011fi de bu mesajlar\u0131 dinleyerek <code>DynamicsCompressorNode<\/code>&#8216;un parametrelerini g\u00fcncelleyecektir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ popup.html (\u00d6rnek)\n&lt;div&gt;\n  &lt;label for=\"threshold\"&gt;E\u015fik (Threshold):&lt;\/label&gt;\n  &lt;input type=\"range\" id=\"threshold\" min=\"-60\" max=\"0\" value=\"-24\"&gt;\n  &lt;span id=\"thresholdValue\"&gt;-24 dB&lt;\/span&gt;\n&lt;\/div&gt;\n&lt;div&gt;\n  &lt;label for=\"ratio\"&gt;Oran (Ratio):&lt;\/label&gt;\n  &lt;input type=\"range\" id=\"ratio\" min=\"1\" max=\"20\" value=\"12\"&gt;\n  &lt;span id=\"ratioValue\"&gt;12:1&lt;\/span&gt;\n&lt;\/div&gt;\n&lt;button id=\"toggleCompressor\"&gt;Kompres\u00f6r\u00fc Ba\u015flat\/Durdur&lt;\/button&gt;\n  <\/code><\/pre>\n<\/div>\n<div class=\"code-container\">\n<pre><code>\n\/\/ popup.js (\u00d6rnek)\ndocument.addEventListener('DOMContentLoaded', () => {\n  const thresholdSlider = document.getElementById('threshold');\n  const ratioSlider = document.getElementById('ratio');\n  const toggleButton = document.getElementById('toggleCompressor');\n\n  \/\/ Kayd\u0131r\u0131c\u0131 de\u011ferleri de\u011fi\u015fti\u011finde arka plan beti\u011fine mesaj g\u00f6nder\n  thresholdSlider.addEventListener('input', (event) => {\n    const value = parseFloat(event.target.value);\n    document.getElementById('thresholdValue').textContent = <code>${value} dB<\/code>;\n    chrome.runtime.sendMessage({\n      type: \"updateCompressor\",\n      param: \"threshold\",\n      value: value\n    });\n  });\n\n  ratioSlider.addEventListener('input', (event) => {\n    const value = parseFloat(event.target.value);\n    document.getElementById('ratioValue').textContent = <code>${value}:1<\/code>;\n    chrome.runtime.sendMessage({\n      type: \"updateCompressor\",\n      param: \"ratio\",\n      value: value\n    });\n  });\n\n  toggleButton.addEventListener('click', () => {\n    \/\/ Kompres\u00f6r durumunu de\u011fi\u015ftirmek i\u00e7in arka plan beti\u011fine mesaj g\u00f6nder\n    chrome.runtime.sendMessage({\n      type: \"toggleCompressor\"\n    });\n  });\n\n  \/\/ Arka plan beti\u011finden gelen mesajlar\u0131 dinleyerek UI'y\u0131 g\u00fcncelle (iste\u011fe ba\u011fl\u0131)\n  chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {\n    if (request.type === \"compressorStatus\") {\n      toggleButton.textContent = request.isActive ? \"Kompres\u00f6r\u00fc Durdur\" : \"Kompres\u00f6r\u00fc Ba\u015flat\";\n    }\n  });\n\n  \/\/ Ba\u015flang\u0131\u00e7ta mevcut durumu arka plan beti\u011finden al\n  chrome.runtime.sendMessage({\n    type: \"getCompressorStatus\"\n  });\n});\n  <\/code><\/pre>\n<\/div>\n<p>Arka plan beti\u011finde ise bu mesajlar\u0131 dinleyen bir mekanizma olmal\u0131d\u0131r:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ background.js (devam\u0131)\nchrome.runtime.onMessage.addListener((request, sender, sendResponse) => {\n  if (request.type === \"updateCompressor\" && compressorNode) {\n    if (request.param === \"threshold\") {\n      compressorNode.threshold.setValueAtTime(request.value, audioContext.currentTime);\n    } else if (request.param === \"ratio\") {\n      compressorNode.ratio.setValueAtTime(request.value, audioContext.currentTime);\n    }\n    \/\/ Di\u011fer parametreler i\u00e7in de benzer \u015fekilde eklenebilir\n  } else if (request.type === \"toggleCompressor\") {\n    if (audioContext && audioContext.state === 'running') {\n      stopCompressor();\n    } else {\n      startCompressor();\n    }\n    sendResponse({\n      isActive: audioContext && audioContext.state === 'running'\n    });\n  } else if (request.type === \"getCompressorStatus\") {\n    sendResponse({\n      isActive: audioContext && audioContext.state === 'running'\n    });\n  }\n});\n  <\/code><\/pre>\n<\/div>\n<h3>Performans Optimizasyonu: CPU Kullan\u0131m\u0131n\u0131 D\u00fc\u015f\u00fcrme Y\u00f6ntemleri<\/h3>\n<p>Ger\u00e7ek zamanl\u0131 ses i\u015fleme, \u00f6zellikle uzun s\u00fcreli kullan\u0131mlarda CPU kaynaklar\u0131n\u0131 t\u00fcketebilir. Uzant\u0131m\u0131z\u0131n taray\u0131c\u0131y\u0131 yava\u015flatmas\u0131n\u0131 \u00f6nlemek i\u00e7in baz\u0131 optimizasyonlar yapmal\u0131y\u0131z:<\/p>\n<ul>\n<li><strong>Yaln\u0131zca Gerekliyken \u00c7al\u0131\u015ft\u0131r<\/strong>: Kompres\u00f6r\u00fc yaln\u0131zca kullan\u0131c\u0131 aktif olarak bir sekmede medya t\u00fcketirken veya \u00f6zellikle etkinle\u015ftirdi\u011finde \u00e7al\u0131\u015ft\u0131r\u0131n. Sekme de\u011fi\u015fti\u011finde veya medya duraklat\u0131ld\u0131\u011f\u0131nda kompres\u00f6r\u00fc durdurmak (<code>stopCompressor()<\/code> fonksiyonu ile) \u00f6nemli \u00f6l\u00e7\u00fcde kaynak tasarrufu sa\u011flar.<\/li>\n<li><strong>AudioContext&#8217;i Kapatma<\/strong>: <code>audioContext.close()<\/code> metodunu kullanarak AudioContext&#8217;i tamamen kapatmak, t\u00fcm ses i\u015fleme zincirini durdurur ve CPU y\u00fck\u00fcn\u00fc s\u0131f\u0131ra indirir. Sadece <code>suspend()<\/code> ve <code>resume()<\/code> kullanmak yerine tamamen kapat\u0131p yeniden ba\u015flatmak daha etkilidir.<\/li>\n<li><strong>Minimum D\u00fc\u011f\u00fcm Kullan\u0131m\u0131<\/strong>: Ses i\u015fleme grafi\u011finde gereksiz d\u00fc\u011f\u00fcmlerden ka\u00e7\u0131n\u0131n. Her d\u00fc\u011f\u00fcm, bir miktar i\u015flem g\u00fcc\u00fc gerektirir.<\/li>\n<li><strong>D\u00fc\u015f\u00fck \u00d6rnekleme H\u0131z\u0131 (\u0130leri D\u00fczey)<\/strong>: \u00c7ok ileri d\u00fczey senaryolarda, e\u011fer ses kalitesinden \u00e7ok hafif \u00f6d\u00fcn verilebilirse, <code>AudioContext<\/code> olu\u015fturulurken daha d\u00fc\u015f\u00fck bir \u00f6rnekleme h\u0131z\u0131 (<code>sampleRate<\/code>) belirtilebilir, ancak bu \u00e7o\u011fu durumda \u00f6nerilmez ve varsay\u0131lan de\u011ferler genellikle yeterlidir.<\/li>\n<\/ul>\n<h3>Hata Y\u00f6netimi ve Kullan\u0131c\u0131ya Geri Bildirim<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n uzant\u0131n\u0131n durumu hakk\u0131nda bilgi sahibi olmas\u0131 ve olas\u0131 hatalarda y\u00f6nlendirilmesi \u00f6nemlidir. Popup&#8217;ta bir durum mesaj\u0131 (\u00f6rne\u011fin, &#8220;Kompres\u00f6r Aktif&#8221;, &#8220;Hata: Ses yakalanamad\u0131&#8221;) g\u00f6sterebiliriz. Ayr\u0131ca, <code>try...catch<\/code> bloklar\u0131 kullanarak API \u00e7a\u011fr\u0131lar\u0131ndaki hatalar\u0131 yakalamak ve bunlar\u0131 kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r bir dille sunmak, kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/p>\n<p>Bu geli\u015fmi\u015f ayarlamalar ve optimizasyonlar, yerel ses kompres\u00f6r\u00fc uzant\u0131m\u0131z\u0131 sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131 dostu ve performansa duyarl\u0131 bir ara\u00e7 haline getirecektir. Kullan\u0131c\u0131lar, kendi dinleme tercihlerine g\u00f6re sesi \u00f6zelle\u015ftirme yetene\u011fi sayesinde daha zengin ve ki\u015fiselle\u015ftirilmi\u015f bir web deneyimi ya\u015fayacaklard\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, taray\u0131c\u0131 uzant\u0131s\u0131na yerel bir ses kompres\u00f6r\u00fc entegre etmenin inceliklerini derinlemesine inceledik. Web&#8217;deki ses seviyesi tutars\u0131zl\u0131klar\u0131 gibi yayg\u0131n bir sorundan yola \u00e7\u0131karak, Web Audio API&#8217;nin g\u00fcc\u00fcn\u00fc ve taray\u0131c\u0131 uzant\u0131s\u0131 mimarisinin esnekli\u011fini kullanarak bu soruna nas\u0131l etkili bir \u00e7\u00f6z\u00fcm sunabilece\u011fimizi g\u00f6rd\u00fck. <code>DynamicsCompressorNode<\/code>&#8216;un parametrelerini anlamak ve bunlar\u0131 do\u011fru bir \u015fekilde ayarlamak, dinleme deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Uzant\u0131m\u0131z\u0131n geli\u015ftirme s\u00fcrecinde, <code>manifest.json<\/code> dosyas\u0131nda gerekli izinleri (\u00f6zellikle <code>activeTab<\/code> ve <code>tabCapture<\/code>) tan\u0131mlaman\u0131n, arka plan beti\u011fi, popup ve i\u00e7erik betikleri aras\u0131ndaki ileti\u015fimi kurman\u0131n temel ad\u0131mlar oldu\u011funu vurgulad\u0131k. Aktif sekmenin ses ak\u0131\u015f\u0131n\u0131 yakalama, Web Audio API ile bir ses i\u015fleme grafi\u011fi olu\u015fturma ve kompres\u00f6r parametrelerini dinamik olarak kontrol etme yetene\u011fi, uzant\u0131m\u0131z\u0131n temel i\u015flevselli\u011fini olu\u015fturur. Ayr\u0131ca, farkl\u0131 medya t\u00fcrleri i\u00e7in \u00f6n ayarlar sunarak ve kullan\u0131c\u0131 aray\u00fcz\u00fc \u00fczerinden kolay kontrol sa\u011flayarak kullan\u0131c\u0131 deneyimini zenginle\u015ftirme yollar\u0131n\u0131 ke\u015ffettik. Performans optimizasyonu teknikleri, uzant\u0131m\u0131z\u0131n taray\u0131c\u0131 kaynaklar\u0131n\u0131 verimli kullanmas\u0131n\u0131 sa\u011flayarak sorunsuz bir deneyim sunmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<p>Geli\u015ftirdi\u011fimiz bu yerel ses kompres\u00f6r\u00fc uzant\u0131s\u0131, sadece teknik bir ba\u015far\u0131 de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n g\u00fcnl\u00fck web deneyimlerini daha konforlu ve keyifli hale getiren pratik bir ara\u00e7t\u0131r. Gelecekte, uzant\u0131ya ek kazan\u00e7 (gain) kontrol\u00fc, g\u00f6rsel bir ses seviyesi g\u00f6stergesi (VU metre) veya farkl\u0131 kompres\u00f6r algoritmalar\u0131 gibi daha geli\u015fmi\u015f \u00f6zellikler ekleyerek yeteneklerini geni\u015fletmek m\u00fcmk\u00fcnd\u00fcr. Web Audio API ve taray\u0131c\u0131 uzant\u0131lar\u0131, web geli\u015ftiricilerine ses ve multimedya alan\u0131nda s\u0131n\u0131rs\u0131z yarat\u0131c\u0131l\u0131k potansiyeli sunmaktad\u0131r. Bu rehberin, kendi ses i\u015fleme uzant\u0131lar\u0131n\u0131z\u0131 geli\u015ftirmek i\u00e7in size ilham vermesini umuyoruz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p><strong>1. Bu uzant\u0131 gizlili\u011fi nas\u0131l etkiler?<\/strong><\/p>\n<p>Bu uzant\u0131, yaln\u0131zca aktif sekmenizin ses ak\u0131\u015f\u0131n\u0131 yerel olarak yakalar ve i\u015fler. Ses verileri hi\u00e7bir zaman d\u0131\u015far\u0131ya (bir sunucuya veya \u00fc\u00e7\u00fcnc\u00fc tarafa) g\u00f6nderilmez veya kaydedilmez. T\u00fcm i\u015fleme taray\u0131c\u0131n\u0131z\u0131n i\u00e7inde ger\u00e7ekle\u015fir, bu nedenle gizlilik a\u00e7\u0131s\u0131ndan g\u00fcvenlidir. <code>tabCapture<\/code> izni, sadece uzant\u0131n\u0131n ba\u015flat\u0131ld\u0131\u011f\u0131 anda ve sizin onay\u0131n\u0131zla ses yakalamas\u0131na izin verir.<\/p>\n<p><strong>2. T\u00fcm web sitelerinde \u00e7al\u0131\u015f\u0131r m\u0131?<\/strong><\/p>\n<p>Evet, uzant\u0131 aktif sekmenizin ses \u00e7\u0131k\u0131\u015f\u0131n\u0131 yakalad\u0131\u011f\u0131 i\u00e7in, o sekmede \u00e7al\u0131nan herhangi bir ses \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu, YouTube, Spotify, Netflix veya herhangi bir medya oynat\u0131c\u0131 i\u00e7eren web sitesi olabilir. Ancak, baz\u0131 \u00f6zel korumal\u0131 i\u00e7eriklerde (\u00f6rne\u011fin, DRM korumal\u0131 ak\u0131\u015flar) taray\u0131c\u0131 g\u00fcvenlik politikalar\u0131 nedeniyle ses yakalama k\u0131s\u0131tlanabilir, ancak bu \u00e7ok nadir bir durumdur.<\/p>\n<p><strong>3. Ses gecikmesine (latency) neden olur mu?<\/strong><\/p>\n<p>Web Audio API, d\u00fc\u015f\u00fck gecikmeli ses i\u015fleme i\u00e7in tasarlanm\u0131\u015ft\u0131r. \u00c7o\u011fu modern taray\u0131c\u0131da, bu t\u00fcr bir yerel kompresyonun neden oldu\u011fu gecikme (latency) o kadar d\u00fc\u015f\u00fckt\u00fcr ki, insan kula\u011f\u0131 taraf\u0131ndan fark edilmesi pek olas\u0131 de\u011fildir. Genellikle milisaniyeler d\u00fczeyindedir. Ancak, \u00e7ok eski veya d\u00fc\u015f\u00fck performansl\u0131 donan\u0131mlarda minimal bir gecikme ya\u015fanabilir.<\/p>\n<p><strong>4. Uzant\u0131n\u0131n performans\u0131 taray\u0131c\u0131y\u0131 yava\u015flat\u0131r m\u0131?<\/strong><\/p>\n<p>Uzant\u0131, ses i\u015fleme i\u00e7in belirli bir miktar CPU kayna\u011f\u0131 kullan\u0131r. Ancak, makalede belirtilen optimizasyonlar (yaln\u0131zca gerekti\u011finde \u00e7al\u0131\u015ft\u0131rma, AudioContext&#8217;i kapatma vb.) uyguland\u0131\u011f\u0131nda, performans etkisi genellikle minimaldir. Modern i\u015flemciler, ger\u00e7ek zamanl\u0131 ses i\u015flemeyi kolayca kald\u0131rabilir. Y\u00fcksek CPU kullan\u0131m\u0131 ancak \u00e7ok say\u0131da sekme a\u00e7\u0131kken ve hepsi medya oynat\u0131rken veya uzant\u0131 s\u00fcrekli aktif b\u0131rak\u0131ld\u0131\u011f\u0131nda fark edilebilir.<\/p>\n<p><strong>5. Farkl\u0131 kompres\u00f6r algoritmalar\u0131 eklenebilir mi?<\/strong><\/p>\n<p>Web Audio API&#8217;nin yerle\u015fik <code>DynamicsCompressorNode<\/code>&#8216;u standart bir kompresyon algoritmas\u0131 sunar. Ancak, e\u011fer daha farkl\u0131 veya \u00f6zel kompresyon algoritmalar\u0131 uygulamak isterseniz, <code>AudioWorklet<\/code> API&#8217;sini kullanarak kendi \u00f6zel ses i\u015fleme kodunuzu (WebAssembly veya JavaScript ile) yazabilir ve Web Audio grafi\u011fine entegre edebilirsiniz. Bu, daha ileri d\u00fczey bir konudur ve daha karma\u015f\u0131k ses m\u00fchendisli\u011fi bilgisi gerektirir.<\/p>\n<p>#Teknoloji #WebGeli\u015ftirme #Ses\u0130\u015fleme #Taray\u0131c\u0131Uzant\u0131s\u0131 #WebAudioAPI<\/p>\n","protected":false},"excerpt":{"rendered":"Web&#8217;de gezinirken ses seviyelerindeki tutars\u0131zl\u0131klar, aniden y\u00fckselen reklam sesleri veya f\u0131s\u0131lt\u0131 gibi kalan diyaloglar \u00e7o\u011fu zaman can s\u0131k\u0131c\u0131 olabilir.","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":[1],"tags":[],"class_list":{"0":"post-42449","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir? - 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\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?\" \/>\n<meta property=\"og:description\" content=\"Web&#039;de gezinirken ses seviyelerindeki tutars\u0131zl\u0131klar, aniden y\u00fckselen reklam sesleri veya f\u0131s\u0131lt\u0131 gibi kalan diyaloglar \u00e7o\u011fu zaman can s\u0131k\u0131c\u0131 olabilir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-10T18:15:13+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=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?\",\"datePublished\":\"2026-06-10T18:15:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/\"},\"wordCount\":4004,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/\",\"name\":\"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-10T18:15:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?\"}]},{\"@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":"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir? - 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\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/","og_locale":"tr_TR","og_type":"article","og_title":"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?","og_description":"Web'de gezinirken ses seviyelerindeki tutars\u0131zl\u0131klar, aniden y\u00fckselen reklam sesleri veya f\u0131s\u0131lt\u0131 gibi kalan diyaloglar \u00e7o\u011fu zaman can s\u0131k\u0131c\u0131 olabilir.","og_url":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-10T18:15:13+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?","datePublished":"2026-06-10T18:15:13+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/"},"wordCount":4004,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/","url":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/","name":"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-10T18:15:13+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-uzantiniza-yerel-bir-ses-kompresoru-nasil-eklenir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Taray\u0131c\u0131 Uzant\u0131n\u0131za Yerel Bir Ses Kompres\u00f6r\u00fc Nas\u0131l Eklenir?"}]},{"@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\/42449","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=42449"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42449\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}