Web 音频分类指南

借助 MediaPipe 音频分类器任务,您可以对音频数据进行分类。您可以使用此任务从一组经过训练的类别中识别声音事件。以下说明介绍了如何使用适用于 Node 应用和 Web 应用的音频分类器。

您可以观看演示,了解此任务的实际运用。如需详细了解此任务的功能、模型和配置选项,请参阅概览

代码示例

音频分类器的示例代码在 JavaScript 中提供了此任务的完整实现,以供您参考。此代码可帮助您测试此任务并开始构建自己的音频分类应用。您只需使用网络浏览器即可查看、运行和修改音频分类器示例代码

初始设置

本部分介绍了专门针对使用音频分类器而设置开发环境和代码项目的关键步骤。如需了解如何为使用 MediaPipe 任务设置开发环境的一般信息(包括平台版本要求),请参阅网页设置指南

JavaScript 软件包

音频分类器代码通过 MediaPipe @mediapipe/tasks-audio NPM 软件包提供。您可以从平台设置指南中提供的链接查找和下载这些库。

您可以使用以下命令,通过以下代码为本地预演安装所需的软件包:

npm install @mediapipe/tasks-audio

如果您想通过内容分发网络 (CDN) 服务导入任务代码,请在 HTML 文件的标记中添加以下代码:

<!-- Replace "my-cdn-service.com" with your CDN -->
<head>
  <script src="https://my-cdn-service.com/npm/@mediapipe/tasks-audio/audio_bundle.js"
    crossorigin="anonymous"></script>
</head>

模型

MediaPipe 音频分类器任务需要使用与此任务兼容的经过训练的模型。如需详细了解音频分类器可用的经过训练的模型,请参阅任务概览“模型”部分

选择并下载模型,然后将其存储在项目目录中,例如:

<dev-project-root>/app/shared/models/

创建任务

使用某个音频分类器 createFrom...() 函数来准备运行推断的任务。结合使用 createFromModelPath() 函数和经过训练的模型文件的相对或绝对路径。如果模型已加载到内存中,您可以使用 createFromModelBuffer() 方法。

以下代码示例演示了如何使用 createFromOptions() 函数设置任务。借助 createFromOptions 函数,您可以使用配置选项来自定义音频分类器。如需详细了解配置选项,请参阅配置选项

以下代码演示了如何使用自定义选项构建和配置任务:

const audio = await FilesetResolver.forAudioTasks(
    "https://my-cdn-service.com/npm/@mediapipe/tasks-audio/wasm"
  );

const audioClassifier = await AudioClassifier.createFromOptions(audio, {
    baseOptions: {
      modelAssetPath:
        "https://tfhub.dev/google/lite-model/yamnet/classification/tflite/1?lite-format=tflite"
    }
  });

通过音频分类器示例代码实现,用户可以选择处理模式。这种方法会使任务创建代码更加复杂,可能不适合您的用例。您可以在 example coderunAudioClassification()runStreamingAudioClassification() 函数中查看不同的模式。

配置选项

此任务针对 Web 应用和 JavaScript 应用提供以下配置选项:

选项名称 说明 值范围 默认值
displayNamesLocale 设置任务模型元数据中提供的显示名(如果有)要使用的标签语言。英语的默认值为 en。您可以使用 TensorFlow Lite Metadata Writer API 向自定义模型的元数据添加本地化标签。语言区域代码 en
maxResults 设置要返回的得分最高的分类结果的数量上限(可选)。如果小于 0,将返回所有可用的结果。 任何正数 -1
scoreThreshold 设置预测分数阈值,以替换模型元数据中提供的阈值(如果有)。低于此值的结果会被拒绝。 [0.0, 1.0] 未设置
categoryAllowlist 设置允许的类别名称的可选列表。如果为非空,则类别名称不在此集合中的分类结果将被滤除。系统会忽略重复或未知的类别名称。 此选项与 categoryDenylist 互斥,如果同时使用这两者,就会引发错误。 任何字符串 未设置
categoryDenylist 设置不允许使用的类别名称的可选列表。如果非空,则类别名称在此集合中的分类结果将被滤除。系统会忽略重复或未知的类别名称。此选项与 categoryAllowlist 互斥,同时使用这两者会导致错误。 任何字符串 未设置

准备数据

音频分类器适用于音频片段和音频流,并且可以处理主机浏览器支持的任何格式的音频文件。该任务会处理数据输入预处理,包括重新采样、缓冲和取景。

运行任务

音频分类器使用 classify() 方法针对音频剪辑文件或音频流运行推断。Audio Classifier API 会返回输入音频中识别出的音频事件的可能类别。

对音频分类器 classify() 方法的调用会同步运行,并且会阻塞界面线程。如果您对来自设备麦克风的音频进行分类,则每种分类都会屏蔽主线程。为防止出现这种情况,您可以实现 Web 工作器以在另一个线程上运行 classify()

以下代码演示了如何使用任务模型执行处理:

音频片段

// Create audio buffer
const sample = await response.arrayBuffer();
const audioBuffer = await audioCtx.decodeAudioData(sample);

// Use AudioClassifier to run classification
const results = audioClassifier.classify(
  audioBuffer.getChannelData(0),
  audioBuffer.sampleRate
);
  

音频流

stream = await navigator.mediaDevices.getUserMedia(constraints);
audioCtx = new AudioContext({ sampleRate: 16000 });

const source = audioCtx.createMediaStreamSource(stream);
const scriptNode = audioCtx.createScriptProcessor(16384, 1, 1);

scriptNode.onaudioprocess = function (audioProcessingEvent) {
  const inputBuffer = audioProcessingEvent.inputBuffer;
  let inputData = inputBuffer.getChannelData(0);

  // Classify the audio
  const result = audioClassifier.classify(inputData);
  const categories = result[0].classifications[0].categories;
};
  

如需了解运行音频分类器任务的更完整实现,请参阅代码示例

处理和显示结果

完成推理运行后,音频分类器任务会返回一个 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

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