A phone call in the middle of a dictation left two choices: send what was said so far off to be transcribed, or throw it away. Both end the sentence you were in the middle of. Now the recording can be held: the microphone stays ours, what was said before the pause stays in the buffer, and what is said during it is dropped. The capture program keeps running and keeps handing blocks over, which are read and thrown away rather than left in the pipe. Stopping it instead would mean asking the sound server for the device again on the way back, and that is the one moment another application can take it: a recording would be lost to the phone call it was paused for. The clock stops with it. Paused time is time the recording does not have, so the indicator and the length limit both go by what was actually captured, and a five minute limit is not spent waiting. The indicator says so as well, since a pulsing dot, moving bars and a counting clock otherwise all say the words are still going in: the ribbon freezes where the pause found it and turns amber behind two bars. The tray menu holds and resumes it, `dikte pause` does, and so does a global shortcut, which starts empty because holding a recording is not something a keyboard has a habit for. Dictation and a command to the agent both, whichever is recording. A meeting is left out: it writes to a file as it goes and keeps two streams aligned itself, and neither of those wants a hole in it.
12 KiB
Dikte
Ctrl+Space'e bas, konuş, tekrar bas. Ses varsayılan olarak bu makinede yazıya
çevrilir, bir model transkripti temizler (ıı'lar, tekrarlar, eksik noktalama),
sonuç panoya kopyalanır ve o an yazdığın pencereye yapıştırılır.
KDE Plasma 6 / Wayland için yazıldı, GNOME X11 ve macOS'ta da çalışır. Sistem paketleri dışında bağımlılığı yok: sadece Python standart kütüphanesi (3.11 veya üstü) ve PyQt6.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Kurulum
sudo pacman -S --needed pipewire-audio wl-clipboard ydotool ffmpeg python-pyqt6
systemctl --user enable --now ydotool # otomatik yapıştırma için
./install.sh # ya da: ./install.sh "Meta+Space" "Meta+Shift+Space"
dikte # ilk açılışta ayarlar penceresi gelir
Fedora'da paket adları farklı, Fedora'nın kendi depolarındaki ffmpeg-free
yetiyor çünkü Dikte video dosyasının yalnızca ses izini alıyor, ydotool da
bir adım fazla istiyor: sistem servisi olarak geliyor, soketi de root'a ait
kalıp oturumun erişemediği yerde durduğu için servis çalışırken bile otomatik
yapıştırma tutmuyor. Soketi istemcinin zaten baktığı yola al ve sahipliğini
devret:
sudo dnf install pipewire-utils wl-clipboard ydotool ffmpeg-free python3-pyqt6
sudo mkdir -p /etc/systemd/system/ydotool.service.d
printf '[Service]\nExecStart=\nExecStart=/usr/bin/ydotoold --socket-path=%s/.ydotool_socket --socket-own=%s:%s\n' \
"$XDG_RUNTIME_DIR" "$(id -u)" "$(id -g)" \
| sudo tee /etc/systemd/system/ydotool.service.d/override.conf >/dev/null
sudo systemctl daemon-reload
sudo systemctl enable --now ydotool
Ubuntu/GNOME X11 için kayıt PulseAudio üzerinden, pano ve yapıştırma ise X11 araçlarıyla çalışır:
sudo apt install pulseaudio-utils xclip xdotool ffmpeg
macOS'ta da aynı ./install.sh çalışır, işi install-mac.sh'a devreder;
~/Applications içine bir Dikte.app, dikte komutunu ve bir LaunchAgent
kurar:
brew install pyqt ffmpeg # pyqt Apple'ın 3.9'undan yeni bir Python'ı da getirir
./install.sh # ya da: ./install.sh "Ctrl+Option+Space" "Ctrl+Option+D"
open -a Dikte
macOS Mikrofon ve Erişilebilirlik izinlerini uygulama paketinin kimliğine
yazıyor, ikisini de ilk gerektiğinde soruyor. Varsayılan kısayol orada
Ctrl+Option+Space, çünkü Ctrl+Space giriş kaynağını değiştirmeye ayrılmış; ve
hiçbir şey için oturumu kapatman gerekmez, kombinasyonu Dikte çalışırken kendisi
tutar. PyQt6 pip'ten değil brew'dan geliyor, Homebrew'un Python'u içine
kurulmayı reddediyor; sanal ortam kullanacaksan
DIKTE_PYTHON=…/venv/bin/python ./install.sh.
Orada elle derlenmesi gereken tek parça yerel transkripsiyon: whisper.cpp'nin
macOS sürümü yok, Homebrew'unki de WHISPER_BUILD_SERVER=OFF ile derleniyor,
yani whisper-cli kuruluyor, Dikte'nin konuştuğu sunucu değil. Kendin derle
(cmake -B build -DWHISPER_BUILD_SERVER=ON -DGGML_METAL=ON && cmake --build build -j) ve yolunu Ayarlar → API'ye yaz, ya da buluta çevir. Toplantı için
BlackHole veya Loopback gerekiyor (brew install blackhole-2ch); dikte için
gerekmiyor.
install.sh dikte komutunu, menü girdisini, oturum açılışında otomatik
başlatmayı ve iki global kısayolu kurar; tuşları da iki argümanı. ./update.sh
son sürümü çeker ve bunları senin seçtiğin tuşlarla yerine koyar;
./uninstall.sh hepsini geri alır, --purge demedikçe ayarlarına ve
diktelerine dokunmaz.
Sesi yazıya çevirme ve temizleme, ayarlar penceresinde ayrı ayrı sağlayıcı
seçer; ikisi de varsayılan olarak burada, kendi modellerinle çalışır. Bulutu
seçersen sesi yazıya çevirme OpenAI, Groq ya da OpenRouter'da
(varsayılan gpt-4o-transcribe), temizleme OpenRouter'da
(google/gemini-3.5-flash-lite) ya da kuruluysa Claude Code veya Codex'te
çalışır. Anahtarları boş bırakırsan OPENAI_API_KEY, GROQ_API_KEY ve
OPENROUTER_API_KEY kullanılır; anahtarlar ~/.config/dikte/config.json
içinde, izinler 600, Mac'te ise ~/Library/Application Support/Dikte altında.
Temizlemeyi tamamen kapatabilirsin, o zaman ham transkript yapıştırılır; modelin
yanındaki kutudan düşünme seviyesini de seçebilirsin.
Kullanım
| Ne | Nasıl |
|---|---|
| Kaydı başlat / bitir | Ctrl+Space, ya da tepsi simgesine tıkla |
| Kaydı duraklat / sürdür | Tepsi menüsü, dikte pause, ya da atadığın bir tuş |
| Kaydı iptal et | Ctrl+Alt+Space, tepsi menüsü, ya da dikte cancel |
| Ajana sesle komut ver | Tepsi menüsü → Claude'a sor, ya da dikte ask |
| Toplantıyı başlat / bitir | Tepsi menüsü → Toplantı kaydet, ya da dikte meeting |
| Ayarlar | Tepsi menüsü → Ayarlar, ya da dikte settings |
| Güncelleme sonrası yeniden yükle | Tepsi menüsü → Yeniden başlat, ya da dikte restart |
| Çık | Tepsi menüsü → Çık, ya da dikte quit |
Ekranın köşesindeki gösterge kırmızı kayıt noktasını, canlı ses dalgasını ve
süreyi, ardından hangi aşamada olduğunu gösterir. Odak almaz. Dikte çalışırken
Ctrl+Space'e tekrar basmak bir şey yapmaz, sıraya da girmez. Dikte ile ajana
verilen komut yalnızca mikrofon için birbirini bekler, o da tek aygıt olduğu
için; başka hiçbir şeyde beklemezler. Her birinin kendi göstergesi var, ikisi
birden ekrandayken ikincisi birincinin üstüne yerleşir.
Ayarlar penceresindeki her şeyin bir de komutu var; bir betik ya da bir ajan
yazılımın tamamını çalıştırabilsin diye: dikte record --seconds 8 söyleneni
geri verir, dikte transcribe konusma.mp4 --srt altyazıyı yazar, ayarlar,
geçmiş ve toplantılar da yanlarında durur. Hepsini dikte --help sayar, hepsi
--json kabul eder, yalnızca mikrofona ihtiyacı olanlar uygulamanın açık
olmasını ister.
Neler yapıyor
-
Her şey varsayılan olarak bu makinede çalışır. Sesi yazıya çevirme whisper.cpp, temizleme llama.cpp üzerinde; ikisini de önceden kurman gerekmez: ayarlar penceresi programı ve modeli indirir, sha256'sını doğrular, checksum'suz yayınlanmış bir indirmeyi reddeder, sen dikte ettikçe sunucuyu ayakta tutar. Derleme destekliyorsa ekran kartına CUDA, ROCm ya da Vulkan üzerinden ulaşılır. Anahtar yok, hesap yok, makineden çıkan bir şey yok.
-
Sessizlik API'ye gitmez. Sessize yakın bir ses verildiğinde model boş dize döndürmez, bir cümle uydurur ("Altyazı M.K.", "Thanks for watching"). O kaydın kendi gürültü tabanının 10 dB üstüne en az 0,3 saniye çıkan bir şey yoksa kayıt atılır; ne kadar yüksek olursa olsun sabit fanı ya da cızırtıyı eleyen de budur. Kaydın gürültülü ucu -55 dBFS altındaysa da atılır. Gösterge ölçtüğü seviyeyi yazar, eşiği ona bakarak ayarlarsın.
-
Yanlış duyulan kelimeler düzeltilir. Konuşma modelleri özel isimlerde sesçe benzer bir şeye kayıyor; temizleme modelinden bunları bağlamdan onarması, bağlam netleştirmiyorsa dokunmaması isteniyor. Temizleme kuralları sekmesine yazdığın isimler transkripsiyon modeline ipucu, temizleme modeline sözlük olarak gidiyor; "kuber netis"i tanımasını sağlayan da bu:
ham ıı bugün şey kuber netis üzerinde çalışan servisleri güncelledim yani sonra grafanada bir panel açtım hani ve pay kut ile arayüzü şey bitirdim işte sonuç Bugün Kubernetes üzerinde çalışan servisleri güncelledim. Sonra Grafana'da bir panel açtım ve PyQt ile arayüzü bitirdim. -
Başarısız temizleme sessizce geçmez. Dikte kaybolmasın diye ham transkript yine yapıştırılır ama gösterge kehribar rengine döner ve nedenini söyler, normal bir çalışma gibi görünmez.
-
Dikte bunun yerine bir komut da olabilir. Kendi kısayolu transkripti yapıştırmak yerine Claude Code'a (
claude -p) gönderir ve oradan döneni yapıştırır: cevabı ya da ne yapıldığını söyleyen bir cümle. Kendi açacağın oturumun aynısıdır, yani skill'lerin ve bağlı servislerin oradadır; "bunu perşembe üçe takvime koy" cümlesini Claude olmayan bir pencerede söyleyebilir olmanı sağlayan da budur. Codex (codex exec) da aynı şekilde çalışır; OpenRouter ise ikisi de kurulu olmayan bir makinede düz soru cevap için duruyor. Sağlayıcı, model, izinler ve çalışma dizini Ayarlar → Ajan sekmesinde; arka arkaya verilen komutlar tek bir konuşmada kalır. -
Toplantılar mikrofonla hoparlör çıkışından aynı anda kaydedilir; kimin ne dediği tahmin edilmez, sesin hangi kanaldan geldiğiyle belli olur. İki taraf ayrı ayrı yazıya çevrilip tek bir zaman damgalı transkriptte birleştirilir, ardından Ayarlar → Toplantı sekmesinden seçtiğin ikinci bir model kendi talimatıyla bunu tutanağa çevirir: kararlar, aksiyonlar, açık sorular. Sonuç
~/.local/share/dikte/meetingsaltına ve Ayarlar → Tutanaklar sekmesine düşer. Yarıda kalan bir işlem ses kaydını saklar, yeniden denemede parası ödenmiş transkriptin üstünden devam eder. -
Ses ve video dosyaları Ayarlar → Ses dosyası sekmesinde aynı modellerden geçer; istersen
[dd:ss]zaman damgalarıyla, uzun dosyalar ffmpeg ile parçalanarak, sonuç.txtya da.srtaltyazı olarak kaydedilerek; temizleme burada kendi kurallarıyla, altyazı için yazılmış haliyle çalışır: satırlar yerinde kalır, hiçbir şey kısaltılmaz. -
Geçmiş Ayarlar → Geçmiş sekmesinde; boyut sınırı var, sağ tıklayıp silebilirsin.
-
Türkçe ve İngilizce arayüz, varsayılan olarak sistem dilini izler.
Global kısayollar için bir kez oturum kapatmak gerekir
KWin kglobalshortcutsrc dosyasını yalnızca açılışta okur, yani install.sh'ın
yazdığı kısayollar oturumu yeniden açana kadar tetiklenmez. O zamana kadar Ayarlar →
Kısayollar → yerleşik dinleyici /dev/input üzerinden kombinasyonu kendisi
yakalar. Tek farkı: tuşu yutmaz, yani Ctrl+Space odaktaki uygulamaya da iletilir
(bazı editörlerde otomatik tamamlama açılabilir). Dinleyici kullanıcının input
grubunda olmasını gerektirir: sudo usermod -aG input $USER.
Dosyalar
dikte.py giriş noktası, tepsi simgesi, durum makinesi
cli.py komut satırı: bütün fiiller ve verdikleri cevap
ipc.py yerel sokette bir istek, bir cevap
audio.py PCM kaydı: diktede pw-record, toplantıda ffmpeg
meeting.py kanal ayırma, konuşmacı etiketi, temizleme, tutanak
assistant.py dikteyi Claude Code, Codex ya da OpenRouter'dan geçirme
api.py transkript ve temizleme istekleri (yalnız stdlib)
cleanup.py transkripti kim temizler: OpenRouter, burası, Claude ya da Codex
ggml.py whisper.cpp ve llama.cpp'yi indirip burada çalıştırma
hub.py GitHub ve Hugging Face'te bugün ne olduğu
worker.py transkript → temizleme → pano → yapıştırma
vad.py kayıtta gerçekten konuşma var mı kararı
filetranscribe.py dosyadan transkript: ffmpeg, parçalama, zaman damgaları
overlay.py köşedeki gösterge
settings_ui.py ayarlar penceresi
hotkey.py KDE kısayol kurulumu, evdev dinleyici, Mac'te Carbon
paste.py wl-clipboard ve ydotool sarmalayıcıları, pbcopy ve CoreGraphics
trayicon.py tepsi simgeleri, ikon teması olmayan yerler için çizilmiş
i18n.py metin tablosu
Gösterge XWayland üzerinden çizilir; Wayland'da bir pencereyi belirli bir köşeye
yerleştirmenin yolu yok, dikte.py bu yüzden QT_QPA_PLATFORM=xcb ayarlar.
Lisans
GPL-3.0, LICENSE dosyasına bak.






