सभी लेख

· Casimiro Ferreira· 11 मिनट पढ़ें

एक वॉयस-क्लोनिंग इंजन चुनना

  • ONNX
  • voice cloning
  • voice conversion
  • self-hosted

वॉयस कन्वर्शन एक रिकॉर्डिंग और एक संदर्भ स्पीकर लेता है, और उन्हीं शब्दों को संदर्भ स्पीकर की आवाज़ में उत्पन्न करता है। पाइपलाइन में कहीं भी कोई टेक्स्ट शामिल नहीं है: इनपुट ऑडियो है, आउटपुट ऑडियो है, और मॉडल कभी कोई ट्रांसक्रिप्ट न पढ़ता है न लिखता है। यही इसे टेक्स्ट-टू-स्पीच (TTS) से अलग करता है, जो टेक्स्ट से शुरू होता है और जिसके पास संरक्षित करने के लिए कोई स्रोत रिकॉर्डिंग नहीं होती। वॉयस कन्वर्शन एक संकीर्ण सवाल का जवाब देता है: यह रिकॉर्डिंग देखते हुए, इसे किसी और जैसा सुनाओ, जबकि शब्दों को अक्षुण्ण रखो।

उस संकीर्ण काम के असली उपयोग हैं। दूसरे वॉयस एक्टर को काम पर रखे बिना किसी रिकॉर्डिंग को एक सुसंगत आवाज़ में डब करना। किसी साक्षात्कार या सपोर्ट कॉल में एक स्पीकर को गुमनाम बनाना जबकि शब्द ज्यों-के-त्यों रखना। किसी TTS प्रणाली के आउटपुट को भाषाओं में एक अकेली स्थिर पहचान देना, जब हर भाषा की अंतर्निहित आवाज़ें स्वतंत्र रूप से प्रशिक्षित की गई हों और अन्यथा अलग-अलग लोगों जैसी सुनाई देतीं।

voiceclonnx इनमें से 10 इंजनों को एक Python API के पीछे लागू करता है, सभी onnxruntime पर चलते हुए, इन्फ़रेंस के समय बिना किसी PyTorch की ज़रूरत के। इंजन एक-दूसरे के बदले उपयोग करने योग्य नहीं हैं। वे अलग-अलग मॉडल परिवारों से आते हैं, और एक चुनने का मतलब है एक समझौता चुनना, कोई विजेता नहीं।

API, संक्षेप में

from voiceclonnx import VoiceCloner

cloner = VoiceCloner(engine="facodec")
out = cloner.clone_voice("source.wav", "reference.wav", "out.wav")
print(cloner.sample_rate)   # 16000

clone_voice(audio, reference_voice, out_path) स्रोत रिकॉर्डिंग, लक्ष्य स्पीकर का 5-30 सेकंड का एक संदर्भ क्लिप, और एक आउटपुट पथ लेता है, और रूपांतरित WAV का पथ लौटाता है। इंजन बदलने का मतलब है engine= स्ट्रिंग बदलना; कॉल का आकार नहीं बदलता। एक इंजन, rvc, अपवाद है — यह एक संदर्भ रिकॉर्डिंग के बजाय एक .onnx वॉयस मॉडल का पथ लेता है, नीचे कवर किया गया। pip install voiceclonnx सभी 10 इंजन खींचता है; मॉडल पहले उपयोग पर Hugging Face से डाउनलोड होते हैं।

दो धुरियाँ, एक स्कोर नहीं

दो संख्याएँ बताती हैं कि कोई कन्वर्शन कितना अच्छा काम करता है, और वे साथ नहीं चलतीं।

Word error rate (WER) सुबोधता मापती है: मूल वाक्य का कितना हिस्सा बचा, यह आउटपुट को वापस एक स्पीच रिकग्नाइज़र से गुज़ारकर और स्रोत ट्रांसक्रिप्ट से तुलना करके आँका जाता है। 0% WER का मतलब है हर शब्द सही से आया।

