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),
],
),
),
),
);
}
}
更多关于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目录中。
- 在
android/app/src/main/assets/
目录下创建一个名为models
的文件夹。 - 将你的DeepSpeech模型文件(例如
deepspeech-0.9.3-models.pbmm
和deepspeech-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();
}
}
注意事项
-
权限:确保你的应用具有访问麦克风的权限。在Android上,你需要在
AndroidManifest.xml
中添加<uses-permission android:name="android.permission.RECORD_AUDIO"/>
。在iOS上,你需要在Info.plist
中添加NSMicrophoneUsageDescription
。 -
模型文件:确保模型文件与插件版本兼容,并且路径正确无误。
-
错误处理:在实际应用中,你应该添加错误处理逻辑,以处理初始化失败、监听错误等情况。
-
性能:语音识别是一个资源密集型任务,确保在适当的设备上运行,并注意性能影响。
这个示例提供了一个基本的框架,你可以根据需要进行扩展和自定义。