Hướng dẫn phân loại âm thanh cho Python

Tác vụ của Trình phân loại âm thanh MediaPipe cho phép bạn phân loại dữ liệu âm thanh. Bạn có thể sử dụng nhiệm vụ này để xác định các sự kiện âm thanh từ một tập hợp danh mục đã được huấn luyện. Các hướng dẫn này cho bạn biết cách sử dụng Trình phân loại âm thanh bằng Python.

Để biết thêm thông tin về các tính năng, mô hình và lựa chọn cấu hình của nhiệm vụ này, hãy xem phần Tổng quan.

Ví dụ về mã

Mã mẫu cho Trình phân loại âm thanh cung cấp cách triển khai đầy đủ tác vụ này trong Python để bạn tham khảo. Mã này giúp bạn kiểm thử nhiệm vụ này và bắt đầu xây dựng thuật toán phân loại âm thanh của riêng mình. Bạn có thể xem, chạy và chỉnh sửa mã mẫu của Trình phân loại âm thanh chỉ bằng trình duyệt web với Google Colab. Bạn có thể xem mã nguồn cho ví dụ này trên GitHub.

Nếu bạn đang triển khai Tính năng phân loại âm thanh cho Rassberry Pi, hãy tham khảo ứng dụng mẫu Rspberry Pi.

Thiết lập

Phần này mô tả các bước chính để thiết lập môi trường phát triển và các dự án mã dành riêng cho việc sử dụng Trình phân loại âm thanh. Để biết thông tin chung về cách thiết lập môi trường phát triển nhằm sử dụng các tác vụ của MediaPipe, bao gồm cả các yêu cầu về phiên bản nền tảng, hãy xem Hướng dẫn thiết lập dành cho Python.

Gói

Trình phân loại âm thanh tác vụ cho gói pip mediapipe. Bạn có thể cài đặt phần phụ thuộc bằng đoạn mã sau:

$ python -m pip install mediapipe

Nhập

Nhập các lớp sau để truy cập vào các chức năng tác vụ của Trình phân loại âm thanh:

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

Mẫu

Tác vụ của Trình phân loại âm thanh MediaPipe cần có một mô hình đã qua huấn luyện tương thích với tác vụ này. Để biết thêm thông tin về các mô hình được huấn luyện hiện có cho Công cụ phân loại âm thanh, hãy xem phần Mô hình tổng quan về tác vụ.

Chọn và tải một mô hình xuống rồi lưu trữ trong thư mục cục bộ. Bạn có thể sử dụng mô hình Yamnet được đề xuất.

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

Chỉ định đường dẫn của mô hình trong tham số Tên mô hình, như minh hoạ dưới đây:

base_options = BaseOptions(model_asset_path=model_path)

Tạo việc cần làm

Dùng hàm create_from_options để tạo tác vụ. Hàm create_from_options chấp nhận các tuỳ chọn cấu hình, trong đó có chế độ chạy, ngôn ngữ của tên hiển thị, số lượng kết quả tối đa, ngưỡng tin cậy, danh sách cho phép theo danh mục và danh sách từ chối. Để biết thêm thông tin về các lựa chọn cấu hình, hãy xem phần Tổng quan về cấu hình.

Nhiệm vụ của Trình phân loại âm thanh hỗ trợ các đoạn âm thanh và luồng âm thanh làm đầu vào. Bạn phải chỉ định chế độ chạy tương ứng với loại dữ liệu đầu vào khi tạo tác vụ. Chọn thẻ tương ứng với loại dữ liệu đầu vào của bạn để xem cách tạo tác vụ và chạy suy luận.

Đoạn âm thanh

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.
  # ...
    

Luồng âm thanh

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.
  # ...
  

Để biết ví dụ đầy đủ về cách tạo Trình phân loại âm thanh để sử dụng với âm thanh, hãy xem ví dụ về mã.

Các lựa chọn về cấu hình

Tác vụ này có các lựa chọn cấu hình sau đây cho các ứng dụng Python:

Tên lựa chọn Nội dung mô tả Khoảng giá trị Giá trị mặc định
running_mode Đặt chế độ chạy cho tác vụ. Trình phân loại âm thanh có 2 chế độ:

AUDIO_CLIPS: Chế độ chạy tác vụ âm thanh trên các đoạn âm thanh độc lập.

