Python 音频分类指南

借助 MediaPipe 音频分类器任务,您可以对音频数据进行分类。您可以 使用此任务从一组经过训练的类别中识别声音事件。这些 说明了如何在 Python 中使用音频分类器。

如需详细了解功能、模型和配置选项 部分,请参阅概览

代码示例

音频分类器的示例代码提供了此分类的完整实现, 供您参考。此代码可帮助您测试此任务, 开始构建自己的音频分类器。您可以查看、运行和修改 音频分类器示例 代码 只需网络浏览器即可访问 Google Colab。您可以查看 这个示例位于 GitHub

如果您要实现适用于 Raspberry Pi 的音频分类器,请参阅 Raspberry Pi 示例 app

设置

本部分介绍了设置开发环境和 专门用于音频分类器的代码项目。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅适用于 Python

<ph type="x-smartling-placeholder">

软件包

音频分类器任务是 mediapipe pip 软件包。您可以安装 依赖项:

$ 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'

在 Model Name 参数中指定模型的路径,如下所示:

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 必须为 调用以设置监听器来接收分类结果 异步执行。
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
display_names_locale 设置要用于 任务模型的元数据(如果有)。默认值为 en, 英语。您可以向自定义模型的元数据中添加本地化标签 使用 TensorFlow Lite Metadata Writer API 语言区域代码 en
max_results 将评分最高的分类结果的可选数量上限设置为 return。如果 <0,则返回所有可用的结果。 任何正数 -1
score_threshold 设置预测分数阈值,以替换 模型元数据(如果有)。低于此值的结果将被拒绝。 [0.0, 1.0] 未设置
category_allowlist 设置允许的类别名称的可选列表。如果不为空, 类别名称未包含在此集合中的分类结果 已滤除。重复或未知的类别名称会被忽略。 此选项与 category_denylist 互斥,使用 都会导致错误。 任何字符串 未设置
category_denylist 设置不允许使用的类别名称的可选列表。如果 非空,类别名称在此集中的分类结果将被滤除 。重复或未知的类别名称会被忽略。这个选项 category_allowlist 不包含,同时使用这两个元素会导致错误。 任何字符串 未设置
result_callback 设置结果监听器以接收分类结果 当音频分类器在音频流中时异步播放 模式。仅在跑步模式设为“AUDIO_STREAM”时才能使用 不适用 未设置

准备数据

音频分类器支持音频片段和音频流。任务会处理 数据输入预处理,包括重新采样、缓冲和分帧。

将输入准备为音频文件或 numpy 数组,然后将其转换为 MediaPipe AudioData 对象。您可以使用外部库,例如 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

音频分类器示例代码演示了如何显示分类 结果,请参阅代码 示例 了解详情。