যে সমস্যার সমাধান করে
বড় ভিডিও লাইব্রেরি কার্যত সার্চ করা যায় না। ফ্যানরা আধা-মনে-থাকা একটি মুহূর্ত খুঁজতে ঘণ্টার পর ঘণ্টা ফুটেজ টেনে দেখেন, কোর্সের শিক্ষার্থীরা একটি ব্যাখ্যা খুঁজতে পুরো লেসন আবার দেখেন, আর কোম্পানিগুলো রেকর্ড করা আলোচনায় চাপা পড়া প্রাতিষ্ঠানিক জ্ঞান হারায়। টাইমস্ট্যাম্পসহ ট্রান্সক্রিপ্ট ইনডেক্স করলে প্রতিটি লাইব্রেরি ডকুমেন্টের মতো সার্চযোগ্য হয়, আর ফলাফল সরাসরি সঠিক মুহূর্তে নিয়ে যায়।
প্রথম ভার্সনে কী কী রাখবেন
- চ্যানেল বা প্লেলিস্টের প্রতিটি ভিডিও জুড়ে বাক্যাংশ ও কিওয়ার্ড সার্চ
- মিলে যাওয়া বাক্যসহ ফলাফল, সাথে ঠিক টাইমস্ট্যাম্পের লিংক
- সিমান্টিক সার্চ, যাতে "আমার প্রোডাক্টের দাম কীভাবে ঠিক করব" লিখলে "আপনার রেট নির্ধারণ"-ও পাওয়া যায়
- তারিখ, ভিডিও ও বক্তা অনুযায়ী ফিল্টার
- নতুন আপলোড স্বয়ংক্রিয়ভাবে ইনডেক্স করা
ধাপে ধাপে কীভাবে বানাবেন
- 01
ভিডিও তালিকা সংগ্রহ করুন
চ্যানেল হ্যান্ডেল বা প্লেলিস্ট URL দিয়ে /channels/resolve বা /playlists/resolve কল করে প্রতিটি ভিডিও ID ও টাইটেল নিন।
- 02
একসাথে অনেক ট্রান্সক্রিপ্ট আনুন
format.timestamp ও format.paragraphs চালু করে ID-গুলো /batch-এ পাঠান। বড় ব্যাচ অ্যাসিঙ্ক্রোনাসভাবে চলে, তাই /batch/{batch_id} পোল করুন বা ওয়েবহুক ব্যবহার করুন।
- 03
সেগমেন্ট ইনডেক্স করুন
প্রতিটি অনুচ্ছেদ তার ভিডিও ID ও শুরুর সময়সহ সংরক্ষণ করুন। কিওয়ার্ড সার্চের জন্য Postgres ফুল-টেক্সট সার্চই যথেষ্ট; অর্থভিত্তিক সার্চের জন্য pgvector বা ভেক্টর ডেটাবেসে এমবেডিং যোগ করুন।
- 04
সার্চ UI বানান
আশেপাশের টেক্সটসহ সেরা মিলগুলো দেখান, সাথে youtube.com/watch?v=ID&t=SECONDS ধরনের লিংক দিন যাতে ব্যবহারকারী ঠিক সেই মুহূর্তে পৌঁছান।
- 05
আপডেট রাখুন
একটি নির্ধারিত জব চালান যা চ্যানেলটি আবার রিজলভ করে, নতুন ভিডিও ID খুঁজে বের করে এবং শুধু সেগুলোই ট্রান্সক্রাইব করে।
স্টার্টার কোড
এই আইডিয়াটি "রেসিপি 3: পুরো প্লেলিস্ট একসাথে নলেজ বেসে লোড করুন" প্যাটার্নের ওপর তৈরি। নিজের চ্যানেল, প্রম্পট ও স্টোরেজ বসিয়ে নিন।
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
playlist = requests.post(f"{API}/playlists/resolve", headers=HEADERS,
json={"playlist_url": "https://www.youtube.com/playlist?list=PLAYLIST_ID",
"limit": 100}).json()
ids = [v["video_id"] for v in playlist["items"]]
batch = requests.post(f"{API}/batch", headers=HEADERS, json={
"video_ids": ids,
"format": {"timestamp": True, "paragraphs": True},
}).json()
# Large batches run async: poll GET /batch/{batch_id} until status is "completed"
for r in batch.get("results", []):
if r["status"] == "completed":
for p in r["data"]["transcript"].get("paragraphs") or []:
store(video_id=r["video_id"], start=p["start"], text=p["text"]) # your vector DBকেন বানানো মূল্যবান
দর্শকের কাছে নয়, লাইব্রেরির মালিকের কাছে বিক্রি করুন: পডকাস্ট নেটওয়ার্ক, কোর্স প্ল্যাটফর্ম আর অভ্যন্তরীণ ভিডিও আর্কাইভ থাকা কোম্পানিগুলো এমন সার্চের জন্য মাসিক ফি দেবে যা তাদের অডিয়েন্সকে ধরে রাখে। ফ্যান কমিউনিটির জন্য ফ্রি পাবলিক সার্চ আর অ্যালার্ট বা API অ্যাক্সেসের পেইড টিয়ারও কাজ করে।
যে ভুলগুলো এড়াবেন
- পুরো ট্রান্সক্রিপ্টকে একটি ডকুমেন্ট হিসেবে ইনডেক্স করা: অনুচ্ছেদ-স্তরের টাইমস্ট্যাম্প ছাড়া সার্চ ফলাফল অকেজো হয়ে যায়।
- কোন ভিডিও ID ইতিমধ্যে প্রসেস হয়েছে তা ট্র্যাক না করে প্রতিবার আপডেটে পুরো চ্যানেল আবার ট্রান্সক্রাইব করা।
- শুধু হুবহু কিওয়ার্ড মিলের ওপর নির্ভর করা: কথ্য ভাষা অগোছালো, তাই শুরুতেই সিমান্টিক সার্চ যোগ করুন।
এই আইডিয়া নিয়ে প্রশ্ন
YouTube ট্রান্সক্রিপ্ট সার্চ করতে কি ভেক্টর ডেটাবেস লাগবে?
না। বেশিরভাগ লাইব্রেরির জন্য Postgres ফুল-টেক্সট সার্চ কিওয়ার্ড সার্চ ভালোভাবেই সামলায়। হুবহু শব্দের বদলে অর্থ মেলে এমন ফলাফল চাইলে এমবেডিং যোগ করুন।
সার্চ ফলাফলকে ভিডিওর ঠিক মুহূর্তে কীভাবে লিংক করব?
প্রতিটি ট্রান্সক্রিপ্ট সেগমেন্টে সেকেন্ডে শুরুর সময় থাকে। YouTube URL-এর শেষে &t= এবং তারপর সেই সংখ্যাটি জুড়ে দিন।
ক্যাপশন নেই এমন ভিডিও কি ইনডেক্স করা যায়?
হ্যাঁ। একটি ওয়েবহুক URL-সহ allow_asr চালু করুন, ক্যাপশন না থাকলে API AI স্পিচ রিকগনিশন দিয়ে অডিও ট্রান্সক্রাইব করবে।