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

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

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

مثال الرمز البرمجي

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

ضبط إعدادات الجهاز

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

حِزم JavaScript

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

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

npm install @mediapipe/tasks-audio

إذا كنت ترغب في استيراد رمز المهمة من خلال خدمة شبكة توصيل المحتوى (CDN)، أضِف الرمز التالي في العلامة في ملف 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 Audio Classife نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. للحصول على مزيد من المعلومات حول النماذج المدربة المتاحة لأداة "تصنيف الصوت"، راجِع قسم النماذج الذي يقدّم نظرة عامة على المهمة.

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

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

إنشاء المهمة

استخدِم إحدى وظائف createFrom...() "مصنِّف الصوت" لإعداد المهمة لتشغيل الاستنتاجات. استخدِم الدالة 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"
    }
  });

يتيح المثال على تنفيذ الرمز الخاص بـ "مصنِّف الصوت" للمستخدم الاختيار من بين أوضاع المعالجة. يجعل هذا النهج كود إنشاء المهمة أكثر تعقيدًا وقد لا يكون مناسبًا لحالة استخدامك. يمكنك الاطّلاع على الوضعَين المختلفَين في الدالتَين runAudioClassification() وrunStreamingAudioClassification() في example code.

خيارات الضبط

تتضمن هذه المهمة خيارات التهيئة التالية لتطبيقات الويب وJavaScript:

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
displayNamesLocale تحدِّد هذه السياسة لغة التصنيفات التي سيتم استخدامها للأسماء المعروضة في البيانات الوصفية لنموذج المهمة، إذا كان ذلك متاحًا. الإعداد التلقائي هو en للغة الإنجليزية. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص باستخدام TensorFlow Lite Metadata Scriptr 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

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