چیتشیت
تولید موسیقی و مدلهای صوتی-زبانی
Music Generation and Audio-Language Models
توکنهای کدک، MusicGen، انکودرها و تصویرسازهای صوتی، Thinker و Talker، بودجههای TTFAB و چالشهای صوتی.
فهرست مطالب
تبدیل صدا به توکنهای کدک
معماریاعداد مهم
مفهومها- نرخ کدک
- 8 کتاب کد RVQ در 75 Hz معادل 600 توکن/ثانیه تولید میکند.
- کف استریم
- در 75 توکن/ثانیه، باید ≥75 توکن/ثانیه به ازای هر کاربر تولید شود.
- کف Talker
- توکنهای گفتار 50 Hz به خروجی ≥50 توکن/ثانیه از Talker نیاز دارند.
- کتاب کد
- معمولاً 1024 یا 2048 مدخل است.
- کدک MusicGen
- انکودک EnCodec در 32 kHz با 4 کتاب کد.
- ابعاد Log-Mel
- مدت 30 ثانیه با نرخ فریم 100 Hz به ابعاد (3000, 80) میرسد.
- رفتوبرگشت
- زیر 500ms، کاربر دیگر متوجه تاخیر نمیشود.
دو خانواده از تولیدکنندهها
مفهومها- توکن-خودبازگشتی
- یک ترنسفورمر فقط-دیکودر روی توکنهای تختشدهی RVQ.
- موازی تاخیریافته
- مدل MusicGen جریانهای K کتاب کد را با آفست مجزا برای هر جریان منتشر میکند.
- VALL-E
- استخراج توکنهای گفتار از پرامپت متنی و نمونه صدای 3 ثانیهای.
- دیفیوژن نهان
- مدل Stable Audio Open روی صدای فشرده کار میکند. عالی برای لوپها.
- تطبیق جریان
- مدل Stable Audio 2.5 از آن روی متغیرهای نهان صوتی پیوسته استفاده میکند.
- روند جاری
- تطبیق جریان در موسیقی پیروز است. توکن-AR بر گفتار غالب است.
MusicGen، ملودی و FAD
کدpython
from audiocraft.models import MusicGen
model = MusicGen.get_pretrained("facebook/musicgen-small") # 300M، سریع
model.set_generation_params(duration=10) # ثانیههای صدا
wav = model.generate(["upbeat synthwave with driving drums, 128 BPM"])
torchaudio.save("out.wav", wav[0].cpu(), 32000) # خروجی 32 kHz
melody, sr = torchaudio.load("humming.wav")
wav = model.generate_with_chroma( # حفظ ملودی، تغییر طنین صدا
["jazz piano cover"], melody.squeeze(), sr)
from frechet_audio_distance import FrechetAudioDistance
fad = FrechetAudioDistance() # فاصلهی امبدینگ VGGish
fad.get_fad_score("generated_folder/", "reference_folder/") # کمتر بهتر است
الگوی مدل صوتی-زبانی
گامبهگام- انکودر صوتیانکودر Whisper، BEATs، CLAP یا WavLM ویژگیها را میسازد.
- تصویرسازیک لایهی خطی یا MLP ویژگیها را به فضای امبدینگ LLM مینگارد.
- LLMیک دیکودر توکنهای درهمآمیختهی متن و صوت را خوانده و متن مینویسد.
- مرحله 1فریز انکودر و LLM. آموزش تصویرساز روی دادههای ASR یا کپشننویسی.
- مرحله 2فاینتیون کامل یا LoRA روی وظایف صوتی دستوری.
- مرحله 3اختیاری. افزودن دیکودر گفتار برای دریافت و تولید صدا.
تصویرساز و کیو-فورمر صوتی
کدpython
class AudioProjector(nn.Module):
def __init__(self, audio_dim=1280, llm_dim=4096):
super().__init__()
self.down = nn.Linear(audio_dim, llm_dim) # تبدیل صوت به عرض امبدینگ LLM
self.act = nn.GELU()
self.up = nn.Linear(llm_dim, llm_dim)
def forward(self, audio_features):
return self.up(self.act(self.down(audio_features)))
qf = QFormer(n_queries=8, hidden=20) # 8 پرسوجو (N=8)
tokens = qf.forward(frames) # ورودی 99 فریم، خروجی 8 توکن
تنظیمات Log-Mel و انکودر
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
Sample rate | 16 kHz | ابتدا نمونهبرداری مجدد کنید |
Window | 25ms | win_ms: int = 25 |
Hop | 10ms | hop_ms: int = 10 |
Mel filters | 80 | 0-8000 Hz |
Log compress | math.log(1 + x) | محدوده دینامیکی |
Q-former queries | 32 or 64 | مدل AF3 از 64 استفاده میکند |
Whisper encoder | 12-layer | فریز در الگوی ALM |
Thinker و Talker
معماریبودجهی TTFAB در مدل 7B
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
Mic to audio tokens | 40-80ms | استریمها |
Prefill | 100-200ms | بسیار بیشتر در 70B |
First Thinker text token | 40ms | رشد همراه با اندازهی Thinker |
Talker on first text token | 20ms | حداقل 15ms در مدل این درس |
First speech tokens commit | 40ms | قبل از رمزگشایی کوانتایزر پسماند |
Residual-VQ decode | 30ms | rvq_decode = 30 |
Speech waveform decode | 50-80ms | wave_decode = 70 |
Total TTFAB | 320-490ms | 600-900ms در 70B |
عیبیابی
عیبیابیلوپ شدن موسیقی بعد از 30 ثانیه
- علت
- مدلهای AR لوپ میشوند
- راهحل
- محو تدریجی تقاطعی یا استفاده از ACE-Step
انحراف تمپو از BPM
- علت
- سرگردانی مدلها
- راهحل
- تگهای BPM، تابع
beat_trackدر librosa
نامفهوم بودن کلمات خواندهشده
- علت
- ضعف مدلهای باز در متن ترانه
- راهحل
- استفاده از API تجاری یا فاینتیون
توهم روی سکوت
- علت
- مشکل انکودر Whisper
- راهحل
- دروازهبندی با VAD
تداخل گویندگان بعد از 10 دقیقه
- علت
- افت کیفیت در فایل صوتی طولانی
- راهحل
- تفکیک گویندگان (Diarize) و سپس خلاصهسازی
دقت چندصوتی نزدیک 25%
- علت
- در حد شانس تصادفی
- راهحل
- به وظایف «کدام کلیپ» اعتماد نکنید
انتشار خطاهای لایه 1 در RVQ
- علت
- تجمع خطای RVQ
- راهحل
- تنظیم Temperature روی 0 برای لایههای بالاتر
دستسازهها در محل اتصال کلیپها
- علت
- مرزهای محو تدریجی تقاطعی
- راهحل
- همپوشانی و جمع (overlap-add) دقیق
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| بارگذاری پردازشگر ALM | AutoProcessor.from_pretrained("Qwen/Qwen2.5-Omni-7B") |
| تولید پاسخ | model.generate(**inputs, max_new_tokens=200) |
| بارگذاری MMAU-Pro | load_dataset("gamma-lab-umd/MMAU-Pro", split="test") |
| ارزیابی رسمی MMAU-Pro | evaluate_mmau_pro_comprehensive.py |
| برش صوت به فریمها | window_frames(wave, 16000, 25, 10) |
| فهرست بخشهای TTFAB | ttfab(cfg) |
| نمونهبرداری از توکنهای کدک | generate(counts, style, start, length, rng, temperature=1.0) |
پرسش و پاسخ
پرسش و پاسخ- چه زمانی پایپلاین مرحلهای کافی است؟
- زمانی که هدف پیادهسازی متن است، بدون موسیقی و حس.
- چه زمانی به مدل سرتاسری نیاز دارم؟
- موسیقی، هیجان، چند گوینده یا استدلال صوتی پیچیده.
- پایپلاین مرحلهای چه چیزی را از دست میدهد؟
- حالوهوا، هویت گوینده، زمانبندی و نشانههای دیپفیک.
- چرا یک Talker کوچک؟
- یک Talker با ابعاد 7B از کف 50 توکن/ثانیه عقب میماند.
- چرا TMRoPE؟
- برای هر توکن برچسب زمانی مطلق میسازد. تصویر، صوت و متن هماهنگ میشوند.
- نیمهدوطرفه یا دوطرفهی کامل؟
- مدل Qwen2.5-Omni پیشفرض نیمهدوطرفه است. Moshi دوطرفهی کامل را پشتیبانی میکند.
نکات
نکتهها- برای خروجی امن در پروداکشن، فقط بیکلام تولید کنید.
- هر خروجی تولیدی را با واترمارک و متادیتا برچسب بزنید.
- هر
categoryدر MMAU-Pro را جداگانه گزارش کنید. - ابتدا کدک را بررسی کنید؛ سقف کیفیت خروجی است. DAC بهترین گزینهی متنباز کنونی است.
- برای شبیهسازی صدا، شناسایی سوءاستفاده و لیستهای انصراف را اضافه کنید.