Communitygithub.com

Stickman Explainer – Animasyonlu Çöp Adam Videoları

Bir metinden, Python tabanlı bir render motoru ve JSON storyboard ile 9:16 dikey, el çizimi tarzında stick-figure açıklama/hikâye videoları (Instagram Reels/Shorts/TikTok) üretir.

Was ist Stickman Explainer – Animasyonlu Çöp Adam Videoları?

Bu beceri, bir AI ajanının (örneğin Claude Code, Cursor gibi) bir metni otomatik olarak 1080×1920 MP4 video haline getirmesini sağlar. Kullanıcı sadece bir hikâye metni veya "şu Reels gibi bir video yap" gibi bir talimat verir; ajan, sahnelere böler, her sahne için bir storyboard JSON'u oluşturur ve `scripts/render.py` betiğini çalıştırarak krem kâğıt fon, siyah mürekkep stick figürler, tek bir kırmızı vurgu rengi ve isteğe bağlı güneş motifi içeren videoyu render eder. Kullanıcı sadece storyboard'u yazar; geri kalan her şey (çizim, animasyon, ses senkronizasyonu, kodlama) otomatiktir. Beceri, her sahne için JSON tabanlı bir şema kullanır; sahne geçişleri (fade, wipe, pop) ve kelime düzeyinde karaoke vurgulama (kırmızı rengin konuşulan kelimeyi takip etmesi) gibi özellikleri destekler. Hata yakalama ve doğrulama açısından güçlüdür; geçersiz yapılandırmaları açık hata mesajlarıyla reddeder. Bu beceri, özellikle kısa, dikey, anlatı odaklı sosyal medya videoları (tarih, anekdot, açıklama) için idealdir. Kullanıcıdan yalnızca bir senaryo veya video fikri alır; gerisini ajan halleder.

Funktioniert mit✓Claude Code✓Codex CLI~Cursor✓Antigravity✓OpenCode
npx skills add https://github.com/Apollonny/stickman-explainer/tree/main/stickman-explainer

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Stickman Explainer – Animasyonlu Çöp Adam Videoları?

