همهٔ مقاله‌ها

· Casimiro Ferreira· 10 دقیقه مطالعه

انتخاب یک موتور شبیه‌سازی صدا

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

تبدیل صدا یک ضبط و یک گویندهٔ مرجع می‌گیرد و همان واژه‌ها را با صدای گویندهٔ مرجع تولید می‌کند. هیچ‌جای این خط لوله متن دخالتی ندارد: ورودی صداست، خروجی صداست، و مدل هرگز یک رونوشت را نمی‌خواند یا نمی‌نویسد. همین چیزی است که آن را از متن به گفتار (TTS) جدا می‌کند، که از متن آغاز می‌شود و هیچ ضبط مبدأیی برای حفظ کردن ندارد. تبدیل صدا به پرسشی محدودتر پاسخ می‌دهد: با این ضبط، آن را طوری کنید که مانند شخص دیگری به نظر برسد، در حالی که واژه‌ها دست‌نخورده بمانند.

آن کارِ محدودتر کاربردهای واقعی دارد. دوبله‌کردن یک ضبط به یک صدای یکدست بدون استخدام یک دوبلور دوم. ناشناس‌سازی یک گوینده در یک مصاحبه یا یک تماس پشتیبانی در حالی که واژه‌ها کلمه‌به‌کلمه حفظ می‌شوند. دادن یک هویت واحد و پایدار به خروجی یک سامانهٔ TTS در سراسر زبان‌ها، وقتی صداهای زیربنایی برای هر زبان مستقلاً آموزش دیده‌اند و در غیر این صورت مانند افراد متفاوت به نظر می‌رسیدند.

voiceclonnx ده تا از این موتورها را پشت یک 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) ضبط مبدأ، یک کلیپ مرجع ۵ تا ۳۰ ثانیه‌ای از گویندهٔ هدف، و یک مسیر خروجی می‌گیرد، و مسیر WAV تبدیل‌شده را برمی‌گرداند. تعویض موتورها یعنی تعویض رشتهٔ engine=؛ شکل فراخوانی تغییر نمی‌کند. یک موتور، rvc، استثناست — به‌جای یک ضبط مرجع، یک مسیر به یک مدل صوتیِ .onnx می‌گیرد، که پایین‌تر پوشش داده می‌شود. pip install voiceclonnx هر ده موتور را می‌کشد؛ مدل‌ها در نخستین استفاده از Hugging Face دانلود می‌شوند.

دو محور، نه یک امتیاز

دو عدد نشان می‌دهند یک تبدیل چقدر خوب کار کرده، و آن‌ها با هم حرکت نمی‌کنند.

نرخ خطای واژه (WER) وضوح را اندازه می‌گیرد: چه مقدار از جملهٔ اصلی زنده مانده، همان‌طور که با عبور دادن خروجی از میان یک تشخیص‌دهندهٔ گفتار و مقایسه با رونوشت مبدأ سنجیده می‌شود. WER صفر درصد یعنی هر واژه درست عبور کرده.

شباهت گوینده هویت را اندازه می‌گیرد: اینکه آیا خروجی واقعاً مانند گویندهٔ هدف به نظر می‌رسد، نه گویندهٔ اصلی. با استخراج یک جاسازیِ گوینده — یک اثرانگشتِ عددیِ فشرده از طنین یک صدا، همان رنگ آوایی‌ای که یک صدا را در همان زیروبمی و بلندی از صدای دیگر متفاوت می‌کند — از خروجی و از کلیپ مرجع، و سپس مقایسهٔ آن‌ها با شباهت کسینوسی محاسبه می‌شود. امتیاز ۱٫۰ یعنی طنین یکسان؛ خط‌مبنای خودِ voiceclonnx — یک کپیِ تبدیل‌نشده از مبدأ که در برابر هدف امتیازدهی شده — روی ۰٫۰۹ می‌نشیند، پس هرچیز به‌طور معناداری بالاتر از آن در حال انجام کار واقعیِ تبدیل است.

voiceclonnx هر دو عدد را برای هر موتور منتشر می‌کند، اندازه‌گیری‌شده در برابر همان جمله که به دو صدای مرجع تبدیل شده. WER از faster-whisper می‌آید؛ شباهت گوینده از یک مدل جاسازیِ wespeaker-resnet34 می‌آید (متقاطعاً بررسی‌شده در برابر دو مدل دیگر). آن‌ها را کنار هم بگذارید و یک الگو پدیدار می‌شود: هیچ موتوری هر دو ستون را برنمی‌دارد.

