यह कौन सी समस्या हल करता है
बड़ी वीडियो लाइब्रेरी असल में सर्च ही नहीं हो पातीं। फ़ैन आधा-अधूरा याद किसी पल को ढूंढने के लिए घंटों का फ़ुटेज आगे-पीछे करते हैं, कोर्स के छात्र एक एक्सप्लेनेशन के लिए पूरा लेसन दोबारा देखते हैं, और कंपनियों का ज्ञान रिकॉर्ड की गई टॉक्स में दबा रह जाता है। टाइमस्टैम्प के साथ ट्रांसक्रिप्ट इंडेक्स करने से हर लाइब्रेरी एक डॉक्यूमेंट की तरह सर्च होने लगती है, और नतीजे सीधे सही पल पर ले जाते हैं।
पहले वर्ज़न में क्या शामिल करें
- किसी चैनल या प्लेलिस्ट के हर वीडियो में वाक्यांश और कीवर्ड सर्च
- नतीजों में मैच होने वाला वाक्य और सटीक टाइमस्टैम्प का लिंक
- सिमेंटिक सर्च, ताकि "अपने प्रोडक्ट की कीमत कैसे तय करूं" से "अपने रेट तय करना" भी मिल जाए
- तारीख, वीडियो और स्पीकर के हिसाब से फ़िल्टर
- नए अपलोड की ऑटोमैटिक इंडेक्सिंग
इसे कैसे बनाएं, स्टेप बाय स्टेप
- 01
वीडियो लिस्ट इकट्ठा करें
चैनल हैंडल या प्लेलिस्ट URL के साथ /channels/resolve या /playlists/resolve कॉल करें और हर वीडियो ID और टाइटल पाएं।
- 02
ट्रांसक्रिप्ट बल्क में लाएं
ID को format.timestamp और format.paragraphs चालू करके /batch पर भेजें। बड़े बैच एसिंक्रोनस चलते हैं, इसलिए /batch/{batch_id} को पोल करें या वेबहुक इस्तेमाल करें।
- 03
सेगमेंट इंडेक्स करें
हर पैराग्राफ़ को उसकी वीडियो ID और स्टार्ट टाइम के साथ स्टोर करें। कीवर्ड सर्च के लिए Postgres फ़ुल-टेक्स्ट सर्च काफ़ी है; अर्थ के आधार पर सर्च के लिए pgvector या किसी वेक्टर डेटाबेस में एम्बेडिंग जोड़ें।
- 04
सर्च UI बनाएं
आसपास के टेक्स्ट के साथ टॉप मैच और youtube.com/watch?v=ID&t=SECONDS जैसा लिंक लौटाएं, ताकि यूज़र सीधे उसी पल पर पहुंचे।
- 05
इसे अपडेट रखें
एक शेड्यूल्ड जॉब चलाएं जो चैनल को फिर से resolve करे, नई वीडियो 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 स्पीच रिकग्निशन से ऑडियो ट्रांसक्राइब कर देता है।