মূল কনটেন্টে যান
এআই টিউটোরিয়াল

ff-tracking দিয়ে কোড-জেনারেটেড AI টার্মিনাল ফিল্ম তৈরি করুন

জানুন কীভাবে ff-tracking টার্মিনালে টাইপ করা একটি AI এজেন্ট রেন্ডার করে, প্রতিটি গ্লিফ ট্র্যাক করে, চলমান ক্যামেরা ও SkSL লেন্স ইফেক্ট প্রয়োগ করে এবং সমন্বিত শব্দ তৈরি করে। এই টিউটোরিয়ালে সেটআপ, দুই-পাস পাইপলাইন, রেন্ডারিং কমান্ড, কাস্টমাইজেশন, ডায়াগনস্টিকস এবং ঐচ্ছিক Slab সাউন্ডট্র্যাক সম্পর্কে আলোচনা করা হয়েছে।

ff-tracking দিয়ে কোড-জেনারেটেড AI টার্মিনাল ফিল্ম তৈরি করুন

ff-tracking হলো কোড-জেনারেটেড একটি স্বল্পদৈর্ঘ্য চলচ্চিত্র, যেখানে একটি ভার্চুয়াল ক্যামেরা টার্মিনালে টাইপ করা একটি AI এজেন্টকে অনুসরণ করে। কম্পিউটার-ভিশনধর্মী একটি ওভারলে আলাদা আলাদা গ্লিফে স্থিরভাবে অবস্থান করে, আর পারস্পেক্টিভ, ডেপথ অব ফিল্ড, কালার প্রসেসিং, ব্লুম, স্ক্যানলাইন টিয়ার, গ্রেইন ও শব্দ কোডের মাধ্যমে তৈরি হয়।

প্রকল্পটি Rust, fframes, Skia Metal, SkSL, FFmpeg এবং Python দিয়ে তৈরি। এটি দুটি সমন্বিত পাসের মাধ্যমে ছয় সেকেন্ডের একটি ভিডিও রেন্ডার করে; ভিজ্যুয়াল ইফেক্ট ও অডিও উভয়ই একই ট্র্যাকিং ডেটা ব্যবহার করে।

ট্র্যাকিং ওভারলে-সহ কোড-জেনারেটেড টার্মিনাল চলচ্চিত্র

প্রকল্পটি যা তৈরি করে

চলচ্চিত্রটিতে thinking…, reading 14 files, tool_call: render_frame() এবং ✓ 0 problems-এর মতো টার্মিনাল বার্তার একটি ধারাবাহিকতা দেখা যায়। একটি ট্র্যাকার নতুনতম অক্ষরগুলো অনুসরণ করে এবং তাদের প্রকৃত পিক্সেল স্থানাঙ্ক, টার্গেট ব্র্যাকেট, লেবেল ও বক্সগুলোর মধ্যে সংযোগ দেখায়।

  • প্রকৃত স্থানাঙ্ক: ট্র্যাকার লেবেলগুলো আউটপুট ফ্রেমে প্রতিটি বক্সের প্রকৃত অবস্থান ব্যবহার করে।
  • চলমান ফোকাস: এজেন্ট টাইপ করার সময় ডেপথ-অব-ফিল্ডের টার্গেট ট্র্যাক করা বক্সকে অনুসরণ করে।
  • অ্যানিমেটেড ট্র্যাকিং: পড়ার ক্রম অনুযায়ী সংযোগগুলো বক্সগুলোর মধ্যে রেখা তৈরি করে, আর প্রতিটি রেখা বরাবর একটি বিন্দু চলে।
  • লক ইফেক্ট: নতুনতম শব্দটি দুই ফ্রেমের জন্য লাল হয়ে যায়, একটি স্ক্যানলাইন টিয়ার পায় এবং স্থানিকভাবে প্যান করা একটি বিপ শব্দ চালু করে।
  • একাধিক লুক: বারোটি শটে Paper, Thermal, Mono, Phosphor, Amber, Navy এবং Neon প্যালেট ব্যবহার করা হয়।
  • চূড়ান্ত সংকোচন: চৌদ্দটি বক্স একত্র হয়ে একটি বক্সে পরিণত হয়, যা কালো হয়ে ফেড হওয়ার আগে Done পিলে রূপান্তরিত হয়।

দুই-পাস পাইপলাইনটি বুঝে নিন