موتورخانوادهWERشباهت هدف
focalcodecتعویض ویژگی kNN۱۵ تا ۱۹٪۰٫۶۱
lscodeccodec جداشده از گوینده~۳۵٪۰٫۵۴
chatterboxAR codec-LM۴ تا ۸٪۰٫۵۴
knnvcتعویض ویژگی kNN۱۲ تا ۱۵٪۰٫۴۹
facodeccodec فاکتورشده۰٪۰٫۴۴
openvoiceانتقال رنگ‌آوا۰٪۰٫۳۷
bicodecتوکن‌های معنایی + سراسری۱۲٪۰٫۲۹
triaanTriple-AAN۴٪۰٫۲۹
cosyvoiceflow-matching۸٪۰٫۲۱

(‏rvc هر مبدأیی را به یک صدای ثابتِ آموزش‌دیده توسط جامعه تبدیل می‌کند نه به یک کلیپ مرجع دلخواه، پس در این جدول قابل‌مقایسه نیست؛ پایین‌تر ببینید.)

جدول را ردیف‌به‌ردیف بخوانید، نه با جست‌وجوی یک بهترینِ واحد. facodec و openvoice روی WER صفر درصد می‌نشینند — هر واژه زنده می‌ماند — با شباهت متوسط. focalcodec و lscodec در سر دیگر می‌نشینند: قوی‌ترین انتقال طنین در این مجموعه، خریداری‌شده با اجازه دادن به اینکه ۱۵ تا ۳۵ درصد از واژه‌ها اشتباه دربیایند. chatterbox تنها موتوری است که هم‌زمان روی هر دو محور خوب عمل می‌کند (WER ۴ تا ۸ درصد، شباهت ۰٫۵۴)، که ویژگیِ معماری‌اش است، که در ادامه پوشش داده می‌شود.

چرا خانواده‌ها متفاوت رفتار می‌کنند

موتورها به رویکردهای متمایزی تقسیم می‌شوند، و رویکرد پیش‌بینی می‌کند یک موتور کجای جدول بالا فرود می‌آید.

تعویض ویژگی kNN (‏knnvc، focalcodec). صدای مبدأ به فریم‌های کوتاه شکسته می‌شود، هر یک با یک رمزگذار خودنظارتیِ از پیش آموزش‌دیده به یک بردار ویژگی تبدیل می‌شود. برای هر فریم مبدأ، الگوریتم k فریمِ نزدیک‌ترین را در استخری از ویژگی‌های گویندهٔ هدف می‌یابد و آن‌ها را میانگین می‌گیرد و در آن جای می‌دهد، و طنین مبدأ را فریم‌به‌فریم جایگزین می‌کند در حالی که محتوای واجیِ زیربنایی را همان‌جایی که از بازنماییِ خودِ رمزگذار استخراج شده رها می‌کند. هیچ رمزگشای آموخته‌شده‌ای که یک صدا را به دیگری نگاشت کند وجود ندارد — تعویض یک جست‌وجوی نزدیک‌ترین-همسایه است — به همین دلیل انتقال طنین می‌تواند تهاجمی باشد (focalcodec به شباهت ۰٫۶۱ می‌رسد) به قیمت گاهی درهم‌ریختن فریم‌هایی که در استخر هدف تطبیق ضعیفی داشتند، که به‌صورت WER نمود می‌یابد.

codec فاکتورشده (‏facodec). یک codec صوتیِ عصبی — مدلی که گفتار را به یک توالی توکنِ فشرده فشرده می‌کند و آن را بازسازی می‌کند — آموزش‌دیده تا آن توکن‌ها را صراحتاً به جریان‌های جداگانهٔ محتوا و طنین تقسیم کند. چون محتوا یک جریان اختصاصی است، رمزگشا واژه‌ها را با وفاداری بالا بازسازی می‌کند؛ تنها جریان طنین برای گویندهٔ هدف تعویض می‌شود. آن جداسازیِ صریح دلیل رسیدنِ facodec به WER صفر درصد است: حفظ محتوا با چیزی رقابت نمی‌کند.

انتقال رنگ‌آوا (‏openvoice). یک ماژول تبدیل، رنگ‌آوا — منحنیِ زیروبمی و طنین — را پس از آنکه یک رمزگذار جداگانه محتوای زبانی را ثابت کرده تغییر می‌دهد، از نظر روحیه شبیه به رویکرد codec فاکتورشده اما به‌صورت یک گام انتقال رنگ روی یک طیف‌نگار mel به‌جای توکن‌های گسسته پیاده‌سازی شده. این نیز به WER صفر درصد می‌رسد، با شباهتی کمی کمتر از facodec.