स्पीकर समानता पहचान मापती है: क्या आउटपुट असल में लक्ष्य स्पीकर जैसा सुनाई देता है, मूल जैसा नहीं। इसकी गणना एक स्पीकर एम्बेडिंग निकालकर की जाती है — किसी आवाज़ के timbre का एक कॉम्पैक्ट संख्यात्मक फ़िंगरप्रिंट, वह टोनल रंग जो एक ही पिच और लाउडनेस पर एक आवाज़ को दूसरी से अलग सुनाता है — आउटपुट से और संदर्भ क्लिप से, फिर उन्हें कोसाइन समानता से तुलना करके। 1.0 का स्कोर समान timbre का मतलब है; voiceclonnx की अपनी बेसलाइन — लक्ष्य के विरुद्ध आँकी गई स्रोत की एक अपरिवर्तित प्रति — 0.09 पर बैठती है, इसलिए उससे सार्थक रूप से ऊपर कुछ भी असली कन्वर्शन काम कर रहा है।

voiceclonnx हर इंजन के लिए दोनों संख्याएँ प्रकाशित करता है, दो संदर्भ आवाज़ों में रूपांतरित उसी वाक्य के विरुद्ध मापी गई। WER faster-whisper से आता है; स्पीकर समानता एक wespeaker-resnet34 एम्बेडिंग मॉडल से आती है (दो अन्य के विरुद्ध क्रॉस-चेक की गई)। इन्हें साथ रखिए और एक पैटर्न दिखता है: कोई इंजन दोनों कॉलमों में शीर्ष पर नहीं है।

इंजनपरिवारWERलक्ष्य समानता
focalcodeckNN फ़ीचर-स्वैप15-19%0.61
lscodecस्पीकर-डीकपल्ड कोडेक~35%0.54
chatterboxAR कोडेक-LM4-8%0.54
knnvckNN फ़ीचर-स्वैप12-15%0.49
facodecफ़ैक्टराइज़्ड कोडेक0%0.44
openvoiceटोन-कलर ट्रांसफ़र0%0.37
bicodecसिमैंटिक + ग्लोबल टोकन12%0.29
triaanTriple-AAN4%0.29
cosyvoiceफ़्लो-मैचिंग8%0.21

(rvc किसी भी स्रोत को एक मनमाने संदर्भ क्लिप के बजाय एक स्थिर, समुदाय-प्रशिक्षित आवाज़ में बदलता है, इसलिए यह इस तालिका पर तुलनीय नहीं है; नीचे देखें।)

तालिका को पंक्ति दर पंक्ति पढ़ें, एक अकेली सबसे अच्छी पंक्ति खोजने के बजाय। facodec और openvoice 0% WER पर बैठते हैं — हर शब्द बचता है — मध्यम समानता के साथ। focalcodec और lscodec दूसरे छोर पर बैठते हैं: सेट में सबसे मज़बूत timbre ट्रांसफ़र, 15-35% शब्दों के ग़लत आने की क़ीमत पर ख़रीदा गया। chatterbox वह अकेला इंजन है जो दोनों धुरियों पर एक साथ अच्छा करता है (4-8% WER, 0.54 समानता), जो इसके आर्किटेक्चर का एक गुण है, आगे कवर किया गया।

परिवार अलग-अलग व्यवहार क्यों करते हैं

इंजन अलग-अलग तरीक़ों में बँटते हैं, और तरीक़ा भविष्यवाणी करता है कि कोई इंजन ऊपर वाली तालिका पर कहाँ उतरता है।

kNN फ़ीचर-स्वैप (knnvc, focalcodec). स्रोत ऑडियो को छोटे फ़्रेमों में तोड़ा जाता है, हर एक को एक पूर्व-प्रशिक्षित सेल्फ़-सुपरवाइज़्ड एन्कोडर द्वारा एक फ़ीचर वेक्टर में बदला जाता है। हर स्रोत फ़्रेम के लिए, एल्गोरिदम लक्ष्य स्पीकर के फ़ीचर्स के एक पूल में k निकटतम फ़्रेम ढूँढता है और उन्हें औसत करके अंदर लाता है, स्रोत के timbre फ़्रेम को फ़्रेम-दर-फ़्रेम बदलते हुए जबकि अंतर्निहित ध्वन्यात्मक सामग्री को वहीं छोड़ता है जहाँ से इसे एन्कोडर के अपने प्रतिनिधित्व से निकाला गया था। कोई सीखा हुआ डीकोडर नहीं है जो एक आवाज़ को दूसरी में मैप करता हो — स्वैप एक निकटतम-पड़ोसी लुकअप है — यही कारण है कि timbre ट्रांसफ़र आक्रामक हो सकता है (focalcodec 0.61 समानता तक पहुँचता है) उन फ़्रेमों को कभी-कभी बिगाड़ने की क़ीमत पर जिनका लक्ष्य पूल में एक ख़राब मिलान था, जो WER के रूप में सामने आता है।

