دليل تصنيف الصوت للويب

تتيح لك مهمة "مصنّف الصوت" في MediaPipe إجراء عملية تصنيف لبيانات صوتية. يمكنك استخدام هذه المهمة لتحديد أحداث صوتية من مجموعة من الفئات المدرَّبة. توضّح هذه التعليمات كيفية استخدام "أداة تصنيف الصوت" لتطبيقات Node وتطبيقات الويب.

يمكنك الاطّلاع على هذه المهمة أثناء تنفيذها من خلال مشاهدة العرض التوضيحي. لمزيد من المعلومات حول إمكانات هذه المهمة ونماذجها وخيارات إعداداتها، يُرجى الاطّلاع على نظرة عامة.

مثال على الرمز

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

الإعداد

يوضّح هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير ومشاريع الرموز البرمجية لاستخدام Audio Classifier على وجه التحديد. للحصول على معلومات عامة حول إعداد بيئة التطوير لاستخدام "مهام MediaPipe"، بما في ذلك متطلبات إصدار النظام الأساسي، يُرجى الاطّلاع على دليل الإعداد للويب.

حِزم JavaScript

يتوفّر رمز "مصنّف الصوت" من خلال حزمة @mediapipe/tasks-audio NPM في MediaPipe. يمكنك العثور على هذه المكتبات وتنزيلها من الروابط المتوفّرة في دليل الإعداد الخاص بالمنصة.

يمكنك تثبيت الحِزم المطلوبة باستخدام الرمز التالي للتجهيز المحلي باستخدام الأمر التالي:

npm install @mediapipe/tasks-audio

إذا كنت تريد استيراد رمز المهمة من خلال خدمة شبكة توصيل المحتوى (CDN)، أضِف الرمز التالي في علامة <head> في ملف HTML:

<!-- Replace "my-cdn-service.com" with your CDN -->
<head>
  <script src="https://my-cdn-service.com/npm/@mediapipe/tasks-audio/audio_bundle.js"
    crossorigin="anonymous"></script>
</head>

الطراز

تتطلّب مهمة "تصنيف الصوت" في MediaPipe نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. لمزيد من المعلومات حول النماذج المدرَّبة المتاحة في &quot;مصنّف الصوت&quot;، يُرجى الاطّلاع على قسم &quot;النماذج&quot; في نظرة عامة على المهمة.

اختَر نموذجًا ونزِّله، ثم خزِّنه في دليل مشروعك، على سبيل المثال:

<dev-project-root>/app/shared/models/

إنشاء المهمة

استخدِم إحدى دوال createFrom...() في Audio Classifier لإعداد المهمة لتنفيذ عمليات الاستدلال. استخدِم الدالة createFromModelPath() مع مسار نسبي أو مطلق إلى ملف النموذج المدرَّب. إذا كان النموذج محملًا في الذاكرة، يمكنك استخدام طريقة createFromModelBuffer().

يوضّح مثال الرمز البرمجي أدناه كيفية استخدام الدالة createFromOptions() لإعداد المهمة. تتيح لك الدالة createFromOptions تخصيص أداة "تصنيف الصوت" باستخدام خيارات الضبط. لمزيد من المعلومات حول خيارات الإعداد، يُرجى الاطّلاع على خيارات الإعداد.

يوضّح الرمز التالي كيفية إنشاء المهمة وضبطها باستخدام خيارات مخصّصة:

const audio = await FilesetResolver.forAudioTasks(
    "https://my-cdn-service.com/npm/@mediapipe/tasks-audio/wasm"
  );

const audioClassifier = await AudioClassifier.createFromOptions(audio, {
    baseOptions: {
      modelAssetPath:
        "https://tfhub.dev/google/lite-model/yamnet/classification/tflite/1?lite-format=tflite"
    }
  });

يمكنك الاطّلاع على مثال كامل على example code.

خيارات الإعداد

تتضمّن هذه المهمة خيارات الإعداد التالية لتطبيقات الويب وJavaScript:

اسم الخيار الوصف نطاق القيم القيمة التلقائية
displayNamesLocale تضبط هذه السمة لغة التصنيفات التي سيتم استخدامها للأسماء المعروضة المقدَّمة في البيانات الوصفية لنموذج المهمة، إذا كانت متاحة. القيمة التلقائية هي en للغة الإنجليزية. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية الخاصة بنموذج مخصّص باستخدام TensorFlow Lite Metadata Writer API. رمز اللغة en
maxResults تضبط هذه السمة الحد الأقصى الاختياري لعدد نتائج التصنيف الأعلى تقييمًا التي سيتم عرضها. إذا كانت القيمة < 0، سيتم عرض جميع النتائج المتاحة. أي أرقام موجبة -1
scoreThreshold تضبط هذه السمة الحدّ الأدنى لنتيجة التوقّع الذي يتجاوز الحدّ الأدنى المقدَّم في البيانات الوصفية للنموذج (إن وُجد). ويتم رفض النتائج التي تقلّ عن هذه القيمة. [0.0, 1.0] لم يتم الضبط
categoryAllowlist تضبط هذه السمة القائمة الاختيارية لأسماء الفئات المسموح بها. إذا لم تكن فارغة، سيتم استبعاد نتائج التصنيف التي لا يتضمّن اسم فئتها هذه المجموعة. يتم تجاهل أسماء الفئات المكرّرة أو غير المعروفة. لا يمكن استخدام هذا الخيار مع categoryDenylist، وسيؤدي استخدام كليهما إلى حدوث خطأ. أي سلاسل لم يتم الضبط
categoryDenylist تضبط هذه السمة قائمة اختيارية بأسماء الفئات غير المسموح بها. في حال عدم توفّر قيمة، سيتم فلترة نتائج التصنيف التي يتضمّن اسم فئتها هذه المجموعة. يتم تجاهل أسماء الفئات المكرّرة أو غير المعروفة. لا يمكن استخدام هذا الخيار مع categoryAllowlist في الوقت نفسه، وسيؤدي استخدام كليهما إلى حدوث خطأ. أي سلاسل لم يتم الضبط

إعداد البيانات

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

تنفيذ المهمة

يستخدم مصنّف الصوت طريقة classify() لتنفيذ استنتاجات لملفات مقاطع صوتية أو بث صوتي. تعرض واجهة برمجة التطبيقات Audio Classifier API الفئات المحتملة للأحداث الصوتية التي تم التعرّف عليها في الصوت المُدخَل.

يتم تنفيذ طلبات الطريقة classify() في "مصنّف الصوت" بشكل متزامن، ما يؤدي إلى حظر سلسلة التعليمات البرمجية الخاصة بواجهة المستخدم. إذا صنّفت الصوت من ميكروفون جهاز، سيؤدي كل تصنيف إلى حظر سلسلة التعليمات الرئيسية. يمكنك منع حدوث ذلك من خلال تنفيذ عاملي الويب لتشغيل classify() في سلسلة محادثات أخرى.

يوضّح الرمز التالي كيفية تنفيذ المعالجة باستخدام نموذج المهمة:

مقاطع صوتية

// Create audio buffer
const sample = await response.arrayBuffer();
const audioBuffer = await audioCtx.decodeAudioData(sample);

// Use AudioClassifier to run classification
const results = audioClassifier.classify(
  audioBuffer.getChannelData(0),
  audioBuffer.sampleRate
);
  

البث الصوتي

stream = await navigator.mediaDevices.getUserMedia(constraints);
audioCtx = new AudioContext({ sampleRate: 16000 });

const source = audioCtx.createMediaStreamSource(stream);
const scriptNode = audioCtx.createScriptProcessor(16384, 1, 1);

scriptNode.onaudioprocess = function (audioProcessingEvent) {
  const inputBuffer = audioProcessingEvent.inputBuffer;
  let inputData = inputBuffer.getChannelData(0);

  // Classify the audio
  const result = audioClassifier.classify(inputData);
  const categories = result[0].classifications[0].categories;
};
  

للحصول على تنفيذ أكثر اكتمالاً لمهمة "مصنّف الصوت"، اطّلِع على المثال.

التعامل مع النتائج وعرضها

بعد إكمال عملية الاستدلال، تعرض مهمة "مصنّف الصوت" عنصر AudioClassifierResult يحتوي على قائمة بالفئات المحتملة للأصوات ضمن الصوت المُدخَل.

AudioClassifierResult:
  Timestamp in microseconds: 100
  ClassificationResult #0:
    Timestamp in microseconds: 100  
    Classifications #0 (single classification head):
      head index: 0
      category #0:
        category name: "Speech"
        score: 0.6
        index: 0
      category #1:
        category name: "Music"
        score: 0.2
        index: 1

يوضّح مثال الرمز البرمجي الخاص بمصنّف الصوت كيفية عرض نتائج التصنيف التي تعرضها المهمة، ويمكنك الاطّلاع على المثال للحصول على التفاصيل.