first commit

This commit is contained in:
Ümit Tunç
2026-04-23 07:34:37 +03:00
commit f05ec04f47
10 changed files with 192 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
# Voicext - Local AI Transcription (Voice-to-SRT) Implementation Plan
Voicext, Premiere Pro ve diğer kurgu programları için hızlı, yerel (offline) ve yüksek kaliteli SRT dosyaları üreten bir masaüstü uygulamasıdır. `whisper.cpp` motorunu kullanarak RTX GPU gücünden yararlanır ve "al gülüm ver gülüm" sadeliğinde bir iş akışı sunar.
## 🎯 Proje Hedefleri
- **Gizlilik:** Tamamen yerel çalışma (İnternet gerekmez).
- **Kullanılabilirlik:** Tek tıkla MP3 -> SRT dönüşümü.
- **Estetik:** Modern, karanlık tema, premium tasarım.
## 🏗️ Mimari ve Teknoloji Yığını
### Çekirdek (Core)
- **Framework:** Electron.js (Vite ile optimize edilmiş).
- **Processing:** `whisper.cpp` (C++ tabanlı yerel inferans).
- **Audio Engine:** `FFmpeg` (16kHz Mono WAV dönüşümü için).
- **Hardware Acceleration:**
- **GPU:** CUDA/cuBLAS (NVIDIA kullanıcıları için).
- **CPU:** AVX/AVX2/AVX-512 optimizasyonu (GPU olmayan sistemler için otomatik fallback).
### Arayüz (Frontend)
- **UI:** React + Vanilla CSS (Custom premium components).
- **Animations:** Framer Motion (Akıcı geçişler).
- **State:** Zustand (Hafif ve hızlı durum yönetimi).
---
## 🛠️ Uygulama Fazları
### Faz 1: Altyapı ve Binary Yönetimi
Uygulamanın kalbi olan binary dosyalarının hazırlanması.
- [ ] `whisper.cpp`'nin Windows CUDA desteğiyle derlenmesi.
- [ ] `ffmpeg` static binary'lerinin projeye dahil edilmesi.
- [ ] Model yönetimi: Uygulama içinden `tiny`, `base`, `small`, `medium`, `large` modellerinin indirilmesi ve yönetilmesi.
### Faz 2: İş Akışı (The "Al Gülüm Ver Gülüm" Engine)
1. **Input:** Kullanıcı MP3/WAV/M4A dosyasını sürükler.
2. **Pre-processing:** FFmpeg ile `16kHz, mono, 16-bit PCM WAV` formatına anlık dönüşüm.
3. **Inference:** `whisper.exe -m model.bin -f input.wav -osrt -l tr` komutunun child_process ile çalıştırılması.
4. **Output:** `.srt` dosyasının otomatik olarak orijinal dosyanın yanına veya seçilen klasöre kaydedilmesi.
### Faz 3: Kullanıcı Deneyimi ve Arayüz (Premium UX)
- **Glassmorphic Dashboard:** Sürükle-bırak alanı için neon efektli modern bir "Drop Zone".
- **Real-time Progress:** Whisper'ın stdout çıktısını parse ederek canlı ilerleme çubuğu ve "transcription streaming" (ekrana dökülen kelimeler).
- **SRT Preview:** Oluşturulan SRT dosyasını uygulama içinde önizleme ve basit zamanlama düzeltmeleri yapma imkanı.
- **One-Click Export:** "Export for Premiere" butonu ile standartlara en uygun SRT formatını dışa aktarma.
---
## 🖥️ Teknik Detaylar (Hack Önerileri)
### Hibrit Donanım Desteği (Auto-Detection)
Uygulama her sistemde çalışabilmesi için donanımı otomatik algılayacak:
- **NVIDIA Sistemler:** `whisper-cuda.exe` ile maksimum hız.
- **Diğer Sistemler:** `whisper-cpu.exe` ile optimize edilmiş işlemci kullanımı.
- **Dinamik Seçim:** Ayarlar kısmında kullanıcıya "CPU vs GPU" seçme imkanı sunulacak.
### SRT Optimizasyonu
Premiere Pro'da altyazıların çok uzun olmaması için whisper.cpp'nin segmentasyon ayarları optimize edilecek:
- `--max-len`: Satır başına maksimum karakter (Örn: 42).
- `--max-context`: Daha iyi bağlam için önceki metni hatırlama.
---
## 📅 Yol Haritası (Milestones)
1. **MVP:** Dosya seç -> Dönüştür -> SRT al (Görsel odak yok).
2. **Design Update:** Premium UI elementlerinin ve animasyonların eklenmesi.
3. **Advanced Features:** Çoklu dil seçimi, GPU/CPU anahtarı, SRT editörü.
## ❓ Açık Sorular
- Uygulama ilk açıldığında `base` modelini (yaklaşık 140MB) paket içine gömmeli miyiz yoksa ilk açılışta mı indirtmeliyiz?
- Birden fazla dosyayı aynı anda işleme (Batch Processing) özelliği ilk aşamada gerekli mi?
## 🧪 Doğrulama Planı
- Farklı MP3 kalitelerinde (128kbps, 320kbps) FFmpeg dönüşüm testi.
- Uzun videolarda (1 saat+) bellek kullanımı ve GPU sıcaklık takibi.
- Üretilen SRT'nin Premiere Pro ve VLC'de karakter kodlaması (UTF-8) kontrolü.
Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

