创建一款基本的音频分类应用

1. 准备工作

TensorFlow 是一种多用途机器学习框架。它可用于在云端跨集群训练大型模型,或在手机等嵌入式系统上本地运行模型。

此 Codelab 使用 TensorFlow Lite 在 Android 设备上运行音频分类模型。

学习内容

  • 如何查找可供使用的预训练机器学习模型。
  • 如何对实时捕获的音频进行音频分类。
  • 如何使用 TensorFlow Lite 支持库对模型输入和后处理模型输出进行预处理。
  • 如何使用音频任务库执行所有音频相关工作。

构建内容

一个简单的音频识别器应用,可运行 TensorFlow Lite 音频识别模型来实时识别来自麦克风的音频

33af0fdb0a027fa8.png

所需物品

  • 最新版本的 Android Studio (v4.1.2+)
  • API 为 23 的 Android 实体设备 (Android 6.0)
  • 示例代码
  • 使用 Kotlin 进行 Android 开发的基础知识

2. 获取示例代码

下载代码

点击下面的链接可下载本 Codelab 的所有代码:

解压下载的 ZIP 文件。此操作会解压缩一个根文件夹 (odml-pathways),其中包含您需要的所有资源。在本 Codelab 中,您只需要 audio_classification/codelab1/android 子目录中的源代码。

注意:如果您愿意,也可以克隆代码库:

git clone https://github.com/googlecodelabs/odml-pathways.git

audio_classification/codelab1/android 代码库中的 android 子目录包含两个目录:

  • android_studio_folder.pngstarter - 本 Codelab 的起始代码。
  • android_studio_folder.pngfinal - 完成后的示例应用的完整代码。

导入起始应用

首先,将入门应用导入 Android Studio。

  1. 打开 Android Studio,然后选择 Import Project(Gradle、Eclipse ADT 等)
  2. 打开您之前下载的源代码中的 starter 文件夹 (audio_classification/codelab1/android/starter)。

7c0f27882a2698ac.png

为确保所有依赖项都可供您的应用使用,您应该在导入过程完成后将项目与 gradle 文件同步。

  1. 从 Android Studio 工具栏中选择 Sync Project with Gradle Files ( b451ab2d04d835f9.png)。

运行起始应用

现在,您已将项目导入 Android Studio,可以首次运行应用了。

通过 USB 将 Android 设备连接到计算机,然后点击 Android Studio 工具栏中的 Run ( execute.png)。

5518972c21705945.png

3.查找预训练模型

为进行音频分类,您需要一个模型。从预训练模型开始,这样您就不必自行训练一个模型了。

要查找预训练模型,您将使用 TensorFlow Hub ( www.tfhub.dev)。

91e39900ff58818c.png

模型按网域分类。您现在需要用到的是音频问题网域中提供的域名。

9d44d38c297bf3dc.png

对于您的应用,您将使用 YAMNet 模型进行事件分类

YAMNet 是一种音频事件分类器,它采用音频波形作为输入,并对 521 个音频事件中的每个音频事件进行独立预测。

模型 yamnet/classification 已转换为 TensorFlow Lite 并具有特定的元数据,该配置可让 TFLite 音频库任务库使模型在移动设备上更易于使用。

65dc0f610eb27762.png

选择正确的标签页:TFLite (yamnet/classification/tflite),然后点击下载。您还可以在底部查看模型的元数据。

cfb3cfeb310e1f51.png

下一步中将使用此模型文件 (lite-model_yamnet_classification_tflite_1.tflite)。

4.将新模型导入基本应用

第一步是将已下载的模型从上一步移至应用中的“素材资源”文件夹。

在 Android Studio 中的 Project Explorer 中,右键点击 assets 文件夹。

7cca2c22ed8cf4c8.png

您将看到一个弹出式窗口,其中包含选项列表。其中一种方法是在文件系统中打开该文件夹。如果是在 Mac 上,则显示为在 Finder 中显示;在 Windows 中,则会显示为在资源管理器中打开;而在 Ubuntu 中则会显示为在“文件”中显示。找到适合您的操作系统的操作系统,然后选择该操作系统。

95e0eca881d35f6b.png

然后将下载的模型复制到其中。

完成此操作后,请返回到 Android Studio,您应该会在 assets 文件夹中看到您的文件。

703b1842fb09e893.png

5. 在基础应用中加载新模型

