מדריך לסיווג אודיו באינטרנט

המשימה 'מסווג אודיו של MediaPipe' מאפשרת לך לבצע סיווג של נתוני אודיו. אפשר להשתמש במשימה הזו כדי לזהות אירועים של זיהוי צלילים מקבוצה של קטגוריות מאומנות. בהוראות שכאן מוסבר איך להשתמש במסווג אודיו לאפליקציות של צמתים ולאפליקציות אינטרנט.

תוכלו לראות את המשימה הזו בהדגמה. למידע נוסף על היכולות, המודלים ואפשרויות ההגדרה של המשימה הזו, קראו את הסקירה הכללית.

קוד לדוגמה

הקוד לדוגמה של Audio Classifier מספק הטמעה מלאה של המשימה הזו ב-JavaScript לעיונך. הקוד הזה יעזור לכם לבדוק את המשימה הזו ולהתחיל ליצור אפליקציה משלכם לסיווג אודיו. תוכלו להציג, להריץ ולערוך את הקוד לדוגמה של מסווג האודיו, באמצעות דפדפן האינטרנט בלבד.

הגדרה

בקטע הזה מתוארים שלבי המפתח להגדרת סביבת הפיתוח ופרויקטים של קוד, במיוחד לשימוש במסווג אודיו. למידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל הדרישות לגרסת הפלטפורמה, קראו את מדריך ההגדרה לאינטרנט.

חבילות JavaScript

הקוד של סיווג האודיו זמין דרך חבילת MediaPipe @mediapipe/tasks-audio NPM. אפשר למצוא ולהוריד את הספריות האלה מהקישורים שמופיעים במדריך ההגדרה של הפלטפורמה.

כדי להתקין את החבילות הנדרשות עם הקוד הבא ל-Staging מקומי, אתם יכולים להשתמש בפקודה הבאה:

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' צריך מודל מאומן שתואם למשימה הזו. למידע נוסף על המודלים הזמינים למסווג אודיו, עיינו בסקירה הכללית על המשימות בקטע Models.

בוחרים ומורידים מודל, ולאחר מכן שומרים אותו בספריית הפרויקט. לדוגמה:

<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 Writer API קוד הלוקאל en
maxResults הפונקציה מגדירה את המספר המקסימלי האופציונלי של תוצאות מהסיווג הגבוה ביותר להחזרה. אם הערך קטן מ-0, יוחזרו כל התוצאות הזמינות. כל מספר חיובי -1
scoreThreshold השדה הזה מגדיר את סף הציון של החיזוי ששונה מהסף שצוין במטא-נתונים של המודל (אם יש כזה). תוצאות מתחת לערך הזה יידחו. [0.0, 1.0] לא הוגדרה
categoryAllowlist מגדיר את הרשימה האופציונלית של שמות הקטגוריות המותרות. אם השדה לא ריק, תוצאות סיווג ששם הקטגוריה שלהן לא נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-categoryDenylist ומשתמשת בשתי התוצאות כשגיאה. כל מחרוזת לא הוגדרה
categoryDenylist מגדיר את הרשימה האופציונלית של שמות קטגוריות אסורים. אם התוצאות לא ריקות, תוצאות הסיווג ששם הקטגוריה שלהן נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-categoryAllowlist, והשימוש בשתי האפשרויות האלה גורם לשגיאה. כל מחרוזת לא הוגדרה

הכנת הנתונים

מסווג אודיו פועל עם קטעי אודיו ושידורי אודיו, והוא יכול לעבוד עם קובצי אודיו בכל פורמט שנתמך על ידי הדפדפן המארח. המשימה מטפלת בעיבוד מראש של קלט הנתונים, כולל דגימה מחדש, אגירת נתונים ופריים.

מריצים את המשימה.

מסווג האודיו משתמש בשיטה classify() כדי להריץ מסקנות מקובצי קליפ של אודיו או לשידורי אודיו. Audio Classifier API מחזיר את הקטגוריות האפשריות לאירועי אודיו שזוהו בקלט של האודיו.

קריאות לשיטה classify() של מסווג אודיו פועלות באופן סינכרוני וחוסמות את ה-thread של ממשק המשתמש. אם אתם מסווגים אודיו מהמיקרופון של המכשיר, כל סיווג יחסום את ה-thread הראשי. אפשר למנוע זאת על ידי הטמעת עובדי אינטרנט שמריצים את classify() ב-thread אחר.

הקוד הבא מדגים איך לבצע את העיבוד באמצעות מודל המשימה:

קטעי אודיו

// 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

הקוד לדוגמה של מסווג האודיו מדגים איך להציג את תוצאות הסיווג שהוחזרו מהמשימה. פרטים נוספים זמינים בקוד לדוגמה.