Transformers documentation

تصنيف الصوت

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

تصنيف الصوت

تصنيف الصوت - تمامًا كما هو الحال مع النص - يُسند تسمية فئة كإخراج من البيانات المدخلة. الفارق الوحيد هو أنه بدلاً من مدخلات نصية، لديك موجات صوتية خام. تشمل بعض التطبيقات العملية لتصنيف الصوت تحديد نية المتحدث، وتصنيف اللغة، وحتى تحديد أنواع الحيوانات من خلال أصواتها.

ستُظهر لك هذه الدليل كيفية:

  1. قم بضبط Wav2Vec2 على مجموعة بيانات MInDS-14 لتصنيف نية المتحدث.
  2. استخدم النموذج المُحسَّن لديك للاستدلال.

للاطلاع على جميع البنى المعمارية ونقاط التفتيش المتوافقة مع هذه المهمة، ننصح بالتحقق من صفحة المهمة

قبل أن تبدأ، تأكد من تثبيت جميع المكتبات اللازمة:

pip install transformers datasets evaluate soundfile librosa torchcodec

ننصحك بتسجيل الدخول إلى حسابك على Hugging Face حتى تتمكن من رفع نموذجك ومشاركته مع المجتمع. عند الطلب، أدخل رمزك (token) لتسجيل الدخول:

>>> from huggingface_hub import notebook_login

>>> notebook_login()

تحميل مجموعة بيانات MInDS-14

ابدأ بتحميل مجموعة بيانات MInDS-14 من مكتبة 🤗 Datasets:

>>> from datasets import load_dataset, Audio

>>> minds = load_dataset("PolyAI/minds14", name="en-US", split="train")

قسّم مجموعة train من مجموعة البيانات إلى مجموعة تدريب أصغر ومجموعة اختبار باستخدام طريقة train_test_split. سيمنحك هذا فرصة للتجربة والتأكد من عمل كل شيء بشكل صحيح قبل قضاء مزيد من الوقت على مجموعة البيانات الكاملة.

>>> minds = minds.train_test_split(test_size=0.2)

ثم اطّلع على مجموعة البيانات:

>>> minds
DatasetDict({
    train: Dataset({
        features: ['path', 'audio', 'transcription', 'english_transcription', 'intent_class', 'lang_id'],
        num_rows: 450
    })
    test: Dataset({
        features: ['path', 'audio', 'transcription', 'english_transcription', 'intent_class', 'lang_id'],
        num_rows: 113
    })
})

على الرغم من أن مجموعة البيانات تحتوي على الكثير من المعلومات المفيدة، مثل lang_id وenglish_transcription، فإنك ستركّز في هذا الدليل على audio وintent_class. احذف الأعمدة الأخرى باستخدام طريقة remove_columns:

>>> minds = minds.remove_columns(["path", "transcription", "english_transcription", "lang_id"])

إليك مثالاً:

>>> minds["train"][0]
{'audio': {'array': array([ 0.        ,  0.        ,  0.        , ..., -0.00048828,
         -0.00024414, -0.00024414], dtype=float32),
  'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~APP_ERROR/602b9a5fbb1e6d0fbce91f52.wav',
  'sampling_rate': 8000},
 'intent_class': 2}

هناك حقلان:

  • audio: مصفوفة أحادية البُعد array لإشارة الصوت، ويجب استدعاؤها لتحميل ملف الصوت وإعادة أخذ عيناته.
  • intent_class: يمثل معرّف فئة نية المتحدّث.

لتسهيل على النموذج الحصول على اسم التسمية من معرّف التسمية، أنشئ قاموسًا يربط اسم التسمية برقم صحيح والعكس:

>>> labels = minds["train"].features["intent_class"].names
>>> label2id, id2label = dict(), dict()
>>> for i, label in enumerate(labels):
...     label2id[label] = str(i)
...     id2label[str(i)] = label

الآن يمكنك تحويل معرّف التسمية إلى اسم التسمية:

>>> id2label[str(2)]
'app_error'

المعالجة المسبقة

الخطوة التالية هي تحميل مستخرج ميزات Wav2Vec2 لمعالجة إشارة الصوت:

