چیت‌شیت

تبدیل متن به گفتار، شبیه‌سازی صدا و کدک‌ها

Text-to-Speech, Voice Cloning and Codecs

متن به واج، واج به مل، مل به شکل‌موج؛ شبیه‌سازی با گیت رضایت و واترمارک؛ و توکنایز صدا با کدک‌های RVQ.

  • ۱۲ بخش
  • ۳ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. پایپ‌لاین TTS و شبیه‌سازی
  2. وظایف در قالب کد
  3. شبیه‌سازی و واترمارک
  4. کدگذاری با یک کدک
  5. گیت احراز رضایت
  6. فرمول‌ها و اعداد
  7. اعداد مربوط به کدک‌ها
  8. مدل‌ها
  9. کوته‌نوشت‌ها
  10. عیب‌یابی
  11. چه زمانی استفاده کنیم؟
  12. پرسش‌ها

پایپ‌لاین TTS و شبیه‌سازی

معماری
واج‌هاملامبدینگشکل‌موجمتنابتدا نرمال‌سازی کنیدواجبند (Phonemizer)پشتیبان espeak و G2Pمدل آکوستیکمتن به مل، 80 کانالووکوودرHiFi-GAN، مل به شکل‌موجکلیپ مرجع5 ثانیه به همراه ترنسکریپت آنانکودر گویندهامبدینگ گویندهواترمارکحجم داده‌ی مفید ~32 بیت

وظایف در قالب کد

کار و کد
وظیفهکد
تبدیل به واج (Phonemize)phonemize("Hello world", language="en-us", backend="espeak")
اجرای Kokoro روی CPU`KPipeline(lang_code="a")`, then `tts(text, voice="af_bella")`
شبیه‌سازی زیروشاتF5TTS().infer(ref_file=<wav>, ref_text=<text>, gen_text=<text>)
تبدیل صداvc.convert(source=<wav>, target_pool=[<wav>, <wav>])
جای‌گذاری واترمارکsc.embed(wav, sr=24000, message=payload)
اجرای EnCodec در نرخ 6 kbpsmodel.set_target_bandwidth(6.0)
تفکیک سمانتیک Mimi`semantic = codes[:, 0]`, `acoustic = codes[:, 1:]`
مدل ساده‌ی RVQrvq_encode(values, codebook_size=8, n_codebooks=4)

شبیه‌سازی و واترمارک

کد
python
from f5_tts.api import F5TTS
tts = F5TTS()
wav = tts.infer(ref_file="my_voice_5s.wav",                   # مرجع 5 ثانیه‌ای
    ref_text="The quick brown fox jumps over the lazy dog.",  # باید کاملاً منطبق باشد
    gen_text="Please remind me to water the plants.")
sc = SilentCipher(model="2024-06-01")
payload = b"consent_id:abc123;ts:1745353200"
watermarked = sc.embed(wav, sr=24000, message=payload)        # ~32 بیت
detected = sc.detect(watermarked, sr=24000)                   # بایت‌های بار داده

کدگذاری با یک کدک

کد
python
model = EncodecModel.encodec_model_24khz()
model.set_target_bandwidth(6.0)  # kbps، 8 کتاب کد
with torch.no_grad():
    encoded = model.encode(wav)
codes, scale = encoded[0]        # (1, n_codebooks, n_frames)
wav_recon = model.decode([(codes, scale)])
mimi = loaders.get_mimi()        # از moshi.models
codes = mimi.encode(wav)         # (1, 8, frames@12.5Hz)
semantic = codes[:, 0]           # محتوا، هم‌تراز با WavLM
acoustic = codes[:, 1:]          # طنین صدا، آهنگ گفتار، نویز

گیت احراز رضایت

