Flutter音频检测插件tflite_audio_detection的使用

Flutter音频检测插件tflite_audio_detection的使用

获取开始

设置TFLite Flutter插件

请参考以下链接进行初始设置: 初始设置说明

基本图像处理和转换

TFLite Helper依赖于内部的flutter image package来进行图像处理。

TensorFlow Lite支持库有一套基本的图像处理方法,如裁剪和缩放。要使用它,创建一个ImageProcessor并添加所需的操作。将图像转换为TensorFlow Lite解释器所需的张量格式,可以创建一个TensorImage作为输入:

// 初始化代码
// 创建一个包含所有所需操作的ImageProcessor。更多操作请参阅README中的ImageProcessor Ops部分。
ImageProcessor imageProcessor = ImageProcessorBuilder()
  .add(ResizeOp(224, 224, ResizeMethod.NEAREST_NEIGHBOUR))
  .build();

// 从文件创建一个TensorImage对象
TensorImage tensorImage = TensorImage.fromFile(imageFile);

// 预处理图像
// 图像将被调整为大小为(224, 224)
tensorImage = imageProcessor.process(tensorImage);

示例应用:Image Classification

基本音频数据处理

TensorFlow Lite支持库还定义了一个TensorAudio类,封装了一些基本的音频数据处理方法。

TensorAudio tensorAudio = TensorAudio.create(
    TensorAudioFormat.create(1, sampleRate), size);
tensorAudio.loadShortBytes(audioBytes);

TensorBuffer inputBuffer = tensorAudio.tensorBuffer;

示例应用:Audio Classification

创建输出对象并运行模型

// 创建一个用于结果的容器,并指定这是一个量化模型。
// 因此,'DataType' 定义为UINT8(8位无符号整数)
TensorBuffer probabilityBuffer =
    TensorBuffer.createFixedSize(<int>[1, 1001], TensorType.uint8);

加载模型并运行推理:

import 'package:tflite_flutter/tflite_flutter.dart';

try {
    // 从资产中创建解释器
    Interpreter interpreter =
        await Interpreter.fromAsset("mobilenet_v1_1.0_224_quant.tflite");
    interpreter.run(tensorImage.buffer, probabilityBuffer.buffer);
} catch (e) {
    print('Error loading model: ' + e.toString());
}

访问结果

开发人员可以直接通过probabilityBuffer.getDoubleList()访问输出。 如果模型产生的是量化输出,请记住转换结果。 对于MobileNet量化模型,开发者需要将每个输出值除以255,以获得每个类别的概率范围从0(最不可能)到1(最可能)。

可选:将结果映射到标签

开发人员也可以选择将结果映射到标签。首先,将包含标签的文本文件复制到模块的资源目录中。接下来,使用以下代码加载标签文件:

List<String> labels = await FileUtil.loadLabels("assets/labels.txt");

以下代码片段演示了如何将概率与类别标签关联起来:

TensorLabel tensorLabel = TensorLabel.fromList(
      labels, probabilityProcessor.process(probabilityBuffer));

Map<String, double> doubleMap = tensorLabel.getMapWithFloatValue();

图像处理器架构

图像处理器的设计允许在构建过程中预先定义图像处理操作并进行优化。图像处理器目前支持三种基本的预处理操作:

int cropSize = min(_inputImage.height, _inputImage.width);

ImageProcessor imageProcessor = ImageProcessorBuilder()
    // 将图像中心裁剪到最大的正方形
    .add(ResizeWithCropOrPadOp(cropSize, cropSize))
    // 使用双线性或最近邻进行缩放
    .add(ResizeOp(224, 224, ResizeMethod.NEAREST_NEIGHBOUR))
    // 按90度顺时针旋转
    .add(Rot90Op(rotationDegrees ~/ 90))
    .add(NormalizeOp(127.5, 127.5))
    .add(QuantizeOp(128.0, 1 / 128.0))
    .build();

有关归一化和量化参数的更多信息,请参阅此处

量化

TensorProcessor可以用来量化输入张量或解量化输出张量。 例如,当处理量化输出的TensorBuffer时,开发者可以使用DequantizeOp来解量化结果,将其转换为介于0和1之间的浮点概率:

// 解量化结果的后处理器
TensorProcessor probabilityProcessor =
    TensorProcessorBuilder().add(DequantizeOp(0, 1 / 255.0)).build();
TensorBuffer dequantizedBuffer =
    probabilityProcessor.process(probabilityBuffer);

读取量化参数:

// 输入张量在索引0处的量化参数
QuantizationParams inputParams = interpreter.getInputTensor(0).params;

// 输出张量在索引0处的量化参数
QuantizationParams outputParams = interpreter.getOutputTensor(0).params;

任务库

目前,基于文本的模型如NLClassifierBertNLClassifierBertQuestionAnswerer 可以使用Flutter任务库。

集成自然语言分类器

