Diffusers documentation
Stable Audio
Stable Audio
قُدم Stable Audio في Stable Audio Open من قِبل Zach Evans وآخرون. يستقبل هذا النموذج نصًا كمدخل ويتنبأ بعينة الصوت أو الموسيقى المقابلة له.
يولّد Stable Audio Open صوتًا ستيريو بطول متغيّر (حتى 47 ثانية) بمعدل عينة 44.1kHz انطلاقًا من أوامر نصية. يتكوّن من ثلاثة مكوّنات: مُشفِّر ذاتي (autoencoder) يضغط الموجات الصوتية إلى طول تسلسل قابل للإدارة، وتضمين نصي مبني على T5 لتكييف النص، ونموذج انتشار (diffusion) مبني على محوّل (transformer) (DiT) يعمل في الفضاء الكامن (latent space) للمُشفِّر الذاتي.
يتم تدريب Stable Audio على مجموعة بيانات تضم حوالي 48 ألف تسجيل صوتي، حيث أن حوالي 47 ألفًا منها من Freesound والباقي من Free Music Archive (FMA). جميع الملفات الصوتية مرخصة بموجب CC0 أو CC BY أو CC Sampling+. تُستخدم هذه البيانات لتدريب مُشفِّر-مُفكِّك الترميز التلقائي (autoencoder) و DiT.
ملخص الورقة البحثية هو التالي: تُعدّ النماذج التوليدية المفتوحة ذات أهمية حيوية للمجتمع، إذ تتيح إجراء الضبط الدقيق وتعمل كخطوط أساس عند تقديم نماذج جديدة. ومع ذلك، فإن معظم نماذج النص إلى الصوت الحالية خاصة وغير متاحة للفنانين والباحثين لبناء أعمالهم عليها. هنا، نصف بنية وعملية تدريب نموذج نص إلى صوت جديد مفتوح الأوزان، تم تدريبه باستخدام بيانات مرخصة بموجب المشاع الإبداعي. تُظهر تقييماتنا أن أداء النموذج تنافسي مع أحدث التقنيات عبر مقاييس متنوعة. ومن اللافت للنظر أن نتائج FDopenl3 المُبلَّغ عنها (والتي تقيس واقعية المخرجات) تُبرز إمكاناته في توليد صوت ستيريو عالي الجودة بمعدل عينة 44.1kHz.
تمت مساهمة خط المعالجة هذا من قِبل Yoach Lacombe. يمكن العثور على قاعدة الكود الأصلية في Stability-AI/stable-audio-tools.
نصائح
عند إنشاء موجه، ضع في اعتبارك:
- تعمل مدخلات الأوامر الوصفية بشكل أفضل؛ استخدم الصفات لوصف الصوت (على سبيل المثال، “جودة عالية” أو “واضح”) واجعل الأمر محددًا في سياقه قدر الإمكان (على سبيل المثال، “تكنو إيقاعي بإيقاع سريع وسينث” يعمل بشكل أفضل من “تكنو”).
- يمكن أن يحسّن استخدام موجّه سلبي بشكل كبير من جودة الصوت المولّد. جرّب استخدام موجّه سلبي مثل “low quality, average quality”.
أثناء الاستدلال:
- يمكن التحكم في الجودة لعينة الصوت المولّدة عبر الحجة
num_inference_steps؛ فزيادة عدد الخطوات تمنح صوتاً بجودة أعلى على حساب بطء الاستدلال. - يمكن توليد عدة موجات صوتية دفعة واحدة: اضبط
num_waveforms_per_promptعلى قيمة أكبر من 1 لتفعيل ذلك. سيتم إجراء تقييم تلقائي بين الموجات الصوتية المولّدة ونص الأمر، ثم ترتيب المقاطع الصوتية من الأفضل إلى الأسوأ بناءً على ذلك.
التكميم
يساعد التكميم (Quantization) في تقليل متطلبات الذاكرة للنماذج الكبيرة جدًا من خلال تخزين أوزان النموذج في نوع بيانات بدقة أقل. ومع ذلك، قد يكون للتكميم تأثير متباين على جودة الفيديو اعتمادًا على نموذج الفيديو المستخدم.
راجع نظرة عامة حول التكميم لمعرفة المزيد حول محركات التكميم المدعومة واختيار محرك تكميم يدعم حالتك الاستخدامية. يوضح المثال أدناه كيفية تحميل StableAudioPipeline مُكمَّم للاستدلال باستخدام bitsandbytes.
import torch
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, StableAudioDiTModel, StableAudioPipeline
from diffusers.utils import export_to_video
from transformers import BitsAndBytesConfig as BitsAndBytesConfig, T5EncoderModel
quant_config = BitsAndBytesConfig(load_in_8bit=True)
text_encoder_8bit = T5EncoderModel.from_pretrained(
"stabilityai/stable-audio-open-1.0",
subfolder="text_encoder",
quantization_config=quant_config,
dtype=torch.float16,
)
quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = StableAudioDiTModel.from_pretrained(
"stabilityai/stable-audio-open-1.0",
subfolder="transformer",
quantization_config=quant_config,
dtype=torch.float16,
)
pipeline = StableAudioPipeline.from_pretrained(
"stabilityai/stable-audio-open-1.0",
text_encoder=text_encoder_8bit,
transformer=transformer_8bit,
dtype=torch.float16,
device_map="balanced",
)
prompt = "The sound of a hammer hitting a wooden surface."
negative_prompt = "Low quality."
audio = pipeline(
prompt,
negative_prompt=negative_prompt,
num_inference_steps=200,
audio_end_in_s=10.0,
num_waveforms_per_prompt=3,
generator=generator,
).audios
output = audio[0].T.float().cpu().numpy()
sf.write("hammer.wav", output, pipeline.vae.sampling_rate)StableAudioPipeline
فئة diffusers.StableAudioPipeline
< source >( vae: AutoencoderOoblecktext_encoder: T5EncoderModelprojection_model: StableAudioProjectionModeltokenizer: T5Tokenizertransformer: StableAudioDiTModelscheduler: EDMDPMSolverMultistepScheduler )
المعاملات
- vae (AutoencoderOobleck) — نموذج الترميز التبايني التلقائي (VAE) لتشفير وفك تشفير الصور إلى تمثيلات كامنة ومنها.
- text_encoder (T5EncoderModel) — مُشفِّر نص ثابت. يستخدم StableAudio مُشفِّر T5، وتحديداً النسخة google-t5/t5-base.
- projection_model (
StableAudioProjectionModel) — نموذج مُدرَّب يُستخدم لإسقاط الحالات المخفية (hidden-states) من نموذج مُشفِّر النص (text encoder) بشكل خطي، وكذلك من ثواني البداية والنهاية. يتم دمج الحالات المخفية المُسقطة من المُشفِّر مع ثواني الشرط (conditional seconds) لتكوين مدخلات نموذج الترانسفورمر (transformer). - tokenizer (T5Tokenizer) — مُقسِّم (Tokenizer) لتقسيم النص الخاص بمُشفِّر النص (text-encoder) المُجمَّد.
- transformer (StableAudioDiTModel) —
نموذج
StableAudioDiTModelلإزالة الضوضاء من الكامنات الصوتية المُرمّزة. - scheduler (EDMDPMSolverMultistepScheduler) —
جدول زمني يُستخدم بالاقتران مع
transformerلإزالة الضوضاء من كائنات الصوت المُرمّزة.
خط أنابيب لتوليد الصوت من النص باستخدام StableAudio.
يرث هذا النموذج من DiffusionPipeline. راجع توثيق الفئة الأصلية لمعرفة الطرق العامة المُنفَّذة لجميع خطوط الأنابيب (التنزيل، الحفظ، التشغيل على جهاز معين، إلخ).
__call__
< source >( prompt: str | list[str] = Noneaudio_end_in_s: float | None = Noneaudio_start_in_s: float | None = 0.0num_inference_steps: int = 100guidance_scale: float = 7.0negative_prompt: str | list[str] | None = Nonenum_waveforms_per_prompt: int | None = 1eta: float = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneinitial_audio_waveforms: typing.Optional[torch.Tensor] = Noneinitial_audio_sampling_rate: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Nonenegative_attention_mask: typing.Optional[torch.LongTensor] = Nonereturn_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int | None = 1output_type: str | None = 'pt' ) → StableDiffusionPipelineOutput or tuple
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي توجّه توليد الصوت. إذا لم يُعرَّف، يجب عليك تمريرprompt_embeds. - audio_end_in_s (
float، اختياري، القيمة الافتراضية 47.55) — مؤشر نهاية الصوت بالثواني. - audio_start_in_s (
float، اختياري، القيمة الافتراضية 0) — مؤشر بداية الصوت بالثواني. - num_inference_steps (
int، اختياري، القيمة الافتراضية 100) — عدد خطوات إزالة الضوضاء. تؤدي زيادة عدد خطوات إزالة الضوضاء عادةً إلى جودة صوتية أعلى على حساب بطء الاستدلال. - guidance_scale (
float, اختياري، القيمة الافتراضية 7.0) — تشجع قيمة أعلى لمقياس التوجيه النموذج على توليد صوت مرتبط ارتباطًا وثيقًا بنصpromptعلى حساب انخفاض جودة الصوت. يتم تفعيل مقياس التوجيه عندما يكونguidance_scale > 1. - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي توجّه ما يجب عدم تضمينه في توليد الصوت. إذا لم يُعرَّف، يجب عليك تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (guidance_scale < 1). - num_waveforms_per_prompt (
int، اختياري، القيمة الافتراضية 1) — عدد الموجات الصوتية التي سيتم توليدها لكل موجه. - eta (
float، اختياري، القيمة الافتراضية 0.0) — يتوافق مع المعامل eta (η) من ورقة DDIM. ينطبق فقط على DDIMScheduler، ويُتجاهل في المجدولين الآخرين. - generator (
torch.Generatorأوlist[torch.Generator]، اختياري) —torch.Generatorلجعل التوليد حتميًا. - latents (
torch.Tensor، اختياري) — كائنات latents ضجيجية مُولّدة مسبقًا، مُستخرجة من توزيع غاوسي، تُستخدم كمدخلات لتوليد الصوت. يمكن استخدامها لتعديل نفس التوليد باستخدام أوامر مختلفة. إذا لم تُقدَّم، يتم توليد كائن latents عن طريق الاستخراج باستخدامgeneratorالعشوائي المُقدَّم. - initial_audio_waveforms (
torch.Tensor، اختياري) — موجات صوتية أولية اختيارية تُستخدم كموجة صوتية أولية للتوليد. يجب أن تكون على شكل(batch_size, num_channels, audio_length)أو(batch_size, audio_length)، حيثbatch_sizeتتوافق مع عدد الأوامر (prompts) المُمررة إلى النموذج. - initial_audio_sampling_rate (
int، اختياري) — معدل أخذ العينات لـinitial_audio_waveforms، إذا تم توفيرها. يجب أن يكون مطابقًا لنموذج. - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية محسوبة مسبقًا من نموذج مُشفِّر النص. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم حساب تضمينات النص من معامل الإدخالprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سالبة محسوبة مسبقًا من نموذج مُشفِّر النص. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم حساب negative_prompt_embeds من معامل الإدخالnegative_prompt. - attention_mask (
torch.LongTensor، اختياري) — قناع الانتباه المُحسب مسبقًا الذي سيُطبَّق علىprompt_embeds. إذا لم يُقدَّم، فسيتم حساب قناع الانتباه من معامل الإدخالprompt. - negative_attention_mask (
torch.LongTensor، اختياري) — قناع الانتباه المُحسب مسبقًا الذي سيُطبَّق علىnegative_text_audio_duration_embeds. - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاع StableDiffusionPipelineOutput بدلاً من tuple عادي. - callback (
Callable، اختياري) — دالة تُستدعى كلcallback_stepsخطوات أثناء الاستدلال. تُستدعى الدالة مع الحجج التالية:callback(step: int, timestep: int, latents: torch.Tensor). - callback_steps (
int، اختياري، القيمة الافتراضية 1) — التردد الذي تُستدعى به دالةcallback. إذا لم يُحدد، تُستدعى الدالة في كل خطوة. - output_type (
str، اختياري، القيمة الافتراضية"pt") — صيغة مخرجات الصوت المولّد. اختر بين"np"لإرجاع مصفوفة NumPynp.ndarrayأو"pt"لإرجاع كائن PyTorchtorch.Tensor. اضبطه على"latent"لإرجاع مخرجات نموذج الانتشار الكامن (LDM).
يعيد
StableDiffusionPipelineOutput أو tuple
إذا كان return_dict هو True، يُعاد StableDiffusionPipelineOutput،
وإلا يُعاد tuple حيث يكون العنصر الأول قائمة تحتوي على الصوت المولّد.
دالة الاستدعاء call لخط الأنابيب pipeline الخاص بالتوليد.
أمثلة:
>>> import scipy
>>> import torch
>>> import soundfile as sf
>>> from diffusers import StableAudioPipeline
>>> repo_id = "stabilityai/stable-audio-open-1.0"
>>> pipe = StableAudioPipeline.from_pretrained(repo_id, torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> # define the prompts
>>> prompt = "The sound of a hammer hitting a wooden surface."
>>> negative_prompt = "Low quality."
>>> # set the seed for generator
>>> generator = torch.Generator("cuda").manual_seed(0)
>>> # run the generation
>>> audio = pipe(
... prompt,
... negative_prompt=negative_prompt,
... num_inference_steps=200,
... audio_end_in_s=10.0,
... num_waveforms_per_prompt=3,
... generator=generator,
... ).audios
>>> output = audio[0].T.float().cpu().numpy()
>>> sf.write("hammer.wav", output, pipe.vae.sampling_rate)