প্রকল্পটি টার্মিনাল লেআউটকে ক্যামেরা ও লেন্স ইফেক্ট থেকে আলাদা রাখে। এতে প্রতিটি গ্লিফের অবস্থান নির্ধারিত থাকে, আবার দ্বিতীয় পাসে রেন্ডার করা টার্মিনালকে শেডার ইনপুট হিসেবে ব্যবহার করা যায়।

  1. HUD ডেটা: hud ক্রেট দৃশ্য, ট্র্যাকার বক্স, ক্যামেরা মুভমেন্ট ও প্রজেকশন ডেটা নির্ধারণ করে।
  2. ফ্ল্যাট পাস: flat বাইনারি 3840×2160 আকারে টার্মিনালকে SVG হিসেবে রেন্ডার করে। এটি প্রতি গ্লিফের জন্য একটি করে <text> এলিমেন্ট বসায়, ফলে অবস্থানগুলো নির্ভুলভাবে জানা যায়।
  3. লেন্স পাস: lens বাইনারি ফ্ল্যাট ভিডিওকে iChannel0 হিসেবে স্যাম্পল করে এবং ভার্চ্যুয়াল ক্যামেরা ও SkSL ইফেক্ট প্রয়োগ করে।
  4. অডিও পাস: tools/sfx.py out/tracks.json পড়ে টাইপিং, কাট, লক ও চূড়ান্ত অবতরণের সঙ্গে সামঞ্জস্যপূর্ণ শব্দ ইভেন্ট তৈরি করে।
  5. এনকোডিং: FFmpeg প্রক্রিয়াজাত ভিডিও ও অডিও একত্র করে out/tracking.mp4 তৈরি করে।

লেন্স শেডার পারস্পেক্টিভ, ডেপথ অব ফিল্ড, প্যালেট ম্যাপিং, ক্রোম্যাটিক অ্যাবেরেশন, ব্লুম, একটি LED গ্রিড, টিয়ার, গ্রেইন এবং ক্যামেরা-স্পেস ট্র্যাকার ওভারলে পরিচালনা করে। ডেপথ-অব-ফিল্ড ইফেক্টে 36টি গোল্ডেন-অ্যাঙ্গেল স্যাম্পল ব্যবহার করা হয়, আর হাইলাইটে বোকেহ-ধাঁচের ওজন প্রয়োগ করা হয়।

লেন্স শেডার ইফেক্টের বিভিন্ন ধাপ

প্রয়োজনীয় উপাদান ইনস্টল করুন

রেন্ডার করতে Apple silicon-যুক্ত একটি Mac প্রয়োজন, কারণ প্রকল্পটি Metal-এ Skia ব্যবহার করে। বিল্ড করার আগে নিচের টুলগুলো ইনস্টল করুন:

  • 2024 এডিশনের সমর্থনসহ Rust
  • FFmpeg
  • Python 3
  • Python প্যাকেজ numpy ও scipy
  • README মিডিয়া পুনর্নির্মাণ করতে চাইলে Pillow ও img2webp

রিপোজিটরি ক্লোন করে এর ডিরেক্টরিতে প্রবেশ করুন:

git clone https://github.com/mrsarac/ff-tracking
cd ff-tracking

ডিফল্ট চলচ্চিত্র রেন্ডার করুন

প্রধান স্ক্রিপ্টটি Rust ওয়ার্কস্পেস বিল্ড করে, ট্র্যাকিং ডেটা এক্সপোর্ট করে, ফ্ল্যাট পাস রেন্ডার করে, শব্দ তৈরি করে এবং লেন্স পাস রেন্ডার করে:

tools/render.sh

সম্পূর্ণ ভিডিওটি out/tracking.mp4-এ লেখা হয়। M3 Pro-তে প্রাথমিক বিল্ডের পর রেন্ডার হতে প্রায় 40 সেকেন্ড সময় লাগে।

তৈরি হওয়া ডেটার মধ্যে out/tracks.json রয়েছে, যা ট্র্যাকিং ইভেন্ট বর্ণনা করে এবং ডিফল্ট সাউন্ড ডিজাইন পরিচালনা করে। ঐচ্ছিক ক্যামেরা বাইনারিটি out/camera.json-ও লেখে, যেখানে প্রতি ফ্রেমের জুম, টিল্ট, রোল, ট্র্যাক করা বক্সের অবস্থান ও স্ক্রিনের কেন্দ্রের তথ্য থাকে।

ফ্রেম, অডিও ও শেডার ধাপ পরীক্ষা করুন

প্রতিটি পাস একটি fframes CLI হওয়ায়, পরিচিত কমান্ডগুলো ব্যবহার করে আউটপুট পরীক্ষা করতে পারেন:

target/release/lens strip all -n 12
target/release/lens frame 81 -o frames
target/release/lens preview
target/release/lens audio analyze

