Flutter 的 TFlite 音频插件

Flutter 的音频分类 Tflite 包 (iOS & Android)。支持 Google Teachable Machine 模型。

如果您是音频分类的完全新手,可以阅读此处的教程。归功于 Carolina 撰写的全面文章。

为了保持此项目活跃,请考虑成为贡献者。点赞也备受欢迎。

录音 推理结果
finish start

关于此插件

该插件支持几种模型类型

  1. (初学者) Google Teachable Machine,需要很少的机器学习知识和编码。

  2. 支持原始音频输入的模型。有关如何训练您自己模型的更多信息,请在此处查看。

  3. 支持已解码波形输入的模型。有关如何训练您自己模型的更多信息

    • 详细指南在此处
    • 要使用 MFCC 训练已解码波形,请在此处查看
  4. (未来功能) 可调输入大小

  5. (未来功能) 频谱图作为输入类型。将支持来自此教程的模型。

  6. (未来功能) 具有多个输出的模型

  7. (未来功能) 音频嵌入

已知问题

a) 模型无法加载

您需要配置权限和依赖项才能使用此插件。请按照以下步骤操作

b) 推理不准确

可能是您的设备没有足够的时间进行录制。只需将 bufferSize 调整到较低值。同样,如果您的 bufferSize 太低,录制时长会太长,您的模型可能会将其注册为背景噪声。只需将 bufferSize 调整到较高值。

c) TensorFlow Lite 错误:此解释器不支持常规 TensorFlow op。请确保在推理前应用/链接 Flex 委托

请确保您已在 podfile - 步骤 4 & Xcode - 步骤 5build gradle - 步骤 3 中启用了 ops-select。

如果您尝试了上述方法,请在设备上(而非模拟器)运行示例。如果您仍然收到此错误,那么很可能是 cocoapod 或 Xcode 配置存在问题。请查看 issue #7

如果您收到此错误是由于您的自定义模型(非 GTM),则很可能是您正在使用 tflite 不支持的 tensorflow 运算符,如 issue #5 中所述。有关支持的运算符的更多详细信息,请在此处查看官方文档。

d) (iOS) 运行 Google Teachable Machine 模型时应用程序崩溃

请在实际的 iOS 设备上运行您的模拟。目前,Tensorflow Lite select-ops 框架对 x86_64 架构的支持 有限。如果您绝对需要在模拟器上运行它,您可以考虑自己构建 select ops 框架。说明可以在此处找到。

e) (Android) 致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),在 tid 5403 中发生故障地址 0xfffffff4

似乎最新的 android tflite 包会导致此问题。在此问题解决之前,请在实际的 Android 设备上运行此包。

f) 调用解释器失败,错误为:提供的计数(数字)必须与必需的计数(数字)匹配。

请确保您的录音长度与模型输入大小匹配。例如,google 的 teachable machine 要求录音长度为 44032。


如果您发现任何未在此列出的其他问题,请创建一个新 issue。


如果您正在使用 Google 的 Teachable Machine,请阅读。否则跳过。

请注意:Google 的 Teachable Machine 需要 select tensorflow operators 才能工作。此功能是实验性的,并将导致以下问题

  1. 增加您应用程序的总体大小。如果您无法接受这一点,建议您构建自己的自定义模型。教程可以在“关于此插件”部分中找到。

  2. 由于对 x86_64 架构的支持有限,iOS 模拟器无法工作。您需要在实际设备上运行您的模拟。问题可以在此处找到。

  3. 您需要手动实现 ops-select 在您的 podfile - 步骤 4 & Xcode - 步骤 5build gradle - 步骤 3 中。


如何将 tflite 模型和标签添加到 flutter

  1. 将您的自定义 tflite 模型和标签放入 asset 文件夹。
  2. 在 pubsec.yaml 中,在“assets”下链接您的 tflite 模型和标签。例如
  assets:
    - assets/decoded_wav_model.tflite
    - assets/decoded_wav_label.txt


如何使用此插件

