Flutter 的 TFlite 音频插件
Flutter 的音频分类 Tflite 包 (iOS & Android)。支持 Google Teachable Machine 模型。
如果您是音频分类的完全新手,可以阅读此处的教程。归功于 Carolina 撰写的全面文章。
为了保持此项目活跃,请考虑成为贡献者。点赞也备受欢迎。
| 录音 | 推理结果 |
|---|---|
![]() |
![]() |
关于此插件
该插件支持几种模型类型
-
(初学者) Google Teachable Machine,需要很少的机器学习知识和编码。
-
支持原始音频输入的模型。有关如何训练您自己模型的更多信息,请在此处查看。
-
支持已解码波形输入的模型。有关如何训练您自己模型的更多信息
- 详细指南在此处
- 要使用 MFCC 训练已解码波形,请在此处查看
-
(未来功能) 可调输入大小
-
(未来功能) 频谱图作为输入类型。将支持来自此教程的模型。
-
(未来功能) 具有多个输出的模型
-
(未来功能) 音频嵌入
已知问题
a) 模型无法加载
您需要配置权限和依赖项才能使用此插件。请按照以下步骤操作
b) 推理不准确
可能是您的设备没有足够的时间进行录制。只需将 bufferSize 调整到较低值。同样,如果您的 bufferSize 太低,录制时长会太长,您的模型可能会将其注册为背景噪声。只需将 bufferSize 调整到较高值。
c) TensorFlow Lite 错误:此解释器不支持常规 TensorFlow op。请确保在推理前应用/链接 Flex 委托
请确保您已在 podfile - 步骤 4 & Xcode - 步骤 5 和 build 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 才能工作。此功能是实验性的,并将导致以下问题
-
增加您应用程序的总体大小。如果您无法接受这一点,建议您构建自己的自定义模型。教程可以在“关于此插件”部分中找到。
-
由于对 x86_64 架构的支持有限,iOS 模拟器无法工作。您需要在实际设备上运行您的模拟。问题可以在此处找到。
-
您需要手动实现 ops-select 在您的 podfile - 步骤 4 & Xcode - 步骤 5 和 build gradle - 步骤 3 中。
如何将 tflite 模型和标签添加到 flutter
- 将您的自定义 tflite 模型和标签放入 asset 文件夹。
- 在 pubsec.yaml 中,在“assets”下链接您的 tflite 模型和标签。例如
assets:
- assets/decoded_wav_model.tflite
- assets/decoded_wav_label.txt
如何使用此插件
请查看示例,了解如何实现这些功能。
- 导入插件。例如
import 'package:tflite_audio/tflite_audio.dart';
- 加载您的模型
TfliteAudio.loadModel(
model: 'assets/conv_actions_frozen.tflite',
label: 'assets/conv_actions_labels.txt',
numThreads: 1,
isAsset: true);
- 开始并收听用于推理结果的流
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
);
- 在执行时强制取消流和识别
TfliteAudio.stopAudioRecognition();
参数的粗略指南
-
numThreads - 线程数越多,推理时间越短。但是,CPU 使用率会更高。
-
numOfInferences - 确定您希望重复推理的次数。
-
sampleRate - 较高的采样率将提高准确性。推荐值为 16000、22050、44100。
-
recordingLength - 确定您的张量输入的尺寸。如果值不等于您的张量输入,它将崩溃。
-
bufferSize - 确保此值等于或低于您的录制时长。请注意,较高的值可能不允许录制有足够的时间来捕捉您的声音。较低的值会提供更多时间,但会更消耗 CPU。请记住,最佳值因设备而异。
Android 安装和权限
- 将以下权限添加到您的 AndroidManifest。这可以在
<YourApp>/android/app/src 文件夹中找到。例如
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 编辑您 build.gradle 中的以下内容。这可以在
<YourApp>/app/src/ 中找到。例如
aaptOptions {
noCompress 'tflite'
(Android) 如果您正在使用 Google 的 Teachable Machine。否则跳过。
- 在您的 build gradle 的依赖项下启用 select-ops。
dependencies {
compile 'org.tensorflow:tensorflow-lite-select-tf-ops:+'
}
iOS 安装和权限
- 将以下键添加到 Info.plist 中。这可以在
<YourApp>/ios/Runner 中找到。
<key>NSMicrophoneUsageDescription</key>
<string>Record audio for playback</string>
-
将部署目标更改为至少 12.0。这可以通过以下方式完成:
a. 在 xcode 中打开您的项目工作区
b. 选择左侧面板中的根 runner
c. 在 info 选项卡下,将 iOS 部署目标更改为 12.0
-
打开 iOS 文件夹中的 podfile 并将 platform ios 更改为 12。
platform :ios, '12.0'
(iOS) 如果您正在使用 Google 的 Teachable Machine 模型。否则跳过。
- 在 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
-
强制加载 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

-
将 ops-select 包安装到 pod。为此
a. cd 进入 iOS 文件夹
b. 在终端中运行
flutter pub getc. 在终端中运行
pod installd. 在终端中运行
flutter clean