কন্ট্যাক্ট শিট তৈরি করতে strip, পূর্ণ আকারের ফ্রেম এক্সপোর্ট করতে frame এবং শব্দসহ রিয়েল-টাইম প্রিভিউ খুলতে preview ব্যবহার করুন। অডিও বিশ্লেষণ কমান্ডটি লাউডনেস ও ট্রু পিকের তথ্য দেখায়।

নির্দিষ্ট কোনো ধাপের পর শেডার থামাতে LENS_STAGE সেট করুন। সমর্থিত ধাপগুলোর নম্বর 0 থেকে 3 পর্যন্ত:

LENS_STAGE=1 target/release/lens frame 81

সোর্স ইমেজ থেকে চূড়ান্ত লেন্স ট্রিটমেন্টে রূপান্তর ডিবাগ করার সময় এটি কার্যকর।

দৃশ্য কাস্টমাইজ করুন

প্রতিটি শট hud/src/lib.rs-এর ভেতরে থাকা SCENE_LIST-এর একটি এন্ট্রি। একটি দৃশ্যে এর ধরন, টেক্সট, প্যালেট, ক্যামেরা, শুরুর অবস্থান ও ফন্টের আকার নির্ধারিত থাকে:

SceneDef {
    kind: Kind::Typing,
    text: "thinking…",
    palette: Palette::Thermal,
    cam: cam(0.38, -0.22, 0.04, 2.5, 2.8, 50.0, 0.0, 1.2),
    hero: (560.0, 540.0),
    size: 104.0,
},

টেক্সট পরিবর্তন করুন, অন্য একটি প্যালেট নির্বাচন করুন, অথবা ক্যামেরার মান সমন্বয় করে আবার রেন্ডার করুন:

tools/render.sh

ট্র্যাকার, ফোকাস লক্ষ্য, লেবেল এবং লক বীপগুলো স্বয়ংক্রিয়ভাবে আপডেট করা দৃশ্যের ডেটা অনুসরণ করে। উপলভ্য প্যালেটের নামের মধ্যে রয়েছে Paper, Thermal, Mono, Phosphor, Amber, Navy এবং Neon।

দৃশ্য সম্পাদনা করার পর HUD পরীক্ষা চালান:

cargo test -p hud

এই পরীক্ষাগুলো যাচাই করে যে প্রতিটি লাইন পর্দায় ফিট করে এবং ক্যামেরা প্রতিটি লক্ষ্যকে ফ্রেমের মধ্যে রাখে।

টার্মিনাল ট্র্যাকিং শট ও ভিজ্যুয়াল প্যালেট

ডিফল্ট বা ঐচ্ছিক সাউন্ডট্র্যাক ব্যবহার করুন

ডিফল্ট সাউন্ডট্র্যাক tools/sfx.py দিয়ে তৈরি হয়। এতে স্ক্রিনের গুঞ্জন, কাটের সময় বিট-ক্রাশড গ্লিচ, কীস্ট্রোকের জন্য ক্লিক এবং ট্র্যাক করা বক্সের দিকে প্যান করা পেন্টাটনিক লক বীপ একত্র করা হয়েছে। Done পিল দেখা দিলে এতে ধসের জন্য একটি রাইজার এবং একটি সাব হিটসহ চাইমও যোগ হয়। FFmpeg-এর ebur128 ব্যবহার করে লাউডনেস মাপা হয় এবং -14 LUFS-এ সেট করা হয়।

রিপোজিটরিতে 120 BPM-এ একটি ঐচ্ছিক আরও গাঢ় Slab স্কোরও রয়েছে। এটি একই ট্র্যাকিং ও ক্যামেরা ডেটা অনুসরণ করে, তাই লক ব্লিপ, কীস্ট্রোক, প্যাড, রাইজার, গ্লিচ, বেস ফিল্টারিং এবং বেস টিয়ার অ্যানিমেশনের সঙ্গে সাড়া দেয়।

কমিট করা স্কোর রেন্ডার ব্যবহার করুন:

tools/score.sh

স্কোরটি আবার রেন্ডার করতে zig build -Doptimize=ReleaseFast দিয়ে তৈরি একটি Slab চেকআউটের অবস্থান দিন:

SLAB=/path/to/slab tools/score.sh

স্কোর স্ক্রিপ্ট score/ff_tracking.slab লিখে এবং রেন্ডার করা অডিও score/score.wav হিসেবে পাওয়া যায়। রিভার্ব টেইলের জন্য স্কোর পাইপলাইন ছবির দৈর্ঘ্যের বাইরে প্রসারিত হয়, এরপর ফলাফলকে ছয় সেকেন্ডে কেটে ভিডিওর সঙ্গে ফেড করে।