现在,您需要关注一些 TODO,然后使用您在上一步中刚刚添加到项目中的模型进行音频分类。

为了轻松找到 TODO,请在 Android Studio 中依次转到菜单:View > Tool Windows > TODO。系统会打开一个包含该列表的窗口,您只需点击该窗口即可直接查看代码。

在文件 build.gradle(模块版本)中,您可以找到第一个任务。

TODO 1 是添加 Android 依赖项:

implementation 'org.tensorflow:tensorflow-lite-task-audio:0.2.0'

其余的代码更改都将在 MainActivity 上进行

TODO 2.1 会创建包含模型名称的变量,以供后续步骤加载。

var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"

TODO 2.2 中,您将定义接受模型预测所需的最低阈值。此变量将在稍后使用。

var probabilityThreshold: Float = 0.3f

TODO 2.3 用于从资源文件夹中加载模型。Audio Task 库中定义的 AudioClassifier 类已准备好加载模型,并为您提供运行推断和帮助创建录音器的所有必要方法。

val classifier = AudioClassifier.createFromFile(this, modelPath)

6.捕获音频

Audio Tasks API 提供了一些辅助方法,可帮助您创建具有模型所期望的适当配置(例如采样率、比特率、声道数量)的录音器。这样一来,您就无需手动查找配置,也无需创建配置对象。

TODO 3.1:创建一个张量变量,用于存储推理的录制内容,并构建录制器的格式规范。

val tensor = classifier.createInputTensorAudio()

TODO 3.2:显示上一步中通过模型的元数据定义的音频录制器规范。

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

92e81894674a5b0.png

TODO 3.3:创建录音机并开始录制。

val record = classifier.createAudioRecord()
record.startRecording()

截至目前,应用会监听手机的麦克风,但仍然不做任何推断。您将在接下来的步骤中解决此问题。

7. 将推断添加到模型中

在此步骤中,您将向应用添加推断代码并将其显示在屏幕上。代码已有一个每 0.5 秒执行一次的计时器线程,这是将运行推断的位置。

方法 scheduleAtFixedRate 的参数是每 500 毫秒在代码中开始等待和连续执行任务之间间隔的时间。

Timer().scheduleAtFixedRate(1, 500) {
...
}

TODO 4.1 添加代码以使用该模型。首先将录制内容加载到音频张量中,然后将其传递给分类器:

tensor.load(record)
val output = classifier.classify(tensor)

TODO 4.2,以便获得更好的推断结果,您可以过滤掉所有概率非常低的分类。在这里,您将使用在上一步中创建的变量 (probabilityThreshold):

val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}

TODO 4.3:为了更轻松地读取结果,让我们创建一个包含过滤结果的字符串:

val outputStr = filteredModelOutput.sortedBy { -it.score }
   .joinToString(separator = "\n") { "${it.label} -> ${it.score} " }

TODO 4.4 更新界面。在这个非常简单的应用中,结果仅在 TextView 中显示。由于分类不在主线程中,因此您需要使用处理程序进行此项更新。

runOnUiThread {
   textView.text = outputStr
}

您添加了执行以下操作所需的所有代码:

  • 从资源文件夹中加载模型
  • 使用正确配置创建录音器
  • 运行推断
  • 在屏幕上显示最佳结果

现在,您只要测试应用即可。

8. 运行最终应用

您已经将音频分类模型集成到应用中,下面我们来对其进行测试。

连接您的 Android 设备,然后点击 Android Studio 工具栏中的 Run ( execute.png)。

首次执行时,您需要向应用授予录音权限。

授予权限后,应用会在启动时使用手机的麦克风。要进行测试,请开始在手机附近讲话,因为 YAMNet 检测到的课程之一就是语音。另一个易于测试的类是手指贴靠或拍手。

您还可以尝试检测狗的叫声以及许多其他可能的事件 (521)。如需查看完整列表,您可以查看其源代码,也可以直接使用标签文件读取元数据

33af0fdb0a027fa8.png

9. 恭喜!

在此 Codelab 中,您学习了如何使用 TensorFlow Lite 为音频分类查找预训练模型并将其部署到移动应用。如需详细了解 TFLite,请参阅其他 TFLite 示例

所学内容

  • 如何在 Android 应用中部署 TensorFlow Lite 模型。
  • 如何从 TensorFlow 查找和使用模型。

后续步骤

  • 使用您自己的数据自定义模型。

了解详情

有疑问?

报告问题