feat: 9:16 crop + dinamik altyazı render motoru (Faz 2, Modül 4)

Her aday klip transkribe olduktan hemen sonra otomatik olarak
video-render kuyruğuna giriyor. Yeni Python worker (video_render.py):

- Klibi ffmpeg ile keser
- OpenCV + MediaPipe Face Detector (Tasks API — yeni mediapipe
  sürümlerinde eski solutions API'si kalktı, .tflite model dosyası
  Docker build'de indiriliyor) ile örneklenmiş karelerde yüz merkezi
  tespit eder, yumuşatır (moving average); hiç yüz bulunamazsa sabit
  merkez crop'a düşer, hata saymaz
- Kırpılmış kareleri OpenCV'den ffmpeg'e pipe'layıp tek geçişte orijinal
  sesi map'ler ve transcript_json'dan ürettiği .ass altyazıyı yakar
- Sonucu /shared-media/shorts/<candidate_id>.mp4'e yazar

Yeni ShortVideo modeli (PENDING/RENDERING/READY/FAILED). Panelde
(segments + kanal detay sayfaları) render durumu + READY olunca video
önizleme/indirme. VIDEO_RENDER_CONCURRENCY ayrı ve düşük (varsayılan 2)
— bu iş diğerlerinden çok daha ağır.

Kapsam: sadece tekil konuşmacı şablonu (çoklu konuşmacı/split-screen
sonraki bir iterasyona bırakıldı — aktif-konuşmacı tespiti gerektiriyor).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 15:26:22 +03:00
co-authored by Claude Sonnet 5
parent 5fef7460cf
commit f00fc73b0b
17 changed files with 519 additions and 58 deletions
+24 -15
View File
@@ -1,11 +1,14 @@
# StreamClipper AI — Faz 1
# StreamClipper AI — Faz 1 + Faz 2 (render)
`prd.md` içindeki tam kapsamlı otonom pipeline'ın ilk fazı: ingestion (yt-dlp
headless capture + 15dk segmentleme), sinyal analizi (ses peak + chat
velocity), Whisper STT (OpenAI API, kelime zaman damgalı), BullMQ/Redis/
Postgres altyapısı ve durum/transkript gösteren bir Next.js panel. LLM
virality skorlama, render/crop/altyazı ve multi-platform dağıtım bu fazda
**yok** — bkz. `prd.md` Modül 3 (skorlama kısmı), 4 ve 5.
`prd.md` içindeki tam kapsamlı otonom pipeline'ın Faz 1+2'si: ingestion
(yt-dlp headless capture + 15dk segmentleme), sinyal analizi (ses peak +
chat velocity), Whisper STT (OpenAI API, kelime zaman damgalı), BullMQ/
Redis/Postgres altyapısı, auth korumalı bir Next.js panel — ve Faz 2 olarak
transkribe edilen her aday klibi otomatik yüz-takipli 9:16'ya crop'layıp
dinamik altyazı basan bir render motoru (`apps/worker/worker/video_render.py`).
LLM virality skorlama, çoklu-konuşmacı/split-screen şablonu ve
multi-platform dağıtım hâlâ **yok** — bkz. `prd.md` Modül 3 (skorlama
kısmı) ve Modül 5.
## Klasör Yapısı
@@ -77,8 +80,8 @@ Panel: http://localhost:3000 · API daemon health: http://localhost:4001/health
Panelin tüm sayfaları giriş gerektirir (middleware ile korunuyor). İlk açılışta
henüz hiç kullanıcı yoksa `/login` otomatik olarak "İlk Yönetici Hesabını
Oluştur" formunu gösterir — kullanıcı adı/şifre girip ilk admin hesabını
oradan oluşturursun. Sonraki kullanıcılar için ayrı bir "kullanıcı ekle"
arayüzü henüz yok (Faz 2).
oradan oluşturursun. `/users` sayfasından ek kullanıcı ekleyip silebilirsin
(kendi hesabını veya son kalan tek kullanıcıyı silmek engellenir).
`SESSION_SECRET` production'da zorunlu (`openssl rand -base64 32` ile
üretilebilir) — local dev'de boş bırakılırsa güvensiz bir varsayılan
@@ -94,15 +97,21 @@ kullanılır, sadece test için.
kuyruğundan alıp ses peak + (varsa) chat velocity analiziyle
`candidate_segments` üretir.
4. Her aday, `stt-scoring` kuyruğunda OpenAI Whisper API ile transkribe edilir;
sonuç `candidate_segments.transcript_json` alanına yazılır ve Telegram'a
bildirim gider.
5. Panelde (`/` ve `/segments`) kanal durumu ve üretilen transkriptleri
kontrol et.
sonuç `candidate_segments.transcript_json` alanına yazılır, Telegram'a
bildirim gider ve `video-render` kuyruğuna otomatik iş eklenir.
5. `video-render` (Python, `video_render.py`) yüz tespiti + yumuşatılmış
dinamik crop ile 9:16'ya çevirir, transkriptten `.ass` altyazı üretip
yakar, `/shared-media/shorts/<candidate_id>.mp4`'e yazar;
`short_videos.status` `READY`/`FAILED` olur, Telegram'a bildirim gider.
6. Panelde (`/`, `/segments`, kanal detay sayfaları) kanal durumu, ham
segment/transkript ve render edilen 9:16 kısa videoları izle/indir.
## Bilinen Sınırlamalar (bu faz kapsamı dışı)
- LLM virality skorlama, metadata üretimi, telif/görüntü filtresi yok.
- 9:16 crop/altyazı render motoru yok.
- LLM virality skorlama, metadata üretimi, telif/görüntü filtresi yok
transkribe edilen her aday otomatik render edilir, eşik/filtre yok.
- Çoklu konuşmacı / split-screen şablonu yok — sadece tekil konuşmacı
(yüz-merkezli dinamik crop).
- YouTube/Instagram/TikTok'a otomatik yayınlama yok (bu API'ler ayrı onay
süreçleri gerektiriyor — `prd.md` tartışmasına bkz.).
- Aday pencere çıkarımı her zaman tek bir 15dk'lık segment dosyasıyla sınırlı;