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

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

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

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

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

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

ตั้งค่า

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

แพ็กเกจ

ตัวแยกประเภทเสียงจะทำงานกับแพ็กเกจ Mediapไปป์ คุณสามารถติดตั้ง Dependency ต่อไปนี้ด้วย

$ python -m pip install mediapipe

การนำเข้า

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

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

รุ่น

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

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

เรียกใช้งาน

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

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