Transformers documentation
EnCodec
نُشر هذا النموذج في أوراق HF في 24 أكتوبر 2022، وأُضيف إلى مكتبة Hugging Face Transformers في 14 يونيو 2023.
EnCodec
نظرة عامة
قُدِّم نموذج الترميز العصبي EnCodec في High Fidelity Neural Audio Compression بواسطة Alexandre Défossez وJade Copet وGabriel Synnaeve وYossi Adi.
المستخلص من الورقة البحثية هو كالتالي:
نقدّم هنا مشفّرًا صوتيًا (Audio Codec) فائق الدقة يعمل في الوقت الفعلي، ويعتمد على الشبكات العصبية. يتكوّن هذا المشفّر من بنية مشفّرة-مفكّكة (Encoder-Decoder) تعمل على تدفّق البيانات، مع مساحة كامنة مُكمّاة (Quantized Latent Space) يتم تدريبها بطريقة شاملة من البداية إلى النهاية (End-to-End). نبسّط عملية التدريب ونسرّعها باستخدام مُنافس طيفي متعدد المقاييس (Multiscale Spectrogram Adversary) واحد، مما يقلّل من الشوائب بكفاءة ويولّد عينات عالية الجودة. نطرح آلية جديدة لموازنة الدالة الخاسرة (Loss Balancer) لتثبيت عملية التدريب؛ فوزن الدالة الخاسرة يحدد الآن نسبة التدرّج الكلي التي ينبغي أن تمثلها، مما يفصل اختيار هذا المعامل (Hyper-parameter) عن المقياس النموذجي للدالة الخاسرة. أخيرًا، ندرس كيف يمكن استخدام نماذج Transformer خفيفة الوزن لضغط التمثيل الناتج بنسبة تصل إلى 40%، مع الحفاظ على سرعة أعلى من سرعة الوقت الفعلي. نقدّم وصفًا تفصيليًا للخيارات التصميمية الرئيسية للنموذج المقترح، بما في ذلك: هدف التدريب، والتعديلات المعمارية، ودراسة لدوال الخسارة الإدراكية (Perceptual Loss Functions) المختلفة. نعرض تقييمًا ذاتيًا موسّعًا (اختبارات MUSHRA) إلى جانب دراسة استئصالية (Ablation Study) لمجموعة من نطاقات التردد ومجالات الصوت، بما في ذلك الكلام، والكلام في بيئات مليئة بالضجيج والصدى، والموسيقى. يتفوق نهجنا على الطرق المرجعية (Baselines) في جميع الإعدادات المُقيَّمة، مع الأخذ في الاعتبار الصوت أحادي القناة (Monophonic) بمعدل 24 كيلوهرتز والصوت ثنائي القناة (Stereophonic) بمعدل 48 كيلوهرتز.
تمت مساهمة هذا النموذج من قِبل Matthijs وPatrick Von Platen وArthur Zucker. يمكن العثور على الكود الأصلي هنا.
مثال على الاستخدام
فيما يلي مثال سريع على كيفية ترميز وفك ترميز صوت باستخدام هذا النموذج:
from datasets import Audio, load_dataset
from transformers import AutoProcessor, EncodecModel
librispeech_dummy = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
model = EncodecModel.from_pretrained("facebook/encodec_24khz", device_map="auto")
processor = AutoProcessor.from_pretrained("facebook/encodec_24khz")
librispeech_dummy = librispeech_dummy.cast_column("audio", Audio(sampling_rate=processor.sampling_rate))
audio_sample = librispeech_dummy[-1]["audio"]["array"]
inputs = processor(raw_audio=audio_sample, sampling_rate=processor.sampling_rate, return_tensors="pt").to(model.device)
encoder_outputs = model.encode(inputs["input_values"], inputs["padding_mask"])
# `encoder_outputs.audio_codes` contains discrete codes
audio_values = model.decode(**encoder_outputs, padding_mask=inputs["padding_mask"])[0]
# or the equivalent with a forward pass
audio_values = model(inputs["input_values"], inputs["padding_mask"]).audio_valuesEncodecConfig
فئة transformers.EncodecConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonetarget_bandwidths: list[float] | tuple[float, ...] = (1.5, 3.0, 6.0, 12.0, 24.0)sampling_rate: int = 24000audio_channels: int = 1normalize: bool = Falsechunk_length_s: int | float | None = Noneoverlap: float | None = Nonehidden_size: int = 128num_filters: int = 32num_residual_layers: int = 1upsampling_ratios: list[int] | tuple[int, ...] = (8, 5, 4, 2)norm_type: str = 'weight_norm'kernel_size: int = 7last_kernel_size: int = 7residual_kernel_size: int = 3dilation_growth_rate: int = 2use_causal_conv: bool = Truepad_mode: str = 'reflect'compress: int = 2num_lstm_layers: int = 2trim_right_ratio: float = 1.0codebook_size: int = 1024codebook_dim: int | None = Noneuse_conv_shortcut: bool = True )
المعاملات
- target_bandwidths (
list[float]، اختياري، القيمة الافتراضية[1.5, 3.0, 6.0, 12.0, 24.0]) — نطاق النطاقات الترددية المختلفة التي يمكن للنموذج ترميز الصوت بها. - sampling_rate (
int, اختياري، القيمة الافتراضية24000) — معدل أخذ العينات الذي يجب أن تُرقَم به ملفات الصوت، ويُعبَّر عنه بالهرتز (Hz). - audio_channels (
int، اختياري، القيمة الافتراضية1) — عدد قنوات الإدخال. - normalize (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب تطبيع الصوت عند تمريره. - chunk_length_s (
float, اختياري) — إذا تم تعريفه، تتم معالجة الصوت مسبقاً إلى مقاطع بطولchunk_length_sثم يتم ترميزها. - overlap (
float، اختياري) — يحدد التداخل بين كل مقطع. يُستخدم لحسابchunk_strideباستخدام المعادلة التالية:int((1.0 - self.overlap) * self.chunk_length). - hidden_size (
int، اختياري، القيمة الافتراضية128) — أبعاد التمثيلات المخفية. - num_filters (
int، اختياري، القيمة الافتراضية 32) — عدد نوى الالتفاف في طبقة الاستيفاء السفلي الأولى منEncodecConv1d. - num_residual_layers (
int، اختياري، القيمة الافتراضية 1) — عدد طبقات الباقي. - upsampling_ratios (
Sequence[int]، اختياري، القيمة الافتراضية[8, 5, 4, 2]) — نسب حجم النواة والخطوة. يستخدم المُشفِّر نسب تقليل الحجم بدلاً من نسب تكبير الحجم، لذا سيقوم باستخدام النسب بالترتيب المعاكس لتلك المحددة هنا، والتي يجب أن تتطابق مع ترتيب المُفكِّك. - norm_type (
str، اختياري، القيمة الافتراضية"weight_norm") — طريقة التطبيع. يجب أن تكون ضمن["weight_norm", "time_group_norm"] - kernel_size (
int، اختياري، القيمة الافتراضية 7) — حجم النواة للتمرير الأولي. - last_kernel_size (
int، اختياري، القيمة الافتراضية 7) — حجم النواة لطبقة الالتفاف الأخيرة. - residual_kernel_size (
int، اختياري، القيمة الافتراضية 3) — حجم النواة للطبقات المتبقية. - dilation_growth_rate (
int، اختياري، القيمة الافتراضية 2) — مقدار زيادة التمدد (dilation) في كل طبقة. - use_causal_conv (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان سيتم استخدام التمرير التكاملي السببي بالكامل. - pad_mode (
str، اختياري، القيمة الافتراضية"reflect") — وضع الحشو للعمليات التلافيفية. - compress (
int، اختياري، القيمة الافتراضية 2) — تقليل الأبعاد في الفروع المتبقية (من Demucs v3). - num_lstm_layers (
int، اختياري، القيمة الافتراضية 2) — عدد طبقات LSTM في نهاية المُشفِّر. - trim_right_ratio (
float، اختياري، القيمة الافتراضية 1.0) — النسبة المستخدمة لقص الجزء الأيمن من الالتفاف المحوّر في إطار الإعدادuse_causal_conv = True. إذا كانت تساوي 1.0، فهذا يعني أن كل عملية القص تتم على الجانب الأيمن. - codebook_size (
int، اختياري، القيمة الافتراضية1024) — عدد كتيّبات الرموز المتوازية التي يستخدمها النموذج. - codebook_dim (
int، اختياري) — أبعاد متجه تضمين كل كتاب رموز. - use_conv_shortcut (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان سيتم استخدام طبقة تلافيفية كاتصال «تخطٍّ» في كتلةEncodecResnetBlock. إذا كانت القيمة False، فسيتم استخدام دالة الهوية، مما يؤدي إلى اتصال متبقّي عام.
هذه فئة الإعدادات المخزنة لإعدادات نموذج EncodecModel. تُستخدم لاستحداث نموذج Encodec وفقاً للحجج المحددة، مع تعريف بنية النموذج. إن استحداث إعدادات باستخدام القيم الافتراضية سيؤدي إلى الحصول على إعدادات مشابهة لتلك الخاصة بـ facebook/encodec_24khz
ترث كائنات التهيئة من PreTrainedConfig ويمكن استخدامها للتحكم في مخرجات النموذج. اقرأ التوثيق الخاص بـ PreTrainedConfig لمزيد من المعلومات.
مثال:
>>> from transformers import EncodecModel, EncodecConfig
>>> # Initializing a "facebook/encodec_24khz" style configuration
>>> configuration = EncodecConfig()
>>> # Initializing a model (with random weights) from the "facebook/encodec_24khz" style configuration
>>> model = EncodecModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configEncodecFeatureExtractor
فئة transformers.EncodecFeatureExtractor
< source >( feature_size: int = 1sampling_rate: int = 24000padding_value: float = 0.0chunk_length_s: float | None = Noneoverlap: float | None = None**kwargs )
المعاملات
- feature_size (
int، اختياري، القيمة الافتراضية 1) — أبعاد الميزة للميزات المستخرجة. استخدم 1 للمono و2 لـ stereo. - sampling_rate (
int, اختياري، القيمة الافتراضية 24000) — معدل أخذ العينات الذي يجب أن تُرقَم به الموجة الصوتية، معبّرًا عنه بالهرتز (Hz). - padding_value (
float، اختياري، القيمة الافتراضية 0.0) — القيمة المستخدمة لملء قيم الحشو. - chunk_length_s (
float, اختياري) — إذا تم تعريفه، تتم معالجة الصوت مسبقاً إلى مقاطع بطولchunk_length_sثم يتم ترميزها. - overlap (
float، اختياري) — يحدد التداخل بين كل مقطع. يُستخدم لحسابchunk_strideباستخدام المعادلة التالية:int((1.0 - self.overlap) * self.chunk_length).
ينشئ مستخرج ميزات EnCodec.
يرث مستخرج الميزات هذا من SequenceFeatureExtractor الذي يحتوي على معظم الطرق الرئيسية. ينبغي للمستخدمين الرجوع إلى هذه الفئة الأصلية لمزيد من المعلومات حول تلك الطرق.
إنشاء مستخرج ميزات باستخدام القيم الافتراضية سيؤدي إلى تكوين مشابه لتكوين بنية facebook/encodec_24khz.
__call__
< source >( raw_audio: numpy.ndarray | list[float] | list[numpy.ndarray] | list[list[float]]padding: bool | str | transformers.utils.generic.PaddingStrategy | None = Nonetruncation: bool | None = Falsemax_length: int | None = Nonereturn_tensors: str | transformers.utils.generic.TensorType | None = Nonesampling_rate: int | None = None )
المعاملات
- raw_audio (
np.ndarray،list[float]،list[np.ndarray]،list[list[float]]) — التسلسل أو الدفعة من التسلسلات المراد معالجتها. يمكن أن يكون كل تسلسل مصفوفة numpy، أو قائمة من قيم float، أو قائمة من مصفوفات numpy، أو قائمة من قوائم قيم float. يجب أن تكون المصفوفة numpy من الشكل(num_samples,)للصوت أحادي القناة (feature_size = 1)، أو(2, num_samples)للصوت ثنائي القناة (feature_size = 2). - padding (
bool,strأو PaddingStrategy, اختياري, الافتراضي هوTrue) — اختر استراتيجية لحشو التسلسلات المُعادَة (وفقًا لجانب الحشو وفهرس الحشو الخاص بالنموذج) من بين الخيارات التالية:Trueأو'longest': يتم ملء التسلسلات حتى أطول تسلسل في الدفعة (أو لا يتم أي ملء إذا تم تقديم تسلسل واحد فقط).'max_length': يتم ملء النص حتى الطول الأقصى المحدد عبر الحجةmax_lengthأو حتى الطول الأقصى المقبول لإدخال النموذج إذا لم تُقدَّم تلك الحجة.Falseأو'do_not_pad'(الافتراضي): لا يوجد حشو (أي، يمكن إخراج دفعة تحتوي على تسلسلات بطول مختلف).
- truncation (
bool، اختياري، القيمة الافتراضيةFalse) — يفعّل القصّ لقطع تسلسلات الإدخال الأطول منmax_lengthإلىmax_length. - max_length (
int، اختياري) — الحد الأقصى لطول القائمة المُعادَة وطول الحشو بشكل اختياري (انظر أعلاه). - return_tensors (
strأو TensorType, اختياري) — إذا تم تعيينه، فسيُعاد تينسورات بدلاً من قائمة من الأعداد الصحيحة في Python. القيم المقبولة هي:'pt': إرجاع كائناتtorch.Tensorمن PyTorch.'np': إرجاع كائناتnp.ndarrayمن نوع Numpy.
- sampling_rate (
int, اختياري) — معدل أخذ العينات الذي تم به أخذ عينات مدخلaudio. يُوصى بشدة بتمريرsampling_rateعند استدعاء الأمامي لمنع الأخطاء الصامتة.
الطريقة الرئيسية لتحويل السلسلة أو السلاسل إلى ميزات وتجهيزها للنموذج.
EncodecModel
فئة transformers.EncodecModel
< source >( config: EncodecConfig )
المعاملات
- config (EncodecConfig) — فئة إعدادات النموذج التي تحتوي على جميع معاملات النموذج. لا يؤدي التهيئة باستخدام ملف الإعداد إلى تحميل الأوزان المرتبطة بالنموذج، بل الإعدادات فقط. راجع طريقة from_pretrained() لتحميل أوزان النموذج.
نموذج EnCodec، وهو مشفّر صوتي عصبي.
يرث هذا النموذج من PreTrainedModel. راجع توثيق الفئة الأصلية لمعرفة الطرق العامة التي تنفذها المكتبة لجميع نماذجها (مثل التحميل أو الحفظ، وتغيير حجم تضمينات الإدخال، وقص الرؤوس، وما إلى ذلك).
هذا النموذج هو أيضًا فئة فرعية من torch.nn.Module في PyTorch. استخدمه كوحدة PyTorch عادية، وارجع إلى توثيق PyTorch لكل ما يتعلق بالاستخدام العام والسلوك.
decode
< source >( audio_codes: LongTensoraudio_scales: Tensorpadding_mask: typing.Optional[torch.Tensor] = Nonereturn_dict: bool | None = Nonelast_frame_pad_length: int | None = 0 )
المعاملات
- audio_codes (
torch.LongTensorمن الشكل(nb_frames, batch_size, nb_quantizers, frame_len)، اختياري) — تضمينات رموز منفصلة محسوبة باستخدامmodel.encode. - audio_scales (قائمة بطول
nb_framesمنtorch.Tensorبشكل(batch_size, 1)، اختياري) — معامل التوسيع لكل مدخلaudio_codes. - padding_mask (
torch.Tensorمن الشكل(channels, sequence_length)) — قناع الحشو المستخدم لحشوinput_values. - return_dict (
bool، اختياري) — ما إذا كان يجب إرجاع ModelOutput بدلاً من tuple عادي. - last_frame_pad_length (
int, اختياري) — عدد صحيح يمثل طول الحشو في الإطار الأخير، والذي يُزال أثناء فك الترميز.
يفكك الإطارات المعطاة إلى موجة صوتية ناتجة.
لاحظ أن المخرجات قد تكون أكبر قليلاً من المدخلات. في هذه الحالة، يمكن قص أي خطوات زائدة في النهاية.
encode
< source >( input_values: Tensorpadding_mask: typing.Optional[torch.Tensor] = Nonebandwidth: float | None = Nonereturn_dict: bool | None = None ) → EncodecEncoderOutput dict or a tuple containing
المعاملات
- input_values (
torch.Tensorمن الشكل(batch_size, channels, sequence_length)) — قيمات عشرية لموجة الصوت المدخلة. - padding_mask (
torch.Tensorمن الشكل(batch_size, channels, sequence_length)) — قناع الحشو المستخدم لحشوinput_values. - bandwidth (
float، اختياري) — النطاق الترددي المستهدف. يجب أن يكون أحد قيمconfig.target_bandwidths. إذا كانتNone، يتم استخدام أصغر نطاق ترددي ممكن. يُعبَّر عن bandwidth كألف من قيمته الفعلية، على سبيل المثال، يُعبَّر عن نطاق ترددي قدره 6kbps على أنه bandwidth == 6.0
يعيد
EncodecEncoderOutput قاموس أو مجموعة مرتبة تحتوي
- audio_codes (
torch.LongTensorمن الشكل(nb_frames, batch_size, nb_quantizers, frame_len)، اختياري)، - audio_scales (قائمة بطول
nb_framesمنtorch.Tensorبشكل(batch_size, 1)، اختياري)، - last_frame_pad_length (
int، اختياري).
يقوم بتشفير موجة الصوت المدخلة إلى رموز منفصلة ذات الشكل (nb_frames, batch_size, nb_quantizers, frame_len).
nb_frames=1إذا كانself.config.chunk_length=None(لأن المُشفِّر يُطبَّق على الصوت الكامل)، وهو ما ينطبق على نموذج 24kHz. وإلا، يكونnb_frames=ceil(input_length/self.config.chunk_stride)، وهو ما ينطبق على نموذج 48kHz.frame_lenهو طول كل إطار، وهو يساويceil(input_length/self.config.hop_length)إذا كانself.config.chunk_length=None(على سبيل المثال، بالنسبة لنموذج 24kHz). وإلا، إذا كانself.config.chunk_lengthمعرّفًا، فإنframe_len=self.config.chunk_length/self.config.hop_length، على سبيل المثال، الحالة الخاصة بنموذج 48kHz حيثframe_len=150.
forward
< source >( input_values: Tensorpadding_mask: typing.Optional[torch.BoolTensor] = Nonebandwidth: float | None = Noneaudio_codes: typing.Optional[torch.LongTensor] = Noneaudio_scales: typing.Optional[torch.Tensor] = Nonereturn_dict: bool | None = Nonelast_frame_pad_length: int | None = 0 ) → EncodecOutput or tuple(torch.Tensor)
المعاملات
- input_values (
torch.Tensorمن الشكل(batch_size, channels, sequence_length)، اختياري) — مدخلات صوت خام تم تحويلها إلى Float وتم ملؤها بالطول المناسب لتُرمَّز باستخدام مقاطع من الطول self.chunk_length وخطوةconfig.chunk_stride. - padding_mask (
torch.BoolTensorبشكل(batch_size, channels, sequence_length), اختياري) — قناع لتجنب حساب معاملات التوسيع على فهارس رموز الحشو (هل يمكننا تجنب حساب الالتفاف عليها؟). قيم القناع المختارة من [0, 1]: 1 للرموز غير المقنّعة، و0 للرموز المقنّعة. يجب دائمًا تمرير padding_mask، ما لم يكن المدخلات مقطوعة أو غير محشوّة. وذلك لأن المعالجة الفعّالة للتensors تتطلب حشو الصوت المدخل بحيث يكون input_length % stride = step حيث step = chunk_length-stride. وهذا يضمن أن جميع المقاطع لها نفس الشكل[0, 1]:- 1 للرموز التي لم تُقنَّع،
- 0 للرموز التي تم إخفاؤها.
يجب دائمًا تمرير
padding_mask، ما لم يكن المدخلات مقصوصة أو غير مُسدَّدة. والسبب في ذلك هو أنه من أجل معالجة المصفوفات (tensors) بفعالية، يجب سدّ مسافات الصوت المدخل بحيث يكونinput_length % stride = stepحيثstep = chunk_length-stride. وهذا يضمن أن تكون جميع المقاطع (chunks) بنفس الشكل - bandwidth (
float, اختياري) — النطاق الترددي المستهدف. يجب أن يكون أحد قيمconfig.target_bandwidths. إذا كانتNone، يتم استخدام أصغر نطاق ترددي ممكن. يُعبَّر عن bandwidth بالألف من قيمته الفعلية، على سبيل المثال، يُعبَّر عن نطاق ترددي قدره 6kbps على أنهbandwidth == 6.0 - audio_codes (
torch.LongTensorمن الشكل(nb_frames, batch_size, nb_quantizers, frame_len)، اختياري) — تضمينات رموز منفصلة محسوبة باستخدامmodel.encode. - audio_scales (
listبطولnb_framesمنtorch.Tensorبشكل(batch_size, 1)، اختياري) — معامل التوسيع لكل مدخل منaudio_codes. - return_dict (
bool، اختياري) — ما إذا كان يجب إرجاع المخرجات على شكل قاموس. - last_frame_pad_length (
int, اختياري) — طول الحشو في الإطار الأخير، إن وُجد. يُستخدم هذا لضمان إمكانية إخراج الإطارات المُرمّزة كمُتجه (Tensor). يجب تمرير هذه القيمة أثناء فك الترميز لضمان إزالة الحشو من الإطارات المُرمّزة.
يعيد
EncodecOutput أو tuple(torch.Tensor)
EncodecOutput أو مجموعة (tuple) من
torch.Tensor (إذا تم تمرير return_dict=False أو عندما يكون config.return_dict=False) وتتضمن عناصر مختلفة
تعتمد على الإعداد (EncodecConfig) والمدخلات.
تتجاوز طريقة EncodecModel الخاصة بالتقدم الأمامي الطريقة الخاصة __call__.
على الرغم من أنه يجب تعريف وصفة المرور الأمامي داخل هذه الدالة، إلا أنه ينبغي استدعاء كائن
Moduleبدلاً من هذه الدالة، لأن الكائن يتولى تنفيذ خطوات المعالجة المسبقة والمعالجة اللاحقة، بينما تتجاهل الدالة هذه الخطوات بصمت.
- audio_codes (
torch.LongTensorمن الشكل(nb_frames, batch_size, nb_quantizers, frame_len)، اختياري) — تضمينات رموز منفصلة محسوبة باستخدامmodel.encode. - audio_values (
torch.Tensorمن الشكل(batch_size, segment_length)، اختياري) — قيم الصوت المُفكّكة، المُستخرجة باستخدام جزء فك الترميز في Encodec.
أمثلة:
>>> from datasets import load_dataset
>>> from transformers import AutoProcessor, EncodecModel
>>> dataset = load_dataset("hf-internal-testing/ashraq-esc50-1-dog-example")
>>> audio_sample = dataset["train"]["audio"][0]["array"]
>>> model_id = "facebook/encodec_24khz"
>>> model = EncodecModel.from_pretrained(model_id)
>>> processor = AutoProcessor.from_pretrained(model_id)
>>> inputs = processor(raw_audio=audio_sample, return_tensors="pt")
>>> outputs = model(**inputs)
>>> audio_codes = outputs.audio_codes
>>> audio_values = outputs.audio_values