请查看示例,了解如何实现这些功能。

  1. 导入插件。例如
import 'package:tflite_audio/tflite_audio.dart';
  1. 加载您的模型
   TfliteAudio.loadModel(
        model: 'assets/conv_actions_frozen.tflite',
        label: 'assets/conv_actions_labels.txt',
        numThreads: 1,
        isAsset: true);
  1. 开始并收听用于推理结果的流

Google Teachable Machine 模型的示例

TfliteAudio.startAudioRecognition(
  numOfInferences: 1,
  inputType: 'rawAudio',
  sampleRate: 44100,
  recordingLength: 44032,
  bufferSize: 22016,
  )
    .listen(
      //Do something here to collect data
      )
    .onDone(
       //Do something here when stream closes
      );

decodedwav 模型的示例

TfliteAudio.startAudioRecognition(
  numOfInferences: 1,
  inputType: 'decodedWav',
  sampleRate: 16000,
  recordingLength: 16000,
  bufferSize: 2000,
  )
    .listen(
      //Do something here to collect data
      )
    .onDone(
       //Do something here when stream closes
      );
  1. 在执行时强制取消流和识别
TfliteAudio.stopAudioRecognition();

参数的粗略指南

  • numThreads - 线程数越多,推理时间越短。但是,CPU 使用率会更高。

  • numOfInferences - 确定您希望重复推理的次数。

  • sampleRate - 较高的采样率将提高准确性。推荐值为 16000、22050、44100。

  • recordingLength - 确定您的张量输入的尺寸。如果值不等于您的张量输入,它将崩溃。

  • bufferSize - 确保此值等于或低于您的录制时长。请注意,较高的值可能不允许录制有足够的时间来捕捉您的声音。较低的值会提供更多时间,但会更消耗 CPU。请记住,最佳值因设备而异。

Android 安装和权限

  1. 将以下权限添加到您的 AndroidManifest。这可以在 <YourApp>/android/app/src 文件夹中找到。例如
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. 编辑您 build.gradle 中的以下内容。这可以在 <YourApp>/app/src/ 中找到。例如
aaptOptions {
        noCompress 'tflite'

(Android) 如果您正在使用 Google 的 Teachable Machine。否则跳过。

  1. 在您的 build gradle 的依赖项下启用 select-ops。
dependencies {
    compile 'org.tensorflow:tensorflow-lite-select-tf-ops:+'
}

iOS 安装和权限

  1. 将以下键添加到 Info.plist 中。这可以在 <YourApp>/ios/Runner 中找到。
<key>NSMicrophoneUsageDescription</key>
<string>Record audio for playback</string>
  1. 将部署目标更改为至少 12.0。这可以通过以下方式完成:

    a. 在 xcode 中打开您的项目工作区

    b. 选择左侧面板中的根 runner

    c. 在 info 选项卡下,将 iOS 部署目标更改为 12.0

  2. 打开 iOS 文件夹中的 podfile 并将 platform ios 更改为 12。

platform :ios, '12.0'

(iOS) 如果您正在使用 Google 的 Teachable Machine 模型。否则跳过。

  1. 在 target 下添加 `pod 'TensorFlowLiteSelectTfOps'`。
target 'Runner' do
  use_frameworks! 
  use_modular_headers!
  pod 'TensorFlowLiteSelectTfOps' #Add this line here. 

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
  1. 强制加载 Tensorflow 的 Select Ops。要做到这一点

    a. 在 xcode 中打开您的项目

    b. 点击“Targets”下的 runner

    c. 点击“Build settings”选项卡

    d. 点击“All”选项卡

    e. 点击“Other Links Flag”右侧的空白区域

    f. 添加:-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

tflite-select-ops-installation

  1. 将 ops-select 包安装到 pod。为此

    a. cd 进入 iOS 文件夹

    b. 在终端中运行 flutter pub get

    c. 在终端中运行 pod install

    d. 在终端中运行 flutter clean

GitHub

https://github.com/Caldarie/flutter_tflite_audio