Flutter语音识别插件speech_xf的使用
Flutter语音识别插件speech_xf的使用
该插件集成了讯飞语音识别和语音合成功能,支持Android和iOS平台。
官网注册
-
注册账号 请参阅注册讯飞账号以获取更多信息。
-
创建应用并获取AppID
-
分别下载Android和iOS端的SDK
Android端配置
-
在项目的
android/app/main
目录下新建Jnilibs
目录,并将demo/libs
下的arm64-v8a
和armeabi-v7a
两个目录拷贝进去。 -
添加用户权限 在工程
AndroidManifest.xml
文件中添加如下权限:
<!-- 连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!-- 读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!-- 手机定位信息,用来为语义等功能提供定位,提供更精准的服务 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 如需使用人脸识别,还要添加:摄像头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
- 添加混淆
如需在打包或者生成APK的时候进行混淆,请在
proguard.pro
中添加如下代码:
-keep class com.iflytek.**{*;}
-keepattributes Signature
iOS端配置
- 在
Info.plist
中添加以下权限:
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>
注:建议真机测试。如果非要用模拟器,则使用Xcode打开项目。在Build Settings中找到Excluded Architectures,在debug中添加支持arm64架构。
添加依赖
在pubspec.yaml
文件中添加依赖:
dependencies:
speech_xf: ^1.3.0
使用
初始化
void initSdk() async {
await SpeechXf.init('这里是你在讯飞平台申请的appid');
}
使用内置界面
await SpeechXf.openNativeUIDialog(
isDynamicCorrection: true,
language: settingResult['language'],
vadBos: settingResult['vadBos'],
vadEos: settingResult['vadEos'],
ptt: settingResult['ptt'],
);
无界面语音识别
await SpeechXf.startListening(
isDynamicCorrection: false,
language: settingResult['language'],
vadBos: settingResult['vadBos'],
vadEos: settingResult['vadEos'],
ptt: settingResult['ptt'],
);
停止
await SpeechXf.stopListening();
取消
await SpeechXf.cancelListening();
语音听写结果监听
SpeechXf().onResult().listen((event) {
if (event.error != null) {
showToast(event.error!, position: ToastPosition.bottom);
} else {
if (event.result != null) {
speechController.text = speechController.text + event.result!;
}
if (event.isLast == true) {
showToast('结束说话...', position: ToastPosition.bottom);
}
}
});
上传用户热词
await SpeechXf.uploadUserWords(userWords);
音频流识别
await SpeechXf.audioRecognizer('iattest.wav');
开始语音合成
await SpeechXf.startSpeaking();
取消语音合成
await SpeechXf.stopSpeaking();
暂停语音合成
await SpeechXf.pauseSpeaking();
继续语音合成
await SpeechXf.resumeSpeaking();
循环播放(在initState
中)
SpeechXf.onLoopSpeakingListener(
onCompeleted: (onCompeleted) async {
await startSpeaking();
},
);
销毁语音合成器
SpeechXf.ttsDestroy();
销毁语音识别器
SpeechXf.iatDestroy();
音量变化回调
SpeechXf.onVolumeChanged(
volume: (v) {
showToast('当前音量:$v');
},
bytes: (bytes) {},
);
示例代码
以下是完整的示例代码,可以在example/lib/main.dart
中找到。
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:oktoast/oktoast.dart';
import 'package:speech_xf_example/home_page.dart';
void main() {
runApp(const MyApp());
// 设置沉浸式状态栏,颜色透明
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values);
SystemUiOverlayStyle systemUiOverlayStyle = const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarBrightness: Brightness.light, // 白色图标
systemNavigationBarColor: Colors.white,
);
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return OKToast(
backgroundColor: const Color(0xFF3A3A3A),
position: ToastPosition.center,
radius: 8,
textPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14),
child: MaterialApp(
theme: ThemeData(useMaterial3: true),
home: Scaffold(
resizeToAvoidBottomInset: false,
body: GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
FocusManager.instance.primaryFocus?.unfocus();
}
},
child: const HomePage(),
),
),
),
);
}
}
更多关于Flutter语音识别插件speech_xf的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter语音识别插件speech_xf的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用speech_xf
插件进行语音识别的代码示例。speech_xf
是一个用于实现语音识别功能的Flutter插件,支持Android和iOS平台。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加speech_xf
的依赖:
dependencies:
flutter:
sdk: flutter
speech_xf: ^最新版本号 # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 导入插件
在你的Dart文件中导入插件:
import 'package:speech_xf/speech_xf.dart';
3. 请求权限(Android)
在Android上,你需要在AndroidManifest.xml
中添加语音识别所需的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
此外,你还需要在运行时请求权限(例如使用permission_handler
插件):
import 'package:permission_handler/permission_handler.dart';
// 请求权限
Future<void> requestPermissions() async {
bool hasPermission = await Permission.microphone.status.isGranted;
if (!hasPermission) {
var status = await Permission.microphone.request();
if (!status.isGranted) {
// 处理权限被拒绝的情况
}
}
}
4. 使用语音识别功能
下面是一个完整的示例,展示如何使用speech_xf
插件进行语音识别:
import 'package:flutter/material.dart';
import 'package:speech_xf/speech_xf.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Speech Recognition Demo'),
),
body: Center(
child: MyHomePage(),
),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _result = '';
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('语音识别结果: $_result'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _startListening,
child: Text('开始语音识别'),
),
],
);
}
Future<void> _startListening() async {
try {
// 开始语音识别
String result = await SpeechXf.startListening();
setState(() {
_result = result;
});
} catch (e) {
print('语音识别错误: $e');
}
}
}
注意事项
- 权限处理:确保在Android和iOS上都正确请求并处理权限。
- 错误处理:在生产代码中,添加更多的错误处理逻辑,以处理各种可能的异常情况。
- UI更新:在实际应用中,你可能需要更复杂的UI来显示识别结果或处理不同的状态。
通过以上步骤,你就可以在Flutter项目中使用speech_xf
插件实现语音识别功能了。