Kısa bir metni, 1080×1920 çözünürlükte bitmiş bir MP4 dosyasına dönüştürür. Siz bir storyboard JSON yazarsınız; scripts/render.py her kareyi çizer (titreşimli mürekkep çizgileri, 8 fps'de line-boil, fade/wipe/pop açılışları) ve ffmpeg ile kodlar.

assets/example_storyboard.json yalnızca söz dizimi örneğidir (3 sahne); yerleşimini veya karakter aksesuarlarını şablon olarak kopyalamayın.

Varsayılan görsel stil

  • 9:16 tuval (1080×1920, 30 fps) kullanın. Her sahne tek bir fikri işlesin, genellikle 2,5–4 saniye sürsün, platform güvenli alanları içinde kısa altyazılar olsun.
  • Sıcak kâğıt (#f3ebdd), koyu mürekkep (#2b2723) ve anlamsal tuğla kırmızısı vurgu (#b8372d) kullanın. Altın sarısı (#d89d48) yalnızca güneş motifi için isteğe bağlıdır. Geri kalan her şey düz olsun: gradyan, gölge veya 3D efekt yok.
  • Net yüzlere sahip, bol negatif alan bırakarak basit siyah mürekkep figürler çizin. Hikâye veya kullanıcı istemedikçe kask, taç, pelerin, kırmızı giysi veya başka aksesuar eklemeyin. Tarihi bir isimden kıyafet çıkarmayın.
  • Sahneler okunabilir olsun: en fazla 2 karakter ve 5 küçük simge. Ana konu baskın olsun; altyazı ve nesnelerin üst üste binmesinden kaçının. En fazla 2 satır altyazı kullanın.
  • Karmaşık nesneleri tanınabilir yapın. Bir düğümü, belirgin kesişen ilmekler, sıkı bir merkez ve görünür ip uçlarıyla çizin. Kılıcın net bir kabzası, el koruması ve sivri bir namlusu olsun. Bir kesme sonrasında, iki ip ucu arasında görünür bir boşluk bırakın.
  • Anlatım zamanlaması mevcut olduğunda, kırmızı altyazı vurgusunun anlatım boyunca o anda konuşulan kelimeyi takip etmesini sağlayın. Altyazıdaki her boşlukla ayrılmış kelime için bir karaoke aralığı kullanın; aktif olmayan kelimeler normal metin renginde kalır.
  • Asimetrik yerleşimleri tercih edin ve bilinçli olarak negatif alan bırakın. Zemin çizgileri, güneş, başlık kartları, düşünce balonları ve diğer motifler isteğe bağlıdır; bunları yalnızca sahneyi destekliyorlarsa seçin.

İş akışı

  1. Metin → sahneler. Hikâyeyi tek cümlelik sahnelere bölün (≤ 6 kelime altyazı, her biri 2,5–4 sn). Şablon: başlık kartı → kanca/çatışma → somut açıklama. Her sahne tam olarak bir yeni bilgi parçası ekler. Anlatım sağlandığında, sahne sınırlarını konuşulan cümlelere göre hizalayın.
  2. Her cümle için bir görsel seçin. Sahne başına bir metafor: karakter + nesne, düşünce balonu veya bir simge sırası (X = "yok"). ≤ 2 karakter ve ≤ 5 simge tutun.
  3. Storyboard'u yazın (aşağıdaki şema). Kelime düzeyinde anlatım zamanlamalarıyla, altyazıdaki her boşlukla ayrılmış kelime için bir karaoke aralığı ekleyin, böylece kırmızı vurgu konuşulan kelimeyi takip eder. Yalnızca kelime zamanlaması mevcut olmadığında statik vurgu için **kelime** kullanın; statik işaretlemeyi karaoke ile birleştirmeyin.
  4. Önce kare kontrolleri yapın (hızlı, ~2 sn/sahne): python scripts/render.py story.json --stills out/stills → her scene_NN.png dosyasını açın, örtüşme/yerleşim sorunlarını düzeltin, tekrarlayın.
  5. Taslak video: python scripts/render.py story.json out/draft.mp4 --draft (süper örnekleme yok, 12 fps).
  6. Final: python scripts/render.py story.json out/final.mp4 [--audio voiceover.mp3]. Sahne süreleri anlatım cümle uzunluklarıyla eşleşmelidir; sesi ffprobe ile ölçün ve duration'ı buna göre ayarlayın. Kelime aralıkları, kendi sahnelerinin başlangıcından itibaren saniye cinsindendir ve anlatım hizalamasından veya dikkatli dinlemeden gelmelidir. Her kırmızı kelimenin, sesli konuşmasıyla birlikte, ne önünde ne de arkasında göründüğünü kontrol edin.

Hata mesajları ve doğrulama

render.py, storyboard'u çizmeden önce doğrular: bilinmeyen type/pose/face/kind/font, eksik zorunlu alan, aynı sahnede tekrarlanan id, duration <= 0, tek noktalı lines yolu, tek sayılı (çift olmayan) çözünürlük ve olmayan carry id'si traceback yerine açık mesajla reddedilir. Hiçbir zaman görünmeyecek ögeler (sahne bitişinden sonraki at) için uyarı verilir. Ses dosyası videodan kısaysa sonu sessizlikle doldurulur, uzunsa kesilir; video süresi asla değişmez.

Storyboard şeması

{"meta": {"width":1080,"height":1920,"fps":30,"boil_fps":8,"transition":0.18,
          "palette":{"accent":"#b8372d"}, "audio":null, "font_dirs":[]},
 "scenes":[{"duration":3.4, "caption":"Büyük **İskender**'di.",
            "caption_at":0.5, "caption_y":null, "elements":[ ... ]}]}

Konuşmayı takip eden kelime vurgusu için, caption içindeki her boşlukla ayrılmış kelime için bir { "start": saniye, "end": saniye } nesnesi içeren bir karaoke dizisi sağlayın. Zamanlar sahneye görelidir; kırmızı vurgu her aralıkta değişir. karaoke mevcut olduğunda altyazı **...** işaretlemesi içermemelidir.

{"duration":2.8, "caption":"Düğümü tek hamlede kesti.", "caption_at":0.35,
 "karaoke":[{"start":0.35,"end":0.76},{"start":0.76,"end":1.02},
            {"start":1.02,"end":1.53},{"start":1.53,"end":2.15}],
 "elements":[ ... ]}

Her öge: type, isteğe bağlı id (carry için), at (sn, görünme zamanı), dur (açılış sn'si), anim = fade | wipe | rise | pop, until/out_dur (solma). x,x2,y,ground ≤ 2 değerleri genişlik/yüksekliğin kesirleri olarak okunur, aksi halde piksel. Boyutlar her zaman pikseldir.

typeanahtar alanlar
groundy (zorunlu); x, x2 isteğe bağlı, verilmezse tuvalin ~%2–%98'i — wobbly taban çizgisi
sunx,y,r,rays
texttext (**accent** işaretlemesi), x,y,size,font = sans/sans_bold/sans_light/serif, tracking, caps, color, max_w, max_lines (varsayılan 3), rules (başlık kartı için çift çizgi; genişliği ve aralığı metne göre otomatik)
figurex,ground,h,head_r, pose = stand/arms_open/point/wave/think/shrug/sit, dir (±1), face = neutral/smile/sad/surprised/angry, isteğe bağlı accessory = helmet/crown/hat/glasses, isteğe bağlı cape, look
propkind = barrel/bowl/bucket/house/book/box/triangle/coins/tree, x,y (sol üst), w,h, cross (vurgu X), flip
thoughtx,y,w,h, tail_to [px,py] (kafa konumu), inner: balon-yerel px cinsinden ögeler listesi
linespaths (nokta listelerinin listesi, yerel px), closed, smooth, color, width — herhangi bir özel şekil için kaçış yolu

Sahneler arası süreklilik (carry)

Bir sahnenin ögesini sonraki sahneye taşımak için ögeye id verin, sonraki sahnede carry ile çağırın. Taşınan öge aynı çizgi titreşimiyle (aynı seed) başlar, yani sahne değişse bile "aynı çizim" olarak görünür; yeni sahne geçişi varsayılan olarak kesmedir (çapraz geçiş yok).

"carry": [
  "ground",
  {"id": "sun",  "set": {"r": 122}},
  {"id": "alex", "set": {"x": 120, "face": "smile"}, "tween": {"at": 0.1, "dur": 0.9}},
  {"id": "diog", "until": 0.1, "out_dur": 0.5}
]

Satırlar sırayla: "ground" aynen taşınır · sun alan değiştirilerek taşınır (değişiklik sahne başında anında olur) · alex hem alan değiştirir hem konumu süre boyunca kayar (tween) · diog taşınır ama sahne içinde sönerek çıkar.

  • "carry": "all" her şeyi taşır ("carry_except": ["id", ...] hariç tutar). Altyazı asla taşınmaz.
  • Taşınmayan öge sahne başında anında kaybolur; yumuşak kaybolması için until/out_dur kullanın. until ile sönen öge sonraki sahneye taşınamaz.
  • tween yalnızca konum (x ve y/ground) animasyonları; boyut (r, h, w) ve görünüm (face, pose) değişimleri sahne başında anında uygulanır.
  • Taşınan ögeler yeni ögelerin altında çizilir. Taşınacak ögeler için sahneler arası id benzersiz olmalı.
  • Aynı id'li öge her sahnede aynı seed'i kullanır; sahneye özgü yeni öge için id vermeyin.

render.py içindeki PROPS / hands yapılarını genişleterek yeni nesneler/pozlar ekleyin; aynı mürekkep stilini koruyun (stroke() kullanın, asla düz çizgiler kullanmayın).

Yerleşim: her video için yeniden karar verin

Sabit koordinat/şablon yoktur. Her videonun konusu farklı olduğu için yerleşimi sahnenin içeriğinden türetin:

  • Önce o cümlenin tek görsel fikrini seçin (karşılaştırma, liste, hayal, yolculuk, sayı…), sonra ona uyan düzeni kurun. Aynı videoda sahneler arasında düzen değişebilir.
  • Önemli olan ögeye yer açın: ana özne en büyük/en belirgin olsun; yan ögeler küçük kalsın. Boş alan (negatif alan) bilinçli bırakılsın.
  • Büyüklük, konum ve sayı içeriğe göre değişir (1 karakter mi, 2 mi; ikon şeridi mi, tek büyük nesne mi, harita/zaman çizgisi mi). Gerekirse lines ile özel şekil çizin.
  • Tarihî kişilere otomatik kostüm/başlık eklemeyin. Figürler varsayılan olarak aksesuarsız çizilir; miğfer, taç, şapka veya pelerin yalnızca anlatı ya da kullanıcı açıkça gerektiriyorsa eklenir. Vurgu rengini karakterin kıyafetine dekor olarak yaymayın.
  • Düğüm ve kesme sahnelerinde nesneyi okunaklı kurun: ipi belirgin biçimde üst üste geçen birkaç ilmekle çizin, merkezde sıkı düğüm gösterin ve ip uçlarını ayırt edin. Kılıçta kabza, el koruması ve sivri namlu seçilebilsin. Kesme anından sonra iki kesik ip ucunu aralıklı ve açıkça görünür bırakın; kılıç ve düğüm altyazı tarafından kapatılmasın. Özel ip/kılıç şekillerini lines ile çizin.
  • Zemin çizgisi, güneş, başlık kartı gibi motifler isteğe bağlıdır; konuya uymuyorsa kullanmayın (ör. iç mekân, gece, soyut kavram).
  • Altyazıyı okunur ve platform arayüzünden uzak bir yere koyun; çakışırsa caption_y ile oynatın. Çakışma ve taşmayı still'lerde gözle kontrol edin, sayıya güvenmeyin.
  • Çizim koordinatları 1080×1920 tuvalde piksel (veya 0–2 arası oran) olarak verilir; değerleri her sahne için sıfırdan planlayın.

Tuzaklar

  • Her zaman önce kareleri görüntüleyin; üst üste binen ögeler ve kırpılmış güneş ışınları olağan kusurlardır. Taslak için --draft, ayrıntı için tam render: değişmeyen kareler yeniden çizilmez, 10 sn'lik video tam kalitede yaklaşık 20 sn sürer.
  • Altyazı %86 genişliğe kadar satır kaydırır (en fazla 3 satır), ancak bir kelime sığmazsa ya da 3 satırı aşarsa küçülür. 2 satırı geçen cümleyi iki sahneye bölün. Varsayılan altyazı konumu yalnızca yedektir; gerekirse sahnede caption_y verin.
  • Fontlar: Poppins ve Playfair Display (veya Lora) kurun ya da --font-dir verin. Hiç TrueType font bulunamazsa renderer uyarı basar ve Türkçe karakterler (İ ş ğ â) eksik çıkabilir; still'lerde kontrol edin. Linux, macOS ve Windows font klasörleri taranır.
  • Vurgu rengini anlamsal tutun (özne, anahtar kelime, olumsuzlama). Daha fazla renk eklemeyin.
  • karaoke mevcut olduğunda, kırmızı altyazı vurgusu, sağlanan aralıkları kullanarak anlatımı kelime kelime takip eder. Ekranda sabit bir kırmızı anahtar kelime bırakmayın; aktif olmayan kelimeleri altyazı metin renginde işleyin.

Verwandte Skills