מדריך לסיווג אודיו ב-Python

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

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

קוד לדוגמה

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

אם אתם מטמיעים את מסווג האודיו עבור Raspberry Pi, עיינו באפליקציה לדוגמה של Raspberry Pi.

הגדרה

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

חבילות

'מסווג אודיו' מבצע משימה של חבילת PIPP. אפשר להתקין את התלות באמצעות הפעולות הבאות:

$ python -m pip install mediapipe

יבוא

כדי לגשת לפונקציות המשימה של Audio Classifier, צריך לייבא את המחלקות הבאות:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import audio

מודל

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

בוחרים מודל ומורידים אותו, ולאחר מכן מאחסנים אותו בספרייה מקומית. אפשר להשתמש במודל Yamnet המומלץ.

model_path = '/absolute/path/to/lite-model_yamnet_classification_tflite_1.tflite'

מציינים את הנתיב של המודל בתוך הפרמטר של שם המודל, באופן הבא:

base_options = BaseOptions(model_asset_path=model_path)

יצירת המשימה

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

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

קטעי אודיו

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=AudioRunningMode.AUDIO_CLIPS)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

שידור האודיו

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioClassifierResult = mp.tasks.audio.AudioClassifierResult
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

def print_result(result: AudioClassifierResult, timestamp_ms: int):
    print(AudioClassifierResult result: {}’.format(result))

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=AudioRunningMode.AUDIO_STREAM,
    max_results=5,
    result_callback=print_result)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
  

לצפייה בדוגמה מלאה של יצירת מסווג אודיו לשימוש עם אודיו, ראו דוגמה לקוד.

אפשרויות הגדרה

במשימה הזאת קיימות אפשרויות ההגדרה הבאות לאפליקציות Python:

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

AUDIO_CLIPS: המצב להרצת משימת אודיו בקטעי אודיו עצמאיים.

AUDIO_STREAM: המצב להרצת משימת אודיו בשידור אודיו, למשל דרך המיקרופון. במצב הזה, יש לקרוא ל- resultListener על מנת להגדיר listener כדי לקבל את תוצאות הסיווג באופן אסינכרוני.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
display_names_locale ההגדרה הזו מגדירה את השפה של התוויות שישמשו לשמות תצוגה שנמסרים במטא-נתונים של מודל המשימה, אם יש כאלה. ברירת המחדל היא en עבור אנגלית. אפשר להוסיף תוויות שהותאמו לשוק המקומי למטא-נתונים של מודל מותאם אישית באמצעות TensorFlow Lite Metadata Writer API קוד הלוקאל en
max_results הפונקציה מגדירה את המספר המקסימלי האופציונלי של תוצאות מהסיווג הגבוה ביותר להחזרה. אם הערך קטן מ-0, יוחזרו כל התוצאות הזמינות. כל מספר חיובי -1
score_threshold השדה הזה מגדיר את סף הציון של החיזוי ששונה מהסף שצוין במטא-נתונים של המודל (אם יש כזה). תוצאות מתחת לערך הזה יידחו. [0.0, 1.0] לא הוגדרה
category_allowlist מגדיר את הרשימה האופציונלית של שמות הקטגוריות המותרות. אם השדה לא ריק, תוצאות סיווג ששם הקטגוריה שלהן לא נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-category_denylist ומשתמשת בשתי התוצאות כשגיאה. כל מחרוזת לא הוגדרה
category_denylist מגדיר את הרשימה האופציונלית של שמות קטגוריות אסורים. אם התוצאות לא ריקות, תוצאות הסיווג ששם הקטגוריה שלהן נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-category_allowlist, והשימוש בשתי האפשרויות האלה גורם לשגיאה. כל מחרוזת לא הוגדרה
result_callback מגדיר את מאזן התוצאות לקבל את תוצאות הסיווג באופן אסינכרוני כאשר מסווג האודיו נמצא במצב שידור אודיו. אפשר להשתמש רק כשמצב ריצה מוגדר ל-AUDIO_STREAM לא רלוונטי לא הוגדרה

הכנת הנתונים

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

מכינים את הקלט כקובץ אודיו או כמערך numpy, ואז ממירים אותו לאובייקט AudioData של MediaPipe. אפשר להשתמש בספרייה חיצונית כמו SciPy כדי לטעון את קטעי האודיו של הקלט בתור מערכים נומריים.

הדוגמאות הבאות מסבירות ומראות איך להכין את הנתונים לעיבוד כל אחד מסוגי הנתונים הזמינים:

קטעי אודיו

import numpy as np
from scipy.io import wavfile

AudioData = mp.tasks.components.containers.AudioData

sample_rate, buffer = wavfile.read('/path/to/audio.wav')
audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

שידור האודיו

import numpy as np

AudioData = mp.tasks.components.containers.AudioData

# Read microphone data as np arrays, then call

audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

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

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

קטעי אודיו

# Perform audio classification on the provided audio clip.
audio_classifier_result_list = classifier.classify(audio_data)
    

שידור האודיו

# Send live audio data to perform audio classification.
# Results are sent to the `result_callback` provided in the `AudioClassifierOptions`
classifier.classify_async(audio_data, timestamp_ms)
    

שימו לב לנקודות הבאות:

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

דוגמה מלאה יותר להפעלת מסווג אודיו עם קטעי אודיו זמינה בדוגמה לקוד.

טיפול בתוצאות והצגתן

לאחר הרצה של מסקנות, המשימה 'מסווג אודיו' מחזירה אובייקט 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

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