借助 MediaPipe 音频分类器任务,您可以对音频数据进行分类。您可以 使用此任务从一组经过训练的类别中识别声音事件。这些 说明了如何使用适用于 Node 和 Web 应用的音频分类器。
要了解此任务的实际运行情况,请查看 演示。 如需详细了解功能、模型和配置选项 部分,请参阅概览。
代码示例
音频分类器的示例代码提供了此分类的完整实现, 供您参考。此代码可帮助您测试此任务 开始构建您自己的音频分类应用。您可以查看、运行 并修改 音频分类器示例代码 只需使用网络浏览器即可。
设置
本部分介绍了设置开发环境和 专门用于音频分类器的代码项目。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅 网页版设置指南。
JavaScript 软件包
音频分类器代码可通过 MediaPipe @mediapipe/tasks-audio
获取
NPM 软件包。您可以
通过平台中提供的链接查找并下载这些库
设置指南。
您可以使用以下代码安装本地暂存所需的软件包 创建 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
音频分类器示例代码演示了如何显示分类 结果,请参阅 代码示例 了解详情。