AR codec-LM (‏chatterbox). یک مدل زبانیِ خودبازگشتی که توکن‌های codec را یک‌به‌یک پیش‌بینی می‌کند، مشروط به جاسازیِ گویندهٔ هدف، بسیار شبیه به یک مدل زبانیِ متن-به-گفتار اما مشروط به توکن‌های محتوای ضبط مبدأ به‌جای متن. چون آهنگ‌آوایی (ریتم، تکیه، لحن) را به‌عنوان بخشی از همان فرایند خودبازگشتی تولید می‌کند به‌جای کپی مستقیم آن از مبدأ، می‌تواند سبک گفتار را همراه طنین حمل کند — به همین دلیل مستندات می‌گویند «قوی‌ترین جابه‌جاییِ مبدأ-به-هدف» را می‌دهد — و تنها موتوری است که هم‌زمان روی وضوح و شباهت خوب امتیاز می‌گیرد.

flow-matching (‏cosyvoice). یک فرایند تولیدیِ پیوسته که به‌طور تکراری نویز را به طیف‌نگار mel هدف تصفیه می‌کند، با استفاده از یک حل‌کنندهٔ ODE (معادلهٔ دیفرانسیل معمولی) که تعداد قابل‌پیکربندی‌ای گام برمی‌دارد (ode_steps، پیش‌فرض ۱۰). رمزگذار محتوای آن برای انتقال میان‌زبانی طراحی شده، و آن عمومیت احتمالاً دلیل پایین‌ترین امتیازِ شباهت-هدف در این مجموعه است: بازنمایی برای استقلال از زبان بهینه می‌شود، نه برای دقیق‌ترین تطبیق گوینده.

codec جداشده از گوینده (‏lscodec). مانند facodec، یک codec آموزش‌دیده برای جدا کردن محتوا از هویت گوینده، اما تنظیم‌شده تا شباهت را بیشتر پیش ببرد، به قیمت مستقیمِ دقتِ جریان محتوا، و روی WER تقریباً ۳۵ درصد با دومین شباهتِ بالا در این مجموعه فرود می‌آید.

Triple-AAN و codec های توکن معنایی-به‌علاوهٔ-سراسری (‏triaan، bicodec) روی هر دو محور در میانه می‌نشینند: WER متوسط، شباهت متوسط، بدون گرایش قوی به هیچ‌سو.

codec هر-چیز-به-یک به‌علاوه vocoder (‏rvc). ساخته‌شده روی ContentVec (یک رمزگذار محتوا) که به یک vocoder VITS تغذیه می‌شود، آموزش‌دیده به‌ازای هر صدای هدف به‌جای پذیرفتن یک کلیپ مرجع دلخواه. reference_voice برای این موتور مسیری به یک فایل مدل RVC با پسوند .onnx یا یک شناسهٔ مخزن Hugging Face است، نه یک فایل صوتی:

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

چون هر مدل RVC روی یک صدای هدف آموزش دیده، در زمان استنتاج یک کلیپ مرجع نمی‌گیرد و روی همان محکِ شباهتِ موتورهای هر-چیز-به-هرچیز امتیازدهی نمی‌شود. WER اندازه‌گیری‌شدهٔ ۳۸ درصدی آن یک مدل نمونهٔ آموزش‌دیده توسط جامعه را بازتاب می‌دهد، نه خودِ معماری را به‌طور کلی — کیفیت به این بستگی دارد که آن مدل خاص چگونه آموزش دیده. هزاران صدای جامعه‌محورِ RVC روی Hugging Face وجود دارند و مستقیماً با شناسهٔ مخزن بارگذاری می‌شوند.

تصمیم اینکه کدام یک را اجرا کنید

خط لولهٔ سریع و همه‌منظوره. با facodec یا openvoice شروع کنید. هر دو به WER صفر درصدِ اندازه‌گیری‌شده با شباهت متوسط (۰٫۴۴ و ۰٫۳۷) می‌رسند، و هر دو یک نسخهٔ کوانتیزهٔ INT8 بدون افت کیفیتِ ثبت‌شده عرضه می‌کنند — quantized=True را برای مدلی کوچک‌تر و سریع‌تر پاس دهید.

بیشینهٔ شباهت گوینده. اگر WER ۱۵ تا ۱۹ درصد برای مورد استفاده قابل‌قبول است از focalcodec (شباهت ۰٫۶۱، بالاترین اندازه‌گیری‌شده) استفاده کنید، یا اگر نیست از chatterbox (شباهت ۰٫۵۴، WER ۴ تا ۸ درصد). chatterbox همچنین با ۲۴ کیلوهرتز اجرا می‌شود، بالاترین نرخ خروجی برای تبدیل هر-چیز-به-هرچیز در این مجموعه — rvc تا ۴۸ کیلوهرتز اجرا می‌شود اما تنها در همان حالت هر-چیز-به-یک بالا.