फ़ैक्टराइज़्ड कोडेक (facodec). एक न्यूरल ऑडियो कोडेक — एक मॉडल जो वाणी को एक कॉम्पैक्ट टोकन अनुक्रम में संपीड़ित करता है और उसे पुनर्निर्मित करता है — उन टोकनों को स्पष्ट रूप से अलग सामग्री और timbre स्ट्रीमों में विभाजित करने के लिए प्रशिक्षित। चूँकि सामग्री एक समर्पित स्ट्रीम है, डीकोडर शब्दों को उच्च निष्ठा के साथ पुनर्निर्मित करता है; केवल timbre स्ट्रीम को लक्ष्य स्पीकर के लिए बदला जाता है। वही स्पष्ट विभाजन है जिसके कारण facodec 0% WER तक पहुँचता है: सामग्री संरक्षण किसी चीज़ से प्रतिस्पर्धा नहीं कर रहा।

टोन-कलर ट्रांसफ़र (openvoice). एक अलग एन्कोडर द्वारा भाषाई सामग्री को तय करने के बाद एक कन्वर्शन मॉड्यूल टोन कलर — पिच कंटूर और timbre — बदलता है, भावना में फ़ैक्टराइज़्ड कोडेक तरीक़े जैसा पर एक असतत टोकनों के बजाय mel-spectrogram पर एक कलर-ट्रांसफ़र क़दम के रूप में लागू। यह भी 0% WER तक पहुँचता है, facodec से कुछ कम समानता के साथ।

AR कोडेक-LM (chatterbox). एक ऑटोरिग्रेसिव भाषा मॉडल जो लक्ष्य स्पीकर की एम्बेडिंग पर संधारित, एक-एक करके कोडेक टोकन पूर्वानुमानित करता है, बहुत हद तक एक टेक्स्ट-टू-स्पीच भाषा मॉडल की तरह पर टेक्स्ट के बजाय स्रोत रिकॉर्डिंग की सामग्री टोकनों पर संधारित। चूँकि यह प्रोसोडी (लय, बल, स्वर) को उसी ऑटोरिग्रेसिव प्रक्रिया के हिस्से के रूप में उत्पन्न करता है बजाय इसे सीधे स्रोत से कॉपी करने के, यह timbre के साथ बोलने की शैली भी ले जा सकता है — यही कारण है कि दस्तावेज़ बताते हैं कि यह “सबसे मज़बूत स्रोत-से-लक्ष्य शिफ़्ट” देता है — और यह वह अकेला इंजन है जो सुबोधता और समानता दोनों पर एक साथ अच्छा स्कोर करता है।

फ़्लो-मैचिंग (cosyvoice). एक निरंतर जनरेटिव प्रक्रिया जो एक ODE (ordinary differential equation) सॉल्वर को एक कॉन्फ़िगर करने योग्य संख्या में क़दम चलाते हुए (ode_steps, डिफ़ॉल्ट 10) क्रमिक रूप से शोर को लक्ष्य mel-spectrogram में परिष्कृत करती है। इसका सामग्री एन्कोडर क्रॉस-भाषिक ट्रांसफ़र के लिए बनाया गया है, और वही सामान्यता शायद इस बात का कारण है कि इसका लक्ष्य-समानता स्कोर सेट में सबसे कम है: प्रतिनिधित्व भाषा-स्वतंत्रता के लिए अनुकूलित है, सबसे कड़े स्पीकर मिलान के लिए नहीं।

