Flutter语音识别插件flutter_deep_speech的使用

Flutter语音识别插件flutter_deep_speech的使用

用法

步骤 1:

在你的 pubspec.yaml 文件中添加插件作为依赖。

dependencies:
  flutter_deep_speech:
    git:
      url: git://github.com/AdarshaBista/FlutterDeepSpeech.git

步骤 2:

AndroidManifest.xml 文件中添加麦克风权限。

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

步骤 3:

使用该插件。请查看示例应用以获取完整的使用方法。

注意:

你需要获取一个 tflite 模型文件和一个 scorer 文件才能使用该插件。你可以从 DeepSpeech 存储库下载这些文件。下载后,请将这些文件放在项目的 assets/models/ 目录下。模型不会直接从资源目录加载,而是首先复制到应用程序的外部文件目录中,然后从那里加载(参见示例应用)。文件的复制过程不由插件处理。

特性

查看变更日志以了解支持的功能和限制。

参考资料

参考了 Android 版本的 android_mic_streaming 示例。


完整示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_deep_speech 插件进行语音识别。

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'package:path_provider/path_provider.dart';
import 'package:flutter_deep_speech/flutter_deep_speech.dart';

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  static const tfliteName = 'model.tflite';
  static const scorerName = 'scorer.scorer';

  final FlutterDeepSpeech deepSpeech = FlutterDeepSpeech();

  String text = '按住开始说话。松开停止。';
  bool modelLoaded = false;
  bool isListening = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    loadModel();
  }

  [@override](/user/override)
  void dispose() {
    deepSpeech.dispose();
    super.dispose();
  }

  Future<void> loadModel() async {
    // 首先将模型复制到外部文件目录。
    await copyModelsToExternalFilesDir();

    modelLoaded = await deepSpeech.loadModelFromName(
      modelName: 'model.tflite',
      scorerName: 'scorer.scorer',
    );
    debugPrint('MODEL LOADED: $modelLoaded');
  }

  Future<void> copyModelsToExternalFilesDir() async {
    final externalFilesDirPath = (await getExternalStorageDirectory())!.path;

    final tfliteDestination = '$externalFilesDirPath/$tfliteName';
    if (!File(tfliteDestination).existsSync()) {
      await copyBytesFromAsset('assets/models/$tfliteName', tfliteDestination);
    }

    final scorerDestination = '$externalFilesDirPath/$scorerName';
    if (!File(scorerDestination).existsSync()) {
      await copyBytesFromAsset('assets/models/$scorerName', scorerDestination);
    }
  }

  Future<void> copyBytesFromAsset(String source, String dest) async {
    final bytes = await rootBundle.load(source);
    final file = await File(dest).writeAsBytes(bytes.buffer.asUint8List());
    debugPrint('Copied $source to ${file.path}');
  }

  Future<void> start() async {
    if (!modelLoaded) {
      debugPrint('ERROR: 模型尚未加载!');
      return;
    }

    debugPrint('START LISTENING...');
    setState(() {
      text = '开始吧。我在听...';
      isListening = true;
    });

    try {
      await deepSpeech.listen(
        onError: (error) {
          debugPrint('ERROR: ${error.error}');
          debugPrint('STACKTRACE: ${error.stackTrace}');
        },
        onResult: (result) {
          setState(() => text = result.text);
        },
      );
    } on MicPermissionDeniedException catch (e) {
      debugPrint('错误: ${e.toString()}');
      setState(() {
        text = '权限被拒绝!';
        isListening = false;
      });
    }
  }

  Future<void> stop() async {
    debugPrint('STOP LISTENING...');
    setState(() => isListening = false);
    await deepSpeech.stop();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter DeepSpeech'),
        ),
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Padding(
                padding: const EdgeInsets.all(24.0),
                child: Text(
                  text,
                  style: const TextStyle(fontSize: 24.0),
                ),
              ),
              const Spacer(),
              Listener(
                onPointerUp: (_) => stop(),
                onPointerDown: (_) => start(),
                onPointerCancel: (_) => stop(),
                child: Container(
                  width: 100.0,
                  height: 100.0,
                  decoration: BoxDecoration(
                    color: isListening ? Colors.red : Colors.green,
                    shape: BoxShape.circle,
                  ),
                  child: Center(
                    child: Text(
                      isListening ? '停止' : '开始',
                      style: const TextStyle(
                        fontSize: 24.0,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
              const SizedBox(height: 32.0),
            ],
          ),
        ),
      ),
    );
  }
}
1 回复

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


当然,以下是如何在Flutter项目中集成和使用flutter_deep_speech插件进行语音识别的示例代码。flutter_deep_speech是一个Flutter插件,用于集成Mozilla的DeepSpeech语音识别引擎。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_deep_speech依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_deep_speech: ^0.1.0  # 请注意版本号,使用最新版本

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

步骤 2: 配置Android项目

对于Android平台,你需要将DeepSpeech模型文件(.pbmm.scorer)放在应用的assets目录中。

  1. android/app/src/main/assets/目录下创建一个名为models的文件夹。
  2. 将你的DeepSpeech模型文件(例如deepspeech-0.9.3-models.pbmmdeepspeech-0.9.3-models.scorer)复制到models文件夹中。

步骤 3: 配置iOS项目(可选)

对于iOS平台,你需要将模型文件添加到Xcode项目中,并确保它们在应用的bundle中可用。这通常涉及到将文件拖放到Xcode的项目中,并确保它们的Target Membership被正确设置。

步骤 4: 使用flutter_deep_speech插件

以下是一个简单的Flutter应用示例,展示了如何使用flutter_deep_speech插件进行语音识别:

import 'package:flutter/material.dart';
import 'package:flutter_deep_speech/flutter_deep_speech.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  FlutterDeepSpeech? _deepSpeech;
  String _transcript = '';

  @override
  void initState() {
    super.initState();
    _initDeepSpeech();
  }

  Future<void> _initDeepSpeech() async {
    _deepSpeech = FlutterDeepSpeech();

    // 设置模型路径(对于Android,路径是相对于assets目录的)
    String modelPath = 'models/deepspeech-0.9.3-models.pbmm';
    String scorerPath = 'models/deepspeech-0.9.3-models.scorer';

    // 初始化DeepSpeech引擎
    await _deepSpeech!.init(modelPath, scorerPath);

    // 开始监听音频输入
    _deepSpeech!.startListening((String result) {
      setState(() {
        _transcript = result;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Deep Speech Demo'),
        ),
        body: Center(
          child: Text('Transcript: $_transcript'),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _deepSpeech?.stopListening();
    _deepSpeech?.dispose();
    super.dispose();
  }
}

注意事项

  1. 权限:确保你的应用具有访问麦克风的权限。在Android上,你需要在AndroidManifest.xml中添加<uses-permission android:name="android.permission.RECORD_AUDIO"/>。在iOS上,你需要在Info.plist中添加NSMicrophoneUsageDescription

  2. 模型文件:确保模型文件与插件版本兼容,并且路径正确无误。

  3. 错误处理:在实际应用中,你应该添加错误处理逻辑,以处理初始化失败、监听错误等情况。

  4. 性能:语音识别是一个资源密集型任务,确保在适当的设备上运行,并注意性能影响。

这个示例提供了一个基本的框架,你可以根据需要进行扩展和自定义。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!