>>> from transformers import AutoFeatureExtractor

>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")

يتميز مجموعة بيانات MInDS-14 بمعدل أخذ عينات يبلغ 8kHz (يمكنك العثور على هذه المعلومات في بطاقة المجموعة)، مما يعني أنك ستحتاج إلى إعادة أخذ عينات المجموعة بمعدل 16kHz لاستخدام نموذج Wav2Vec2 المُدرَّب مسبقاً:

>>> minds = minds.cast_column("audio", Audio(sampling_rate=16_000))
>>> minds["train"][0]
{'audio': {'array': array([ 2.2098757e-05,  4.6582241e-05, -2.2803260e-05, ...,
         -2.8419291e-04, -2.3305941e-04, -1.1425107e-04], dtype=float32),
  'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~APP_ERROR/602b9a5fbb1e6d0fbce91f52.wav',
  'sampling_rate': 16000},
 'intent_class': 2}

الآن أنشئ دالة معالجة مسبقة:

  1. يستدعم عمود audio لتحميله، ويعيد أخذ عينات من ملف الصوت عند الحاجة.
  2. يتحقق مما إذا كانت معدل أخذ العينات لملف الصوت يتطابق مع معدل أخذ العينات لبيانات الصوت التي تم تدريب النموذج مسبقاً عليها. يمكنك العثور على هذه المعلومات في بطاقة النموذج الخاصة بـ Wav2Vec2.
  3. حدد طولًا أقصى للمدخلات لتجميع المدخلات الأطول دون اختصارها.
>>> def preprocess_function(examples):
...     audio_arrays = [x["array"] for x in examples["audio"]]
...     inputs = feature_extractor(
...         audio_arrays, sampling_rate=feature_extractor.sampling_rate, max_length=16000, truncation=True
...     )
...     return inputs

لتطبيق دالة المعالجة المسبقة على مجموعة البيانات بأكملها، استخدم دالة map في 🤗 Datasets. يمكنك تسريع map عن طريق تعيين batched=True لمعالجة عدة عناصر من مجموعة البيانات في وقت واحد. احذف الأعمدة غير الضرورية وأعد تسمية intent_class إلى label، كما يتطلبه النموذج:

>>> encoded_minds = minds.map(preprocess_function, remove_columns="audio", batched=True)
>>> encoded_minds = encoded_minds.rename_column("intent_class", "label")

تقييم

غالباً ما يكون تضمين مقياس أثناء التدريب مفيداً لتقييم أداء نموذجك. يمكنك تحميل طريقة تقييم بسرعة باستخدام مكتبة 🤗 Evaluate. لهذه المهمة، حمّل مقياس accuracy (راجع quick tour الخاص بـ 🤗 Evaluate لمعرفة المزيد حول كيفية تحميل المقياس وحسابه):

>>> import evaluate

>>> accuracy = evaluate.load("accuracy")

ثم أنشئ دالة تمرّر تنبؤاتك والتسميات إلى compute لحساب الدقة:

>>> import numpy as np


>>> def compute_metrics(eval_pred):
...     predictions = np.argmax(eval_pred.predictions, axis=1)
...     return accuracy.compute(predictions=predictions, references=eval_pred.label_ids)

دالة compute_metrics الخاصة بك جاهزة الآن، وستعود إليها عند إعداد التدريب.

تدريب

إذا لم تكن على دراية بتدريب نموذج باستخدام Trainer، فاطّلع على الدرس الأساسي هنا!

أنت مستعد الآن لبدء تدريب نموذجك! حمّل Wav2Vec2 باستخدام AutoModelForAudioClassification مع عدد التسميات المتوقعة، وتعيينات التسميات:

>>> from transformers import AutoModelForAudioClassification, TrainingArguments, Trainer

>>> num_labels = len(id2label)
>>> model = AutoModelForAudioClassification.from_pretrained(
...     "facebook/wav2vec2-base", num_labels=num_labels, label2id=label2id, id2label=id2label
... )