स्पीकर-डीकपल्ड कोडेक (lscodec). facodec की तरह, सामग्री को स्पीकर पहचान से अलग करने के लिए प्रशिक्षित एक कोडेक, पर सामग्री स्ट्रीम की सटीकता की सीधी क़ीमत पर समानता को और आगे धकेलने के लिए ट्यून किया गया, सेट में दूसरी-सबसे-अधिक समानता के साथ ~35% WER पर उतरता है।

Triple-AAN और semantic-plus-global-token कोडेक (triaan, bicodec) दोनों धुरियों पर बीच में बैठते हैं: मध्यम WER, मध्यम समानता, किसी भी दिशा में कोई मज़बूत झुकाव नहीं।

Any-to-ONE कोडेक + वोकोडर (rvc). ContentVec (एक सामग्री एन्कोडर) पर बना जो एक VITS वोकोडर को फ़ीड करता है, एक मनमाना संदर्भ क्लिप स्वीकार करने के बजाय प्रति लक्ष्य आवाज़ प्रशिक्षित। इस इंजन के लिए reference_voice एक ऑडियो फ़ाइल नहीं, एक .onnx RVC मॉडल फ़ाइल या Hugging Face रिपो ID का एक पथ है:

cloner = VoiceCloner(engine="rvc")
out = cloner.clone_voice("source.wav", "/path/to/myvoice.onnx", "out.wav")

चूँकि हर RVC मॉडल एक लक्ष्य आवाज़ पर प्रशिक्षित है, यह इन्फ़रेंस के समय कोई संदर्भ क्लिप नहीं लेता और इसे any-to-any इंजनों की उसी समानता बेंचमार्क पर स्कोर नहीं किया जाता। इसका मापा गया 38% WER एक नमूना समुदाय-प्रशिक्षित मॉडल को दर्शाता है, सामान्य रूप से आर्किटेक्चर को नहीं — गुणवत्ता इस पर निर्भर करती है कि वह विशेष मॉडल कैसे प्रशिक्षित किया गया था। Hugging Face पर हज़ारों समुदाय RVC आवाज़ें मौजूद हैं और रिपो ID से सीधे लोड होती हैं।

कौन-सा चलाना है यह तय करना

तेज़, सामान्य-उद्देश्य पाइपलाइन। facodec या openvoice से शुरू करें। दोनों मध्यम समानता (0.44 और 0.37) के साथ 0% मापित WER पर पहुँचते हैं, और दोनों बिना किसी सूचीबद्ध गुणवत्ता गिरावट के एक INT8 क्वांटाइज़्ड वेरिएंट भेजते हैं — एक छोटे, तेज़ मॉडल के लिए quantized=True पास करें।

अधिकतम स्पीकर समानता। focalcodec (0.61 समानता, सबसे अधिक मापी गई) का उपयोग करें अगर 15-19% WER उपयोग-मामले के लिए स्वीकार्य है, या chatterbox (0.54 समानता, 4-8% WER) अगर नहीं है। chatterbox 24 kHz पर भी चलता है, सेट में किसी भी any-to-any कन्वर्शन के लिए सबसे उच्च आउटपुट दर — rvc ऊपर वाले any-to-ONE मोड में ही 48 kHz तक चलता है।

कम-संसाधन हार्डवेयर। knnvc INT8 पर डिस्क पर लगभग 123 MB है, सेट में सबसे छोटा फ़ुटप्रिंट, 0.49 समानता और 12-15% WER के साथ — सीमित मेमोरी के लिए एक उचित समझौता। हर इंजन साफ़-सुथरे ढंग से क्वांटाइज़ नहीं होता: focalcodec और cosyvoice INT8 में बिगड़ने के रूप में दस्तावेज़ीकृत हैं, इसलिए उन दोनों को fp32 में रखें।

एक ऐसी भाषा जिस पर इंजन प्रशिक्षित नहीं था। cosyvoice का सामग्री एन्कोडर क्रॉस-भाषिक ट्रांसफ़र के लिए बना है, जो इसे उसी-भाषा कन्वर्शन के लिए ट्यून किए गए इंजन के बजाय चुनने का दस्तावेज़ीकृत कारण है, भले ही इसकी मापी गई समानता (0.21) नौ सीधे तुलनीय इंजनों में सबसे कम है।

