使用 Teachable Machine 和 TFLite 为移动应用构建声音分类模型
2020 年 12 月 02 日

作者:Khanh LeViet,TensorFlow 开发者倡导者


声音分类是一种机器学习任务,您将声音输入到机器学习模型中,以将其分类到预定义的类别中,例如狗叫声、汽车喇叭声等等。声音分类已经有许多应用,包括 检测非法砍伐森林活动,或 检测座头鲸的声音 以更好地了解它们的自然行为。

我们很高兴地宣布,Teachable Machine 现在允许您训练自己的声音分类模型并将其导出为 TensorFlow Lite (TFLite) 格式。然后,您可以将 TFLite 模型集成到您的移动应用程序或物联网设备中。这是一种快速开始使用声音分类的简便方法,您可以探索在 Python 中构建生产模型并将其导出到 TFLite 作为下一步。

模型架构

Timeline chart of of sound classification model

Teachable Machine 用于对 1 秒音频样本进行分类的模型是一个小型卷积神经网络。如上图所示,该模型接收 频谱图(通过傅里叶变换获得的声音的二维时频表示)。它首先使用连续的二维卷积 (Conv2D) 层和最大池化层来处理频谱图。该模型以多个密集(全连接)层结束,这些层与 dropout 层交织在一起,用于在训练期间减少过拟合。模型的最终输出是概率分数数组,每个数组对应于模型训练以识别的声音类别。

您可以在 此处 找到使用此方法在 Python 中训练自己的声音分类模型的教程。

使用您自己的数据集训练模型

有两种方法可以使用您自己的数据集训练声音分类模型

  • 简单方法:使用 Teachable Machine 收集训练数据并在浏览器中训练模型,无需编写任何代码。这种方法适用于那些希望快速交互式地构建原型的人。
  • 稳健方法:提前录制声音作为训练数据集,然后使用 Python 训练并仔细评估您的模型。当然,这种方法也比简单方法更自动化和可重复。

使用 Teachable Machine 训练模型

Teachable Machine 是一款 GUI 工具,可让您创建训练数据集并训练多种类型的机器学习模型,包括图像分类、姿势分类和声音分类。Teachable Machine 在幕后使用 TensorFlow.js 来训练您的机器学习模型。您可以将训练后的模型导出为 TensorFlow.js 格式,以在 Web 浏览器中使用,也可以将其导出为 TensorFlow Lite 格式,以在移动应用程序或物联网设备中使用。

以下是训练模型的步骤

  1. 访问 Teachable Machine 网站
  2. 创建一个音频项目
  3. 为要识别的每个类别录制一些声音片段。您只需要为每个类别录制 8 秒的声音。
  4. 开始训练。完成训练后,您可以在实时音频馈送上测试您的模型。
  5. 将模型导出为 TFLite 格式。
Teachable machine chart

使用 Python 训练模型

如果您有大型训练数据集,包含几个小时的声音录制和超过 12 个类别,那么在 Web 浏览器上训练声音分类可能需要很长时间。在这种情况下,您可以提前收集训练数据集,将其转换为 WAV 格式,并使用此 Colab 笔记本(其中包括将模型转换为 TFLite 格式的步骤)来训练您的声音分类。Google Colab 提供免费的 GPU,因此您可以显著加快模型训练速度。

将模型部署到 Android 与 TensorFlow Lite

训练好 TensorFlow Lite 声音分类模型后,您可以将其放入此 Android 示例应用程序中进行试用。只需执行以下步骤

  1. 从 GitHub 克隆示例应用程序
    git clone https://github.com/tensorflow/examples.git
  2. 将声音分类 Android 应用程序导入 Android Studio。您可以在 lite/examples/sound_classification/android 文件夹中找到它。
  3. 将您的模型(soundclassifier.tflitelabels.txt)添加到 src/main/assets 文件夹中,替换已经存在的示例模型。
  4. 构建应用程序并将其部署到 Android 设备上。现在,您可以实时分类声音!
UI of TensorFlow Lite using Sound Classifier

要将模型集成到您自己的应用程序中,您可以从示例应用程序中复制 SoundClassifier.kt 类以及您训练的 TFLite 模型到您的应用程序中。然后,您可以按以下步骤使用该模型

1. 从您的 ActivityFragment 类中初始化一个 SoundClassifier 实例。

var soundClassifier: SoundClassifier
soundClassifier = SoundClassifier(context).also {
    it.lifecycleOwner = context
}


2. 开始从设备麦克风捕获实时音频并实时分类

soundClassifier.start()

3. 实时接收分类结果,结果以人类可读的类别名称和当前声音属于每个特定类别的概率形式的映射表示。

let labelName = soundClassifier.labelList[0] // e.g. "Clap"
soundClassifier.probabilities.observe(this) { resultMap ->
    let probability = result[labelName] // e.g. 0.7
}

下一步

我们正在开发该示例应用程序的 iOS 版本,该版本将在几周内发布。我们还将扩展 TensorFlow Lite Model Maker 以便在 Python 中轻松训练声音分类。敬请关注!

致谢

这个项目是 Google 内部多个团队共同努力的结果。特别感谢

  • Google Research:Shanqing Cai、Lisie Lillianfeld
  • TensorFlow 团队:Tian Lin
  • Teachable Machine 团队:Gautam Bose、Jonas Jongejan
  • Android 团队:Saryong Kang、Daniel Galpin、Jean-Michel Trivi、Don Turner
下一篇
Build sound classification models for mobile apps with Teachable Machine and TFLite

作者:Khanh LeViet,TensorFlow 开发者倡导者
声音分类是一种机器学习任务,您将声音输入到机器学习模型中,以将其分类到预定义的类别中,例如狗叫声、汽车喇叭声等等。声音分类已经有许多应用,包括 检测非法砍伐森林活动,或 检测座头鲸的声音 以更好地了解它们的自然行为。