في هذه المرحلة، تبقى ثلاث خطوات فقط:

  1. حدّد معاملات التدريب الفائقة في TrainingArguments. المعامل الوحيد الإلزامي هو output_dir، الذي يحدد مكان حفظ النموذج. ستقوم بدفع هذا النموذج إلى Hub من خلال تعيين push_to_hub=True (يتعين عليك تسجيل الدخول إلى Hugging Face لرفع النموذج). في نهاية كل حقبة، سيقوم Trainer بتقييم الدقة وحفظ نقطة الفحص للتدريب.
  2. مرّر حُجج التدريب إلى Trainer مع النموذج، ومجموعة البيانات، ومُجزّئ الرموز، ومُجمِّع البيانات، ودالة compute_metrics.
  3. استدعِ train() لضبط نموذجك.
>>> training_args = TrainingArguments(
...     output_dir="my_awesome_mind_model",
...     eval_strategy="epoch",
...     save_strategy="epoch",
...     learning_rate=3e-5,
...     per_device_train_batch_size=32,
...     gradient_accumulation_steps=4,
...     per_device_eval_batch_size=32,
...     num_train_epochs=10,
...     warmup_steps=0.1,
...     logging_steps=10,
...     load_best_model_at_end=True,
...     metric_for_best_model="accuracy",
...     push_to_hub=True,
...     report_to="trackio",
... )

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     train_dataset=encoded_minds["train"],
...     eval_dataset=encoded_minds["test"],
...     processing_class=feature_extractor,
...     compute_metrics=compute_metrics,
... )

>>> trainer.train()

بمجرد اكتمال التدريب، شارك نموذجك على Hub باستخدام طريقة push_to_hub() ليتمكن الجميع من استخدام نموذجك:

>>> trainer.push_to_hub()

لمثال أكثر تفصيلاً حول كيفية ضبط نموذج للتصنيف الصوتي، راجع دفتر PyTorch المقابل.

الاستدلال

ممتاز، والآن بعد أن قمت بضبط نموذج، يمكنك استخدامه للاستدلال!

حمّل ملف صوتي للاستدلال. تذكّر بإعادة أخذ عينات معدل أخذ العينات لملف الصوت ليتطابق مع معدل أخذ العينات للنموذج، عند الحاجة.

>>> from datasets import load_dataset, Audio

>>> dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
>>> sampling_rate = dataset.features["audio"].sampling_rate
>>> audio_file = dataset[0]["audio"]["path"]

أبسط طريقة لتجربة نموذجك المُحسَّن للاستدلال هي استخدامه في pipeline(). قم بإنشاء كائن pipeline لتصنيف الصوت باستخدام نموذجك، ثم مرّر ملف الصوت الخاص بك إليه:

>>> from transformers import pipeline

>>> classifier = pipeline("audio-classification", model="stevhliu/my_awesome_minds_model")
>>> classifier(audio_file)
[
    {'score': 0.09766869246959686, 'label': 'cash_deposit'},
    {'score': 0.07998877018690109, 'label': 'app_error'},
    {'score': 0.0781070664525032, 'label': 'joint_account'},
    {'score': 0.07667109370231628, 'label': 'pay_bill'},
    {'score': 0.0755252093076706, 'label': 'balance'}
]

يمكنك أيضًا إعادة إنتاج نتائج pipeline يدويًا إذا رغبت في ذلك:

حمّل مستخرج الميزات لمعالجة ملف الصوت مسبقاً وإرجاع input كمُتَنسَرات PyTorch:

>>> from transformers import AutoFeatureExtractor

>>> feature_extractor = AutoFeatureExtractor.from_pretrained("stevhliu/my_awesome_minds_model")
>>> inputs = feature_extractor(dataset[0]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")

مرّر مدخلاتك إلى النموذج وأعد قيم logits:

>>> from transformers import AutoModelForAudioClassification

>>> model = AutoModelForAudioClassification.from_pretrained("stevhliu/my_awesome_minds_model")
>>> with torch.no_grad():
...     logits = model(**inputs).logits

احصل على الفئة ذات أعلى احتمال، واستخدم خرائط id2label الخاصة بالنموذج لتحويلها إلى تسمية:

>>> import torch

>>> predicted_class_ids = torch.argmax(logits).item()
>>> predicted_label = model.config.id2label[predicted_class_ids]
>>> predicted_label
'cash_deposit'
Update on GitHub