任务库的NLClassifier API将输入文本分类为不同的类别,是一个多功能且可配置的API,可以处理大多数文本分类模型。详细的指南请参阅这里

final classifier = await NLClassifier.createFromAsset('assets/$_modelFileName',
        options: NLClassifierOptions());
List<Category> predictions = classifier.classify(rawText);

示例应用:Text Classification

集成BERT自然语言分类器

任务库的BertNLClassifier API类似于NLClassifier,将输入文本分类为不同的类别,但该API特别适用于需要Wordpiece和Sentencepiece分词的BERT相关模型。详细的指南请参阅这里

final classifier = await BertNLClassifier.createFromAsset('assets/$_modelFileName',
        options: BertNLClassifierOptions());
List<Category> predictions = classifier.classify(rawText);

集成BERT问题回答器

任务库的BertQuestionAnswerer API加载BERT模型,并根据给定的段落回答问题。更多详情请参阅BERT QA模型文档。详细的指南请参阅这里

final bertQuestionAnswerer = await BertQuestionAnswerer.createFromAsset('assets/$_modelFileName');
List<QaAnswer> answers = bertQuestionAnswerer.answer(context, question);

更多关于Flutter音频检测插件tflite_audio_detection的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频检测插件tflite_audio_detection的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用tflite_audio_detection插件的一个基本示例。这个插件允许你使用TensorFlow Lite模型进行音频检测。以下步骤将展示如何设置项目、加载模型并进行音频检测。

前提条件

  1. Flutter SDK 已安装并配置好开发环境。
  2. Android StudioVS Code 作为你的开发IDE。
  3. 基本的Flutter项目已创建。

步骤

1. 添加依赖

在你的Flutter项目的pubspec.yaml文件中添加tflite_audio_detection依赖:

dependencies:
  flutter:
    sdk: flutter
  tflite_audio_detection: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android权限

由于音频检测需要访问麦克风,你需要在android/app/src/main/AndroidManifest.xml中添加必要的权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>

3. 加载TensorFlow Lite模型

将你的TensorFlow Lite模型文件(通常是.tflite文件)放在assets文件夹中。如果assets文件夹不存在,请在android/app/src/main/ios/Runner/下分别创建它。

4. 实现音频检测功能

在你的Flutter项目中,创建一个新的Dart文件(例如audio_detection_page.dart)并编写以下代码:

import 'package:flutter/material.dart';
import 'package:tflite_audio_detection/tflite_audio_detection.dart';
import 'package:permission_handler/permission_handler.dart';

class AudioDetectionPage extends StatefulWidget {
  @override
  _AudioDetectionPageState createState() => _AudioDetectionPageState();
}

class _AudioDetectionPageState extends State<AudioDetectionPage> {
  late TfliteAudioDetection tfliteAudioDetection;
  bool hasPermission = false;
  String result = "";

  @override
  void initState() {
    super.initState();
    tfliteAudioDetection = TfliteAudioDetection(
      model: "assets/your_model.tflite", // 替换为你的模型文件路径
      labels: "assets/labels.txt",       // 如果你的模型有标签文件
      numThreads: 2,
      isAsset: true,
    );

    _requestPermissions();
  }

  Future<void> _requestPermissions() async {
    Map<Permission, PermissionStatus> statuses = await Permission.getPermissionsStatus([
      Permission.microphone,
    ]);

    if (statuses[Permission.microphone] != PermissionStatus.granted) {
      Map<Permission, PermissionResult> results = await Permission.requestPermissions([
        Permission.microphone,
      ]);

      if (results[Permission.microphone] == PermissionResult.granted) {
        setState(() {
          hasPermission = true;
        });
      }
    } else {
      setState(() {
        hasPermission = true;
      });
    }
  }

  Future<void> startListening() async {
    if (hasPermission) {
      try {
        var recognitions = await tfliteAudioDetection.recognizeAudio();
        setState(() {
          result = recognitions.join(", ");
        });
      } catch (e) {
        print(e);
      }
    } else {
      // 请求权限
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Audio Detection"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              "Result: $result",
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: startListening,
              child: Text("Start Listening"),
            ),
          ],
        ),
      ),
    );
  }
}

注意:

  • 你需要确保your_model.tflitelabels.txt(如果有)文件已经正确放置在assets文件夹中。
  • permission_handler插件用于请求麦克风权限,你需要在pubspec.yaml中添加这个依赖:
dependencies:
  permission_handler: ^x.y.z  # 替换为最新版本号

5. 运行项目

确保所有配置都正确后,运行你的Flutter项目:

flutter run

现在你应该能够在你的应用中看到音频检测页面,并通过点击按钮开始音频检测。

这个示例代码展示了如何使用tflite_audio_detection插件进行音频检测的基本流程。根据具体需求,你可能需要调整代码以处理更复杂的逻辑或UI。

回到顶部