AUDIO_STREAM: Chế độ chạy tác vụ âm thanh trên một luồng âm thanh, chẳng hạn như từ micrô. Ở chế độ này, resultsListener phải được gọi để thiết lập trình nghe nhằm nhận kết quả phân loại một cách không đồng bộ.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
display_names_locale Đặt ngôn ngữ của nhãn để sử dụng cho tên hiển thị được cung cấp trong siêu dữ liệu của mô hình của tác vụ, nếu có. Giá trị mặc định là en đối với tiếng Anh. Bạn có thể thêm nhãn đã bản địa hoá vào siêu dữ liệu của mô hình tuỳ chỉnh bằng cách sử dụng API Trình viết siêu dữ liệu TensorFlow Lite Mã ngôn ngữ vi
max_results Đặt số lượng kết quả phân loại được tính điểm cao nhất (không bắt buộc) để trả về. Nếu < 0, hàm sẽ trả về tất cả kết quả hiện có. Số dương bất kỳ -1
score_threshold Đặt ngưỡng điểm dự đoán để ghi đè ngưỡng được cung cấp trong siêu dữ liệu mô hình (nếu có). Những kết quả bên dưới giá trị này sẽ bị từ chối. [0,0, 1,0] Không đặt
category_allowlist Đặt danh sách các tên danh mục được phép (không bắt buộc). Nếu không để trống, kết quả phân loại có tên danh mục không có tên trong tập hợp này sẽ bị lọc ra. Tên danh mục trùng lặp hoặc không xác định sẽ bị bỏ qua. Tuỳ chọn này loại trừ lẫn nhau với category_denylist và việc sử dụng cả hai sẽ dẫn đến lỗi. Chuỗi bất kỳ Không đặt
category_denylist Đặt danh sách các tên danh mục không được phép (không bắt buộc). Nếu không để trống, kết quả phân loại có tên danh mục nằm trong tập hợp này sẽ bị lọc ra. Tên danh mục trùng lặp hoặc không xác định sẽ bị bỏ qua. Tuỳ chọn này loại trừ lẫn nhau với category_allowlist và việc sử dụng cả hai sẽ gây ra lỗi. Chuỗi bất kỳ Không đặt
result_callback Đặt trình nghe kết quả để nhận kết quả phân loại một cách không đồng bộ khi Trình phân loại âm thanh đang ở chế độ phát trực tuyến âm thanh. Chỉ có thể sử dụng khi bạn đặt chế độ chạy thành AUDIO_STREAM Không áp dụng Không đặt

Chuẩn bị dữ liệu

Trình phân loại âm thanh hoạt động với các đoạn âm thanh và luồng âm thanh. Tác vụ này xử lý trước việc xử lý trước dữ liệu đầu vào, bao gồm cả lấy mẫu lại, lưu vào bộ đệm và lấy khung hình.

Chuẩn bị dữ liệu đầu vào dưới dạng tệp âm thanh hoặc mảng numpy, sau đó chuyển đổi dữ liệu đó thành đối tượng AudioData MediaPipe. Bạn có thể sử dụng một thư viện bên ngoài như SciPy để tải âm thanh đầu vào dưới dạng các mảng có dạng numpy.

Các ví dụ sau giải thích và cho thấy cách chuẩn bị dữ liệu để xử lý cho từng loại dữ liệu có sẵn:

Đoạn âm thanh

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)
    

Luồng âm thanh

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)
    

Chạy tác vụ

Bạn gọi hàm phân loại tương ứng với chế độ đang chạy để kích hoạt dự đoán. Audio Classifier API (API Phân loại âm thanh) sẽ trả về các danh mục có thể có cho các sự kiện âm thanh trong vùng đệm âm thanh đầu vào.

Đoạn âm thanh

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

Luồng âm thanh

# 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)
    

Xin lưu ý những điều sau:

  • Khi chạy ở chế độ luồng âm thanh, bạn cũng phải cung cấp cho tác vụ Trình phân loại âm thanh dấu thời gian của dữ liệu âm thanh đầu vào.
  • Khi chạy trong mô hình các đoạn âm thanh, tác vụ của Trình phân loại âm thanh sẽ chặn luồng hiện tại cho đến khi xử lý xong âm thanh đầu vào.

Để biết ví dụ hoàn chỉnh hơn về cách chạy Trình phân loại âm thanh với các đoạn âm thanh, hãy xem mã ví dụ.

Xử lý và hiển thị kết quả

Khi chạy suy luận, nhiệm vụ của Trình phân loại âm thanh sẽ trả về đối tượng AudioClassifierResult chứa danh sách các danh mục có thể xảy ra cho sự kiện âm thanh trong âm thanh đầu vào.

Sau đây là ví dụ về dữ liệu đầu ra của nhiệm vụ này:

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

Mã ví dụ về Trình phân loại âm thanh minh hoạ cách hiển thị kết quả phân loại mà tác vụ này trả về, hãy xem ví dụ về mã để biết thông tin chi tiết.