মনে রাখবেন, score/score.py slabkit ইমপোর্ট করে, যা GPL-3.0 লাইসেন্সের অধীনে Slab-এর সঙ্গে বিতরণ করা হয়। স্কোরটি আবার রেন্ডার করার জন্যই শুধু Slab প্রয়োজন; README অনুযায়ী কমিট করা স্কোর ফাইলগুলো রিপোজিটরির MIT লাইসেন্সের অধীনে দেওয়া হয়েছে।

ডকুমেন্টেশনের মিডিয়া পুনর্নির্মাণ করুন

README-এর ছবিগুলো পুনরায় তৈরি করার জন্য রিপোজিটরিতে একটি স্ক্রিপ্ট রয়েছে। ইমেজ নির্ভরতা ইনস্টল করার পর Python দিয়ে এটি চালান:

python3 -I tools/readme_media.py

প্রকল্পের বিন্যাস

  • hud/: দৃশ্য, ট্র্যাকার বক্স, ক্যামেরা ডেটা এবং প্রজেকশন লজিক।
  • flat/: 3840×2160 রেজোলিউশনে প্রথম টার্মিনাল-রেন্ডারিং ধাপ।
  • lens/: দ্বিতীয় ধাপ, যার মধ্যে lens/shaders/lens.sksl এবং ক্যামেরা-স্পেস ট্র্যাকার রয়েছে।
  • tools/: প্রধান রেন্ডার স্ক্রিপ্ট, সাউন্ড জেনারেটর, README মিডিয়া জেনারেটর এবং Slab পাইপলাইন।
  • score/: ঐচ্ছিক Slab স্কোর, প্রকল্প এবং রেন্ডার করা WAV ফাইল।
  • docs/: নকশার স্পেসিফিকেশন, প্রম্পট, সিদ্ধান্ত এবং fframes অবদান।

উন্নত বাস্তবায়ন নোট

দুই-ধাপের নকশাটি গুরুত্বপূর্ণ, কারণ শেডার বর্তমানে একই ফ্রেম থেকে কোনো SVG সাবট্রি স্যাম্পল করতে পারে না। এর পরিবর্তে, সম্পূর্ণ flat ফ্রেমটি সিঙ্ক্রোনাইজ করে শেডারে একটি ইমেজ ইনপুট হিসেবে পাঠানো হয়:

.image("iChannel0", &frame.get_synced_video_frame(..)?.into_image())

README-তে কয়েকটি ব্যবহারিক সীমাবদ্ধতাও নথিভুক্ত করা হয়েছে:

  • flat SkSL-এ সংরক্ষিত, তাই এটিকে হেল্পার নাম হিসেবে ব্যবহার করা এড়িয়ে চলুন।
  • Video স্তরে Svgr::empty()-এর পরিবর্তে একটি রুট <svg> ফেরত দিন; খালি রুট পরে রেন্ডারিং ত্রুটি হিসেবে প্রকাশ পেতে পারে।
  • CPU প্রজেকশন ফাংশন hud::project ট্র্যাকার ওভারলে-কে শেডারের ক্যামেরার সঙ্গে সমন্বিত রাখে।
  • উভয় ভিজ্যুয়াল ধাপ এবং সাউন্ড জেনারেটর একই HUD ট্র্যাকিং তথ্য পড়ে, ফলে ফোকাস ও অডিও ইভেন্টগুলো গ্লিফ থেকে বিচ্যুত হয় না।

উপসংহার

ff-tracking দেখায় কীভাবে সম্পূর্ণ কাঠামোবদ্ধ দৃশ্যের ডেটা, SVG, Rust, SkSL, GPU রেন্ডারিং এবং সংশ্লেষিত অডিও ব্যবহার করে একটি সংক্ষিপ্ত সিনেমাটিক সিকোয়েন্স তৈরি করা যায়। tools/render.sh দিয়ে শুরু করুন, মধ্যবর্তী ফ্রেমগুলো পরীক্ষা করুন, তারপর নিজের টার্মিনাল বার্তা, প্যালেট, ক্যামেরা মুভ এবং ট্র্যাক করা কম্পোজিশন তৈরি করতে SCENE_LIST সম্পাদনা করুন। একই সময়নির্ধারণ ও ক্যামেরা গতি অনুসরণ করে এমন স্কোর চাইলে ঐচ্ছিক Slab পাইপলাইন ব্যবহার করুন।