سخت‌افزار کم‌منبع. knnvc در INT8 روی دیسک حدود ۱۲۳ مگابایت است، کوچک‌ترین ردپا در این مجموعه، با شباهت ۰٫۴۹ و WER ۱۲ تا ۱۵ درصد — معاوضه‌ای معقول برای حافظهٔ محدود. هر موتوری تمیز کوانتیزه نمی‌شود: focalcodec و cosyvoice مستند شده‌اند که در INT8 افت می‌کنند، پس آن دو را در fp32 نگه دارید.

زبانی که موتور روی آن آموزش ندیده. رمزگذار محتوای cosyvoice برای انتقال میان‌زبانی ساخته شده، که دلیل مستندشدهٔ ترجیح آن بر موتوری تنظیم‌شده برای تبدیل هم‌زبانه است، حتی اگرچه شباهت اندازه‌گیری‌شده‌اش (۰٫۲۱) پایین‌ترین در میان نه موتورِ مستقیماً قابل‌مقایسه است.

هویت صدا بر واژه‌بندیِ دقیق. lscodec قوی‌ترین انتقال طنین را در میان موتورهای خانوادهٔ codec می‌دهد (۰٫۵۴، هم‌تراز با chatterbox) به قیمتِ بالاترین WER در این مجموعهٔ قابل‌مقایسه (~۳۵٪). آن را وقتی انتخاب کنید که هدف «آیا این مانند گویندهٔ هدف به نظر می‌رسد» باشد و خطاهای گاه‌به‌گاهِ واژه در خروجی قابل‌تحمل باشند.

یک صدای ثابتِ جامعه‌محور به‌جای یک کلیپ دلخواه. rvc، با استفاده از یک مدل صوتیِ از پیش‌آموزش‌دیدهٔ .onnx به‌جای یک ضبط مرجع.

قید غیرتجاری برای بررسی نخست. وزن‌های bicodec تحت مجوز CC BY-NC-SA 4.0 هستند. وزن‌های هر موتور دیگر MIT، Apache-2.0 یا CC BY 4.0 هستند. مجوز وزنِ خاصی را که مستقر می‌کنید پیش از عرضهٔ تجاری تأیید کنید.

چه‌چیزی را خوب انجام نمی‌دهد، و روی چه‌کسی نباید استفاده شود

هر عددِ بالا با همان هشدار همراه است: این اعداد یک جملهٔ نمایشیِ انگلیسی را توصیف می‌کنند که میان دو صدای مرجع خاص تبدیل شده. زبانی متفاوت، ضبط مبدأیِ پرنویزتر، کلیپ مرجعی کوتاه‌تر یا کم‌کیفیت‌تر، یا گویندهٔ مبدأیی که صدایش از هرچیزی در داده‌ی آموزشیِ یک موتور دور است، همگی این اعداد را جابه‌جا می‌کنند، معمولاً به بدتر. هیچ‌کدام از این موتورها یک راه‌حل جهانی برای یک ضبط مبدأیِ کم‌کیفیت نیستند — چند تا از آن‌ها با خوشحالی طنین را تبدیل می‌کنند در حالی که نویز مبدأ را مستقیماً عبور می‌دهند، چون نویز امضای آکوستیکِ خودش را دارد که یک تفکیک محتوا/طنین همیشه تمیز جدایش نمی‌کند.

تبدیل صدا همچنین همان خطر واقعی‌ای را برمی‌انگیزد که پسرعموی نزدیکش، شبیه‌سازی صدا برای TTS، این تیم را از پیش به فکر کردن دربارهٔ آن وادار کرده: تبدیل یک ضبط تا مانند یک شخص واقعی و قابل‌شناسایی به نظر برسد، فناوریِ توانمند به جعل هویت است، چه قصد این بوده باشد چه نه. قاعده‌ای که این تیم به‌طور کلی روی صداهای مصنوعی به کار می‌بندد — گرفتن اجازهٔ صریح پیش از استفاده از صدای یک شخص واقعی به‌عنوان اهداکننده یا هدف، و بازگشت به ضبط‌های حوزهٔ عمومی یا یک صدای عمداً بدیع وقتی اجازه ممکن نیست — اینجا بدون استثنا اعمال می‌شود. یک کلیپ مرجع از یک شخص واقعی، از منظر رضایت، متفاوت از یک مجموعهٔ آموزشیِ کامل از صدایش نیست؛ فقط به مراتب کمتر از آن برای تولید یک نتیجهٔ قابل‌استفاده لازم است، که دلیلی برای احتیاط بیشتر است، نه کمتر.

اگر تبدیل صدا بخشی از خط لوله‌ای است که می‌سازید، از طریق تماس با ما در ارتباط باشید یا آنچه ارائه می‌دهیم را ببینید.