मैंने अपना TTS इंजन बदला। API कॉल सबसे आसान हिस्सा था।
Google Chirp 3 HD को AI डबिंग पाइपलाइन में इंटीग्रेट करना सिर्फ API स्वैप नहीं था। जानिए कैसे टाइमिंग, ट्रांसलेशन और ऑडियो अलाइनमेंट ने असली चुनौती पेश की।
13 सितंबर 2026
Katto में पहले से AI डबिंग थी। क्रिएटर एक शॉर्ट क्लिप ले सकते थे, भाषा चुन सकते थे, और ट्रांसलेटेड वर्जन पा सकते थे। शुरुआती वर्जन Kokoro इस्तेमाल करता था और आठ भाषाओं को कवर करता था।
हाल ही में मैंने प्राइमरी स्पीच इंजन को Google Cloud Text-to-Speech के साथ Chirp 3 HD पर माइग्रेट किया। लक्ष्य सीधा लग रहा था: आवाज़ों को बेहतर बनाना और ज़्यादा भाषाएँ जोड़ना। अब Katto एडिटर में 19 डबिंग भाषाएँ और 12 क्यूरेटेड वॉइसेज़ उपलब्ध हैं।
मुझे उम्मीद थी कि माइग्रेशन ज़्यादातर एक API स्वैप होगा। ऐसा नहीं था।
एक नेचुरल सेंटेंस जेनरेट करना आसान है। उस सेंटेंस को ठीक उसी स्पेस में शुरू और खत्म करवाना जो दूसरे स्पीकर ने छोड़ा है—यही असली डबिंग प्रॉब्लम है।
अगर ओरिजिनल स्पीकर 2.4 सेकंड में कुछ कहता है और ट्रांसलेशन 3.2 सेकंड लेता है, तो एक अच्छा TTS मॉडल क्लिप को नहीं बचा सकता। आवाज़ अगली सेंटेंस में घुस जाती है, कैप्शन्स ड्रिफ्ट करते हैं, या स्पीच को इतना तेज़ करना पड़ता है कि वो रश्ड लगने लगती है।
TTS रिक्वेस्ट सिस्टम का सबसे छोटा हिस्सा निकला।
जो पाइपलाइन मैंने बनाई
cached word timings
|
v
phrase segments with fixed time slots
|
v
length-aware translation
|
v
Google Chirp 3 HD, one phrase at a time
|
v
bounded audio alignment with FFmpeg
|
+----> translated captions from the same segments
|
v
final MP4 remuxहर स्टेज इसलिए मौजूद है क्योंकि एक सिम्पलर वर्जन किसी दूसरे तरीके से फेल हुआ था।
ओरिजिनल टाइमिंग को डेटा के रूप में रखना
Katto के पास पहले से ट्रांसक्रिप्शन पाइपलाइन से वर्ड टाइमस्टैम्प्स हैं। मैं पूरे ट्रांसक्रिप्ट को एक ब्लॉक के रूप में ट्रांसलेशन और TTS को नहीं भेजता। मैं वर्ड्स को फ्रेज़ेज़ में ग्रुप करता हूँ।
एक फ्रेज़ सेंटेंस पंक्चुएशन पर, 0.6 सेकंड से लंबे पॉज़ के बाद, या जब वो छह सेकंड से ज़्यादा हो जाए तो खत्म होता है। हर सेगमेंट अपना ओरिजिनल स्टार्ट और एंड रिटेन करता है। वो नंबर्स हर बाद के स्टेज के लिए कॉन्ट्रैक्ट बन जाते हैं।
पूरे ट्रांसक्रिप्ट को सिंथेसाइज़ करना ज़्यादा स्मूद लग सकता है, लेकिन ये उन एंकर्स को हटा देता है जो स्पीच को वीडियो टाइमलाइन पर वापस रखने के लिए ज़रूरी हैं। फ्रेज़-लेवल सिंथेसिस नेचुरल वॉइस के लिए काफी कॉन्टेक्स्ट प्रिज़र्व करता है जबकि यूज़फुल टाइमिंग बाउंड्रीज़ भी रखता है।
स्पोकन ड्यूरेशन के लिए ट्रांसलेट करना, सिर्फ मीनिंग के लिए नहीं
एक करेक्ट रिटन ट्रांसलेशन एक बैड डबिंग ट्रांसलेशन हो सकता है। कुछ भाषाओं को वही आइडिया एक्सप्रेस करने के लिए ज़्यादा सिलेबल्स चाहिए। एक लिटरल वर्जन हर न्यूआंस प्रिज़र्व कर सकता है और फिर भी अनयूज़ेबल हो सकता है क्योंकि वो अपने स्लॉट में फिट नहीं होता।
फ्रेज़ेज़ के हर ग्रुप के लिए, मैं Claude Haiku से एक नेचुरल स्पोकन ट्रांसलेशन माँगता हूँ जो शॉर्टर फ्रेज़िंग और कम सिलेबल्स को प्रेफर करे। रिस्पॉन्स हर सोर्स सेगमेंट इंडेक्स को प्रिज़र्व करता है।
प्रॉम्प्ट ऑडियो सिस्टम का हिस्सा है। इसका काम सिर्फ लिंग्विस्टिक एक्यूरेसी नहीं है। ये बाद में ज़रूरी टाइम स्ट्रेचिंग को भी कम करता है।
ये एक ह्यूरिस्टिक ही रहता है। एक LLM ड्यूरेशन की गारंटी नहीं दे सकता क्योंकि सिलेक्टेड वॉइस भी पेसिंग बदलती है। ऑडियो लेयर अब भी जेनरेटेड WAV को मेज़र करती है। टार्गेट लैंग्वेज और सोर्स सेगमेंट्स से इंडेक्स किया गया इन-प्रोसेस कैश, worker के चलते रहने तक रिपीट रेंडर्स में उसी ट्रांसलेशन को दोबारा इस्तेमाल करने देता है।
एक बार में एक फ्रेज़ सिंथेसाइज़ करना
हर ट्रांसलेटेड फ्रेज़ Google Cloud Text-to-Speech REST API को 24 kHz LINEAR16 ऑडियो के रूप में जाता है। वॉइस नेम्स Google द्वारा डॉक्यूमेंटेड locale-Chirp3-HD-speaker फॉर्मेट को फॉलो करते हैं।
Google Katto के मौजूदा एक्सपोज़र से ज़्यादा Chirp 3 HD लोकेल्स को सपोर्ट करता है। मैंने जानबूझकर प्रोडक्ट को 19 भाषाओं तक लिमिट किया जो कम्प्लीट पाथ से वायर्ड हैं: UI, लोकेल मैपिंग, फॉन्ट्स, कैप्शन्स और फॉलबैक बिहेवियर। एक API का किसी भाषा को क्लेम करना इसका मतलब नहीं कि आसपास का प्रोडक्ट उसे करेक्टली सपोर्ट करता है।
स्पीच को स्लॉट में फिट करना बिना उसे खराब किए
सिंथेसिस के बाद, मैं जेनरेटेड ड्यूरेशन की तुलना ओरिजिनल स्लॉट से करता हूँ।
target_duration = segment["end"] - segment["start"]
ratio = generated_duration / target_duration
अगर स्पीच थोड़ी ज़्यादा लंबी है, तो FFmpeg का atempo फिल्टर उसे स्पीड अप करता है जबकि पिच प्रिज़र्व करता है। मैं स्पीडअप को 1.3x पर कैप करता हूँ।
वो कैप मैटर करती है। एक पहले की 1.6x लिमिट ने ज़्यादा फ्रेज़ेज़ को फिट किया, लेकिन कुछ वॉइसेज़ अननेचुरली हरीड लगने लगीं। परफेक्ट अलाइनमेंट यूज़फुल नहीं है अगर रिज़ल्ट अनप्लेज़ेंट है।
हर एडजस्टेड फ्रेज़ को मास्टर ट्रैक में उसके ओरिजिनल ऑफसेट पर रखा जाता है। शॉर्ट फ्रेज़ेज़ एक नेचुरल पॉज़ छोड़ते हैं। लॉन्गर फ्रेज़ेज़ को एक बाउंडेड करेक्शन मिलता है। ये हर पैथोलॉजिकल ट्रांसलेशन को सॉल्व नहीं करता। ये एक ज़्यादा यूज़फुल रूल एनफोर्स करता है: मैथमेटिकली परफेक्ट टाइमिंग का पीछा करने से पहले इंटेलिजिबिलिटी प्रिज़र्व करो।
स्पीच और कैप्शन्स को एक ही क्लॉक देना
सिंथेसिस रिस्पॉन्स मुझे ऑडियो देता है, नई स्पोकन टेक्स्ट के लिए रिलायबल वर्ड टाइमस्टैम्प्स नहीं। वर्ड-लेवल टाइमिंग इन्वेंट करना कैप्शन्स को प्रिसाइज़ दिखाएगा जबकि वो गलत होंगे।
डब्ड क्लिप्स इसलिए फ्रेज़-लेवल कैप्शन्स इस्तेमाल करते हैं जो उन्हीं ट्रांसलेटेड सेगमेंट्स से जेनरेट होते हैं जो स्पीच के लिए इस्तेमाल हुए। उनके स्टार्ट और एंड टाइम्स पहले से ऑडियो प्लेसमेंट से मैच करते हैं।
रेंडरर वो फॉन्ट्स भी सिलेक्ट करता है जो टार्गेट स्क्रिप्ट को कवर करते हैं। लैटिन फॉन्ट्स जापानी, चाइनीज़, हिंदी या अरबी के लिए काफी नहीं हैं। इंट्रो टाइटल्स और AI हुक्स वही लोकलाइज़ेशन पाथ फॉलो करते हैं, इसलिए स्क्रीन एक भाषा बोले और दूसरी डिस्प्ले करे ऐसा नहीं होता।
प्रोडक्शन की सामान्य समस्याएँ भी मैटर करती हैं
हर क्यूरेटेड स्पीकर हर लोकेल में काम नहीं करता जिसे मैंने टेस्ट किया। अगर सिलेक्टेड वॉइस अनअवेलेबल है, तो Katto चुने गए जेंडर के लिए एक नोन डिफॉल्ट के साथ एक बार रिट्राई करता है। एडिटर का लाइव प्रीव्यू वही Google इंजन कॉल करता है। दूसरे मॉडल से एक सैंपल यूज़र को एक ऐसी वॉइस चुनने देगा जो उन्हें कभी नहीं मिलती।
प्रोडक्शन API की VPS IPv4 एड्रेस तक रिस्ट्रिक्टेड है, लेकिन VPS ने Google तक पहुँचते समय IPv6 को प्रेफर किया। वैलिड रिक्वेस्ट्स रिजेक्ट हो रही थीं जब तक TTS कॉल को IPv4 के ज़रिए फोर्स नहीं किया गया। API, की और कोड करेक्ट थे। नेटवर्क पाथ नहीं था।
डबिंग एक सेपरेट वीडियो वेरिएंट प्रोड्यूस करती है। अगर ट्रांसलेशन, सिंथेसिस, कैप्शन रेंडरिंग या रीमक्सिंग फेल होती है, तो ओरिजिनल क्लिप इंटैक्ट रहती है। मूल आठ भाषाओं के लिए, Google पाथ डिसेबल या अनकॉन्फिगर्ड होने पर Kokoro उपलब्ध रहता है।
क्या बदला और क्या नहीं
विज़िबल रिज़ल्ट 8 से 19 डबिंग भाषाओं का एक्सपैंशन था, प्लस सिलेक्टेबल वॉइसेज़ और लाइव प्रीव्यूज़।
डीपर इम्प्रूवमेंट आर्किटेक्चरल था। ट्रांसलेशन, स्पीच, कैप्शन्स, ओवरलेज़ और वीडियो रेंडरिंग अब एक टेम्पोरल यूनिट शेयर करते हैं: फ्रेज़ सेगमेंट।
सिस्टम ओरिजिनल स्पीकर को क्लोन नहीं करता, लिप सिंक परफॉर्म नहीं करता या जेनरेटेड वर्ड टाइमस्टैम्प्स इन्वेंट नहीं करता। बहुत लंबे ट्रांसलेशन्स अब भी अपने आइडियल स्लॉट से एक्सीड कर सकते हैं। वो लिमिट्स उस प्रिसिज़न को क्लेम करने से बेहतर हैं जो पाइपलाइन डिलीवर नहीं कर सकती।
मुझे लगा मैं एक स्पीच इंजन रिप्लेस कर रहा हूँ। मैंने मीडिया पाइपलाइन के लगभग हर स्टेज के बीच कॉन्ट्रैक्ट को टाइट कर दिया।
API कॉल आसान हिस्सा था। रिज़ल्ट को ओरिजिनल टाइमलाइन पर बिलॉन्ग करवाना असली काम था।
Katto लंबे वीडियोज़ को शॉर्ट वर्टिकल क्लिप्स में बदलता है और अब उन क्लिप्स को 19 भाषाओं में डब कर सकता है। अगर आप मल्टीलिंगुअल वीडियो बना रहे हैं, तो मुझे सुनने में दिलचस्पी होगी कि आप टाइमिंग को कैसे हैंडल करते हैं बिना वॉइस को रश्ड बनाए।
रेफरेंसेज़:
अपने वीडियो को वायरल क्लिप में बदलने के लिए तैयार हैं?
Katto आपके लंबे वीडियो को अपने आप काटता, कैप्शन जोड़ता और रीफ़्रेम करके शॉर्ट-फ़ॉर्म कंटेंट बनाता है।
Katto मुफ़्त आज़माएँ →