گام‌به‌گام
  1. گیتتابع verify_signature(consent_record) باید تایید شود؛ در غیر این صورت خطا: "Signed consent required".
  2. گویندهفیلد consent_record["speaker_id"] باید با خروجی hash_speaker(ref_audio) برابر باشد.
  3. شبیه‌سازیفراخوانی tts.infer(ref_file=ref_audio, gen_text=text).
  4. نشانه‌گذاریفراخوانی watermark(wav, payload=consent_record["id"]).
  5. ثبت لاگذخیره‌ی سوابق رضایت در یک لاگ آشکارساز دستکاری.

فرمول‌ها و اعداد

مفهوم‌ها
کوانتیزه‌سازی RVQ
کتاب کد 1 خروجی انکودر را کوانتیزه می‌کند. هر کتاب بعدی، مقدار باقیمانده (residual) را کوانتیزه‌سازی می‌کند.
رمزگشایی
دیکودر کدهای انتخاب‌شده در هر فریم را با هم جمع می‌کند.
واژگان
8 کتاب کد 1024 تایی، فضای $1024^8 = 10^{24}$ را تشکیل می‌دهند.
توکن‌های LM
برای 10 ثانیه از Mimi نیاز به $10 \times 12.5 \times 8 = 1000$ توکن است.
بیت‌های RVQ ساده
تعداد 8 کد معادل 3 بیت است. بیت در هر فریم، 3 برابر تعداد کتاب‌های کد خواهد بود.
گام پرش مل
12.5 میلی‌ثانیه در 24 کیلوهرتز برابر با 300 نمونه است.
HiFi-GAN
نرخ‌های بیش‌نمونه‌برداری 8، 8، 2، 2 ضریب 256 برابری برای تبدیل نرخ مل به نرخ صدا ایجاد می‌کنند.

اعداد مربوط به کدک‌ها

پیش‌فرض‌ها
تنظیمپیش‌فرضتوضیحات
EnCodec-24k frame rate75 Hzپیش‌فرض 4 کتاب کد در 1.5 kbps
DAC-44.1k frame rate86 Hzبالاترین وفاداری صوتی، تمام‌باند
SNAC-24k coarse rate~12 Hzجزئیات در فرکانس 50 هرتز
Mimi frame rate12.5 Hz8 کتاب کد در 4.4 kbps
Codes per codebook1024هر کد عددی بین 0 تا 1023 است
Codebook count8-12تعداد بیشتر باعث افزایش وفاداری و طول دنباله می‌شود
Kokoro output24 kHzبازنمونه‌برداری برای ورودی‌های 16 کیلوهرتز

مدل‌ها

مفهوم‌ها
Tacotron 2
یک معماری seq2seq خودبازگشتی؛ کند و دارای نوسان روی متن‌های طولانی.
FastSpeech 2
با پیش‌بینی‌کننده دیرش، تک‌پاس، 10 برابر سریع‌تر از Tacotron.
VITS
ترکیب انکودر، جریان کاری دیرش و HiFi-GAN؛ آموزش سرتاسری؛ 25 میلیونی.
F5-TTS
ترنسفورمر دیفیوژن مبتنی بر انطباق جریان؛ شبیه‌سازی از 5 ثانیه؛ 335 میلیونی.
Kokoro
مدل 82 میلیونی، قابل اجرا روی CPU، فقط انگلیسی.
KNN-VC
هر فریم منبع WavLM را با نزدیک‌ترین فریم در مخزن هدف تعویض می‌کند.
Mimi
کتاب کد 0 از WavLM تقطیر شده است؛ کتاب‌های کد 1 تا 7 آکوستیک هستند.

کوته‌نوشت‌ها

