Web 音频分类指南

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

要了解此任务的实际运行情况,请查看 演示。 如需详细了解功能、模型和配置选项 部分,请参阅概览

代码示例

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

设置

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

JavaScript 软件包

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

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

您可以使用以下代码安装本地暂存所需的软件包 创建 Deployment

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"
    }
  });

音频分类器示例代码实现允许用户在 处理模式这种方法使得任务创建代码更加复杂, 可能不适合您的用例。您可以看到 在runAudioClassification()runStreamingAudioClassification()example code

配置选项

此任务具有以下针对 Web 和 JavaScript 的配置选项 应用:

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

准备数据

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

运行任务

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

对音频分类器 classify() 方法的调用会同步运行,并阻止 用户界面线程。如果您通过设备麦克风对音频进行分类, 每个分类都会阻塞主线程。为防止出现这种情况, 实现 Web Worker 在另一个线程上运行 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

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