सटीक शब्द-प्रयोग से अधिक वॉयस पहचान। lscodec कोडेक-परिवार इंजनों में सबसे मज़बूत timbre ट्रांसफ़र देता है (0.54, chatterbox के बराबर) तुलनीय सेट में सबसे अधिक WER (~35%) की क़ीमत पर। इसे चुनें जब लक्ष्य हो “क्या यह लक्ष्य स्पीकर जैसा सुनाई देता है” और आउटपुट में कभी-कभार शब्द त्रुटियाँ सहनीय हों।

मनमाने क्लिप के बजाय एक अकेली स्थिर समुदाय आवाज़। rvc, एक संदर्भ रिकॉर्डिंग के बजाय एक पूर्व-प्रशिक्षित .onnx वॉयस मॉडल का उपयोग करते हुए।

पहले जाँचने के लिए ग़ैर-व्यावसायिक बाधा। bicodec वेट्स CC BY-NC-SA 4.0 लाइसेंस प्राप्त हैं। हर दूसरे इंजन के वेट्स MIT, Apache-2.0, या CC BY 4.0 हैं। इसे व्यावसायिक रूप से भेजने से पहले जिस विशेष वेट को आप परिनियोजित करते हैं उसका लाइसेंस सत्यापित करें।

यह क्या अच्छी तरह नहीं करता, और इसे किस पर उपयोग नहीं करना चाहिए

ऊपर की हर संख्या के साथ एक ही चेतावनी आती है: संख्याएँ एक अंग्रेज़ी डेमो वाक्य का वर्णन करती हैं जो दो विशेष संदर्भ आवाज़ों के बीच रूपांतरित किया गया। एक अलग भाषा, एक अधिक शोर वाली स्रोत रिकॉर्डिंग, एक छोटा या कम-गुणवत्ता वाला संदर्भ क्लिप, या एक स्रोत स्पीकर जिसकी आवाज़ किसी इंजन के प्रशिक्षण डेटा में मौजूद किसी भी चीज़ से बहुत दूर बैठती है, ये सभी संख्याओं को हिलाएँगे, आमतौर पर बदतर की ओर। इनमें से कोई भी इंजन किसी कम-गुणवत्ता वाली स्रोत रिकॉर्डिंग के लिए एक सार्वभौमिक समाधान नहीं है — इनमें से कई ख़ुशी-ख़ुशी स्रोत शोर को सीधे ले जाते हुए timbre बदल देते हैं, क्योंकि शोर का अपना ध्वनिक हस्ताक्षर होता है जिसे सामग्री/timbre विभाजन हमेशा साफ़-सुथरे ढंग से अलग नहीं करता।

वॉयस कन्वर्शन एक असली जोखिम भी उठाता है जिसके बारे में इसके क़रीबी चचेरे भाई, TTS के लिए वॉयस क्लोनिंग ने, इस टीम को पहले ही सोचने पर मजबूर किया था: किसी रिकॉर्डिंग को किसी असली, पहचानने योग्य व्यक्ति जैसा सुनाने में बदलना नक़ल-सक्षम तकनीक है, चाहे वह मंशा रही हो या न रही हो। जो नियम यह टीम सामान्यतः सिंथेटिक आवाज़ों पर लागू करती है — किसी असली व्यक्ति की आवाज़ को दाता या लक्ष्य के रूप में उपयोग करने से पहले स्पष्ट अनुमति प्राप्त करना, और जब अनुमति संभव न हो तो पब्लिक-डोमेन रिकॉर्डिंग या जानबूझकर एक मौलिक आवाज़ पर वापस जाना — यहाँ बिना किसी अपवाद के लागू होता है। किसी असली व्यक्ति का एक संदर्भ क्लिप, सहमति के नज़रिए से, उनकी आवाज़ के एक पूरे प्रशिक्षण सेट से अलग नहीं है; इसे एक उपयोग-योग्य परिणाम देने में बस बहुत कम लगता है, जो कम नहीं, अधिक सावधानी का कारण है।

अगर वॉयस कन्वर्शन आपके बना रहे किसी पाइपलाइन का हिस्सा है, तो संपर्क के ज़रिए पहुँचें या देखें हम क्या पेशकश करते हैं