اصطلاح‌ها
TTS
تبدیل متن به گفتار؛ فرانت‌اند متن، مدل آکوستیک، ووکوودر.
VC
تبدیل صدا؛ بازنویسی گفتار گوینده‌ی A با صدای گوینده‌ی B.
PPG
پوستریوگرام واجی؛ احتمالات پسین ASR در هر فریم به عنوان محتوا.
RVQ
کوانتیزه‌سازی برداری باقیمانده؛ آبشاری از کتاب‌های کد کوچک.
SECS
شباهت کسینوسی امبدینگ گوینده؛ مقادیر بالای 0.70 برای اکثر شنوندگان غیرقابل‌تشخیص است.
UTMOS
پیش‌بینی‌کننده MOS بدون نیاز به مرجع؛ امتیاز حقیقت پایه 4.08 است.
CMOS
امتیاز MOS مقایسه‌ای؛ اولویت ترجیح A در برابر B.
PESQ / ViSQOL
معیارهای عینی با همبستگی بالا نسبت به MOS.

عیب‌یابی

عیب‌یابی
  • خواندن "Dr." به صورت "Drive"

    علت
    نبود نرمال‌ساز متن
    راه‌حل
    نرمال‌سازی قبل از Phonemizer
  • تلفظ اشتباه نام‌های خاص

    علت
    توکن خارج از واژگان (OOV)
    راه‌حل
    اضافه کردن یک مدل G2P به عنوان طرح پشتیبان
  • تجاوز دامنه‌ی خروجی از بازه‌ی ±1.0

    علت
    عدم تطابق در مقیاس‌گذاری مل
    راه‌حل
    np.clip(wav, -1, 1)
  • تداخل فرکانسی در ادامه‌ی پایپ‌لاین

    علت
    ورود صدای 24 کیلوهرتز Kokoro به یک پایپ‌لاین 16 کیلوهرتز
    راه‌حل
    بازنمونه‌برداری (Resample)
  • به‌هم‌ریختن هم‌ترازی شبیه‌سازی

    علت
    تفاوت متن مرجع با صدای ارائه‌شده
    راه‌حل
    تطابق دقیق متن با صدا حتی علائم نگارشی
  • اکو در صدای شبیه‌سازی‌شده

    علت
    وجود طنین و ریورب در صدای مرجع
    راه‌حل
    ضبط صدای خشک و استفاده از میکروفون نزدیک
  • ماندن لهجه در شبیه‌سازی فرانسوی

    علت
    نشت زبان
    راه‌حل
    استفاده از XTTS یا VALL-E X
  • خطای خاموش و بدون هشدار LM

    علت
    نرخ 12.5 هرتز در Mimi و سپس 50 هرتز در EnCodec
    راه‌حل
    یکسان نگه‌داشتن نرخ فریم

چه زمانی استفاده کنیم؟

نکته‌ها
  • انگلیسی آنی روی CPU: استفاده از Kokoro.
  • شبیه‌سازی بر اساس مرجع 5 ثانیه‌ای: استفاده از F5-TTS یا OpenVoice v2.
  • بازنویسی گفتار با صدای هدف: استفاده از KNN-VC یا Diff-HierVC.
  • مدل زایشی روی صدا: شروع با Mimi یا SNAC.
  • پایپ‌لاین فشرده‌سازی: استفاده از Opus؛ بالاترین بازدهی به ازای هر بیت.
  • بازسازی صدا با بالاترین وفاداری: DAC-44.1k.
  • در هر شبیه‌سازی: قرار دادن واترمارک و ثبت لاگ رضایت.

پرسش‌ها

پرسش و پاسخ
چرا توکن‌های سمانتیک و آکوستیک را تفکیک کنیم؟
توکن‌های صرفاً بازسازی‌شده، خروجی گفتار را از متن مبهم و ناواضح می‌کنند.
چرا RVQ به جای یک کتاب کد؟
یک کتاب کد بزرگ به میلیون‌ها کد نیاز دارد.
کدام کتاب کد در Mimi مهم‌تر است؟
کتاب کد 0؛ حذف آن وضوح و فهم گفتار را از بین می‌برد.
شبیه‌سازی یا تبدیل صدا؟
شبیه‌سازی متن دریافت می‌کند؛ تبدیل صدا، گفتار ورودی می‌گیرد.
فاین‌تیون چندشات؟
5 تا 30 دقیقه از صدای هدف، آموزش LoRA به مدت یک ساعت.