คำแนะนำการแยกประเภทเสียงสำหรับ Python

งาน MediaPipe Audio Classifier ช่วยคุณแยกประเภทข้อมูลเสียงได้ คุณสามารถใช้งานนี้เพื่อระบุกิจกรรมที่มีเสียงจากชุดหมวดหมู่ที่ฝึกแล้ว วิธีการเหล่านี้จะแสดงวิธีใช้ตัวแยกประเภทเสียงกับ Python

ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ได้ที่ภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างสำหรับ Audio Classifier แสดงการติดตั้งใช้งานที่สมบูรณ์ใน Python เพื่อเป็นข้อมูลอ้างอิง โค้ดนี้จะช่วยคุณทดสอบงานนี้ และเริ่มสร้างตัวแยกประเภทเสียงของคุณเอง คุณดู เรียกใช้ และแก้ไขตัวอย่างโค้ดของตัวแยกประเภทเสียงได้โดยใช้เพียงเว็บเบราว์เซอร์ด้วย Google Colab คุณดูซอร์สโค้ดสำหรับตัวอย่างนี้ได้ที่ GitHub

หากคุณใช้ตัวแยกประเภทเสียงสำหรับ Raspberry Pi โปรดดูแอปตัวอย่าง Raspberry Pi

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์และโปรเจ็กต์โค้ดเพื่อใช้ตัวแยกประเภทเสียงโดยเฉพาะ ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คู่มือการตั้งค่าสำหรับ Python

กล่องพัสดุ

งานตัวแยกประเภทเสียงของงานแพ็กเกจ Mediapipe คุณติดตั้งการขึ้นต่อกันได้โดยใช้สิ่งต่อไปนี้

$ python -m pip install mediapipe

การนำเข้า

นำเข้าชั้นเรียนต่อไปนี้เพื่อเข้าถึงฟังก์ชันงานตัวแยกประเภทเสียง

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

รุ่น

งาน MediaPipe Audio Classifier ต้องใช้โมเดลที่ผ่านการฝึกซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกที่พร้อมใช้งานสำหรับตัวแยกประเภทเสียงได้ที่ภาพรวมงานส่วนโมเดล

เลือกและดาวน์โหลดโมเดล แล้วจัดเก็บไว้ในไดเรกทอรีในเครื่อง คุณสามารถใช้โมเดล 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 ตั้งค่าโหมดการทำงาน ตัวแยกประเภทเสียงมี 2 โหมด ดังนี้

AUDIO_CLIPS: โหมดสำหรับเรียกใช้งานเสียงในคลิปเสียงที่อิสระ

AUDIO_Stream: โหมดสำหรับการเรียกใช้งานเสียงในสตรีมเสียง เช่น จากไมโครโฟน ในโหมดนี้ ต้องมีการเรียกใช้ resultsListener เพื่อตั้งค่า 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 ไม่ได้ และการใช้ทั้ง 2 รายการจะทำให้เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า
category_denylist ตั้งค่ารายการตัวเลือกของชื่อหมวดหมู่ที่ไม่ได้รับอนุญาต หากไม่ว่างเปล่า ผลลัพธ์การจัดประเภทซึ่งมีชื่อหมวดหมู่อยู่ในชุดนี้จะถูกกรองออก ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก ตัวเลือกนี้ใช้ด้วยกันกับ category_allowlist ไม่ได้เลย และใช้ทั้ง 2 ผลลัพธ์เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า
result_callback ตั้งค่า Listener ผลลัพธ์เพื่อรับผลการจัดประเภทแบบไม่พร้อมกันเมื่อตัวแยกประเภทเสียงอยู่ในโหมดสตรีมเสียง ใช้ได้เมื่อตั้งค่าโหมดการทำงานเป็น AUDIO_STREAM เท่านั้น ไม่มีข้อมูล ไม่ได้ตั้งค่า

เตรียมข้อมูล

ตัวแยกประเภทเสียงใช้ได้กับคลิปเสียงและสตรีมเสียง โดยงานนี้จะจัดการการประมวลผลอินพุตข้อมูลล่วงหน้า ซึ่งรวมถึงการสุ่มตัวอย่างใหม่ การบัฟเฟอร์ และการจัดเฟรม

เตรียมอินพุตเป็นไฟล์เสียงหรืออาร์เรย์ตัวเลข แล้วแปลงเป็นออบเจ็กต์ AudioDataMediaPipe คุณสามารถใช้ไลบรารีภายนอก เช่น SciPy เพื่อโหลดเสียงอินพุตเป็นอาร์เรย์ numpy

ตัวอย่างต่อไปนี้จะอธิบายและแสดงวิธีเตรียมข้อมูลสำหรับการประมวลผลสำหรับข้อมูลแต่ละประเภทที่มีอยู่

คลิปเสียง

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)
    

เรียกใช้งาน

ซึ่งคุณจะเรียกใช้ฟังก์ชันแยกประเภทที่สอดคล้องกับโหมดที่ทำงานอยู่เพื่อเรียกใช้การอนุมาน 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

โค้ดตัวอย่างตัวแยกประเภทเสียงจะแสดงวิธีแสดงผลการแยกประเภทที่ได้จากงานนี้ โปรดดูรายละเอียดในตัวอย่างรหัส