+20
View File
@@ -0,0 +1,20 @@
import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
main: {
plugins: [externalizeDepsPlugin()]
},
preload: {
plugins: [externalizeDepsPlugin()]
},
renderer: {
resolve: {
alias: {
'@renderer': resolve('src/renderer/src')
}
},
plugins: [react()]
}
})
+32
View File
@@ -0,0 +1,32 @@
{
"name": "voicext",
"version": "1.0.0",
"description": "Local AI Transcription Tool",
"main": "./out/main/index.js",
"author": "Voicext",
"scripts": {
"dev": "electron-vite dev",
"build": "electron-vite build",
"preview": "electron-vite preview",
"package": "electron-vite build && electron-builder",
"postinstall": "electron-builder install-app-deps"
},
"dependencies": {
"@headlessui/react": "^2.0.0",
"clsx": "^2.1.1",
"framer-motion": "^11.2.10",
"lucide-react": "^0.395.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"tailwind-merge": "^2.3.0",
"zustand": "^4.5.2"
},
"devDependencies": {
"@electron-vite/cli": "^2.3.0",
"@vitejs/plugin-react": "^4.3.1",
"electron": "^31.0.1",
"electron-builder": "^24.13.3",
"electron-vite": "^2.3.0",
"vite": "^5.3.1"
}
}
+64
View File
@@ -0,0 +1,64 @@
import { app, shell, BrowserWindow, ipcMain } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'
function createWindow() {
const mainWindow = new BrowserWindow({
width: 1100,
height: 670,
show: false,
autoHideMenuBar: true,
...(process.platform === 'linux' ? { icon } : {}),
webPreferences: {
preload: join(__dirname, '../preload/index.mjs'),
sandbox: false
},
frame: false, // Custom frame for premium look
transparent: true,
backgroundColor: '#00000000'
})
mainWindow.on('ready-to-show', () => {
mainWindow.show()
})
mainWindow.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url)
return { action: 'deny' }
})
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
} else {
mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
}
}
app.whenReady().then(() => {
electronApp.setAppId('com.voicext.app')
app.on('browser-window-created', (_, window) => {
optimizer.watchWindowShortcuts(window)
})
// IPC handlers
ipcMain.on('window-controls', (event, action) => {
const win = BrowserWindow.fromWebContents(event.sender)
if (action === 'minimize') win.minimize()
if (action === 'maximize') win.isMaximized() ? win.unmaximize() : win.maximize()
if (action === 'close') win.close()
})
createWindow()
app.on('activate', function () {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})