Flutter语音识别插件ifly_speech_recognition的使用
Flutter语音识别插件ifly_speech_recognition的使用
根据科大讯飞的语音听写(流式版)WebAPI文档,实现60秒的语音识别功能。
安装
dependencies:
ifly_speech_recognition: ^1.0.5
导入
import 'package:ifly_speech_recognition/ifly_speech_recognition.dart';
配置
-
由于依赖
flutter_sound
此三方库,所以iOS需要添加对应配置:XCode > Build Settings > Other Linker Flags:
-lc++
-lstd++
-
如果添加两个库后,出现
error: ld: library not found for -lstd++
,则可以只添加-lc++
。
使用
使用前说明:
app_id
app_key
app_secret
需要到科大讯飞开放平台进行应用申请。- 开启语音识别前,请确保麦克风相关权限的开启,具体可参考:
permission_handler
。
初始化一个服务
SpeechRecognitionService _recognitionService = SpeechRecognitionService(
appId: 'iflyAppId',
appKey: 'iflyApiKey',
appSecret: 'iflyApiSecret',
);
// 初始化语音识别服务
_recognitionService.initRecorder();
语音识别监听回调
// 语音识别回调
// 注意:必须在 [speechRecognition] 方法调用之前监听
_recognitionService.onRecordResult().listen((message) {
// 语音识别成功,结果为 message
}, onError: (err) {
// 语音识别失败,原因错误为 err
});
// 注意:必须在 [speechRecognition] 方法调用之前监听
_recognitionService.onStopRecording().listen((isAutomatic) {
if (isAutomatic) {
// 录音时间到达最大值60秒,自动停止
} else {
// 主动调用 stopRecord,停止录音
}
});
开启录音
_recognitionService.startRecord();
停止录音
_recognitionService.stopRecord();
开始识别(主动调用)
_recognitionService.speechRecognition();
完整示例Demo
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:ifly_speech_recognition/ifly_speech_recognition.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
builder: EasyLoading.init(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key}) : super(key: key);
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
/// 语音识别
SpeechRecognitionService _recognitionService = SpeechRecognitionService(
appId: 'iflyAppId',
appKey: 'iflyApiKey',
appSecret: 'iflyApiSecret',
);
/// 麦克风是否授权
bool _havePermission = false;
/// 识别结果
String? _result;
[@override](/user/override)
void initState() {
super.initState();
_initRecorder();
}
[@override](/user/override)
dispose() {
_recognitionService.dispose();
super.dispose();
}
/// 获取/判断权限
Future<bool> _checkPermission() async {
final status = await Permission.microphone.status;
if (!status.isGranted) {
// 无权限,则请求权限
PermissionStatus requestStatus = await Permission.microphone.request();
return requestStatus == PermissionStatus.granted;
} else {
return true;
}
}
/// 初始化语音转文字
void _initRecorder() async {
_havePermission = await _checkPermission();
if (!_havePermission) {
// 授权失败
EasyLoading.showToast('请开启麦克风权限');
return;
}
// 初始化语音识别服务
await _recognitionService.initRecorder();
// 语音识别回调
_recognitionService.onRecordResult().listen((message) {
EasyLoading.dismiss();
setState(() {
_result = message;
});
}, onError: (err) {
EasyLoading.dismiss();
debugPrint(err);
});
// 录音停止
_recognitionService.onStopRecording().listen((isAutomatic) {
if (isAutomatic) {
// 录音时间到达最大值60秒,自动停止
} else {
// 主动调用 stopRecord,停止录音
}
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('语音听写'),
),
body: Center(
child: Column(
children: [
ElevatedButton(
onPressed: _startRecord,
child: Text('开始录音'),
),
ElevatedButton(
onPressed: _stopRecord,
child: Text('停止录音'),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 50),
child: Text(_result ?? ''),
),
],
),
),
);
}
/// 开始录音
void _startRecord() async {
if (!_havePermission) {
EasyLoading.showToast('请开启麦克风权限');
return;
}
EasyLoading.show(status: '正在录音');
final r = await _recognitionService.startRecord();
debugPrint('开启录音: $r');
}
/// 结束录音
void _stopRecord() async {
if (!_havePermission) {
EasyLoading.showToast('请开启麦克风权限');
return;
}
final r = await _recognitionService.stopRecord();
debugPrint('关闭录音: $r');
// 识别语音
EasyLoading.show(status: 'loading...');
_recognitionService.speechRecognition();
}
}
更多关于Flutter语音识别插件ifly_speech_recognition的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter语音识别插件ifly_speech_recognition的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用ifly_speech_recognition
插件进行语音识别的代码示例。这个插件是用于集成科大讯飞(iFLYTEK)语音识别服务的。
首先,确保你已经在pubspec.yaml
文件中添加了ifly_speech_recognition
依赖:
dependencies:
flutter:
sdk: flutter
ifly_speech_recognition: ^最新版本号 # 请替换为实际最新版本号
然后,运行flutter pub get
来获取依赖。
接下来,是具体的代码实现。在这个例子中,我们将展示如何初始化插件、开始语音识别、停止语音识别以及处理识别结果。
1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:ifly_speech_recognition/ifly_speech_recognition.dart';
2. 创建一个Flutter应用并添加必要的UI组件
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SpeechRecognitionPage(),
);
}
}
class SpeechRecognitionPage extends StatefulWidget {
@override
_SpeechRecognitionPageState createState() => _SpeechRecognitionPageState();
}
class _SpeechRecognitionPageState extends State<SpeechRecognitionPage> {
final IflySpeechRecognition _iflySpeechRecognition = IflySpeechRecognition();
String _recognitionResult = '';
@override
void initState() {
super.initState();
// 初始化插件,配置参数如APPID等(请替换为你的实际APPID)
_iflySpeechRecognition.init({
'appid': '你的APPID',
'language': 'zh_cn', // 中文
'accent': 'mandarin', // 普通话
'vad_eos': 3000, // 语音尾端静音检测时间(毫秒)
'sample_rate': 16000, // 采样率
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('语音识别示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'识别结果: $_recognitionResult',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
// 开始语音识别
await _startRecognition();
},
child: Text('开始识别'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: () async {
// 停止语音识别
await _stopRecognition();
},
child: Text('停止识别'),
),
],
),
),
);
}
Future<void> _startRecognition() async {
try {
// 开始监听语音输入
_iflySpeechRecognition.startListening(
onVolumeChanged: (volume) {
// 音量变化回调(可选)
print('音量: $volume');
},
onResult: (result, isLast) {
// 识别结果回调
setState(() {
_recognitionResult += result;
if (isLast) {
_recognitionResult += '\n'; // 结果结束,换行
}
});
},
onError: (error) {
// 错误回调
print('错误: $error');
},
);
} catch (e) {
print('开始识别失败: $e');
}
}
Future<void> _stopRecognition() async {
try {
// 停止监听语音输入
await _iflySpeechRecognition.stopListening();
} catch (e) {
print('停止识别失败: $e');
}
}
}
3. 配置Android和iOS项目
Android:
在android/app/src/main/AndroidManifest.xml
中添加必要的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
并在android/app/build.gradle
中添加以下内容以支持多DEX文件(如果需要):
android {
...
defaultConfig {
...
multiDexEnabled true
}
}
iOS:
在ios/Runner/Info.plist
中添加麦克风权限请求:
<key>NSMicrophoneUsageDescription</key>
<string>应用需要访问麦克风以进行语音识别</string>
确保你已经按照科大讯飞的开发者文档完成了其他必要的配置,比如获取APPID并配置相关的服务。
以上就是在Flutter中使用ifly_speech_recognition
插件进行语音识别的完整示例。这个示例包括了初始化插件、开始和停止语音识别以及处理识别结果的基本流程。