Flutter语音识别插件flutter_speech的使用
Flutter语音识别插件flutter_speech的使用
插件简介
flutter_speech_recognition
是基于 rxlabz plugin 的Objective C和Java Flutter插件,用于在iOS10+/Android 4.1+和MacOS 10.15+上使用语音识别功能。
设置
iOS 和 MacOS
需要在 Info.plist
文件中添加以下键值对:
<key>NSMicrophoneUsageDescription</key>
<string>本应用需要访问您的麦克风</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>本应用需要语音识别权限</string>
Android
无需额外设置。
使用方法
以下是flutter_speech_recognition
插件的基本使用方法,包括初始化、监听语音识别结果等操作。下面给出一个完整的示例代码,帮助您快速上手。
示例代码
import 'package:flutter/material.dart';
import 'package:flutter_speech/flutter_speech.dart';
void main() {
runApp(MyApp());
}
const languages = [
Language('Francais', 'fr_FR'),
Language('English', 'en_US'),
Language('Pусский', 'ru_RU'),
Language('Italiano', 'it_IT'),
Language('Español', 'es_ES'),
];
class Language {
final String name;
final String code;
const Language(this.name, this.code);
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late SpeechRecognition _speech;
bool _speechRecognitionAvailable = false;
bool _isListening = false;
String transcription = '';
Language selectedLang = languages.first;
@override
void initState() {
super.initState();
activateSpeechRecognizer();
}
// 初始化语音识别器
void activateSpeechRecognizer() {
print('_MyAppState.activateSpeechRecognizer...');
_speech = SpeechRecognition();
// 设置可用性回调
_speech.setAvailabilityHandler(onSpeechAvailability);
// 设置开始识别回调
_speech.setRecognitionStartedHandler(onRecognitionStarted);
// 设置识别结果回调
_speech.setRecognitionResultHandler(onRecognitionResult);
// 设置识别完成回调
_speech.setRecognitionCompleteHandler(onRecognitionComplete);
// 设置错误处理回调
_speech.setErrorHandler(errorHandler);
// 激活语音识别器
_speech.activate(selectedLang.code).then((res) {
setState(() => _speechRecognitionAvailable = res);
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SpeechRecognition'),
actions: [
PopupMenuButton<Language>(
onSelected: _selectLangHandler,
itemBuilder: (BuildContext context) => _buildLanguagesWidgets,
)
],
),
body: Padding(
padding: EdgeInsets.all(8.0),
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: Container(
padding: const EdgeInsets.all(8.0),
color: Colors.grey.shade200,
child: Text(transcription),
),
),
_buildButton(
onPressed: _speechRecognitionAvailable && !_isListening
? () => start()
: null,
label: _isListening
? 'Listening...'
: 'Listen (${selectedLang.code})',
),
_buildButton(
onPressed: _isListening ? () => cancel() : null,
label: 'Cancel',
),
_buildButton(
onPressed: _isListening ? () => stop() : null,
label: 'Stop',
),
],
),
),
),
),
);
}
List<CheckedPopupMenuItem<Language>> get _buildLanguagesWidgets =>
languages.map((l) => CheckedPopupMenuItem<Language>(
value: l,
checked: selectedLang == l,
child: Text(l.name),
)).toList();
void _selectLangHandler(Language lang) {
setState(() => selectedLang = lang);
}
Widget _buildButton({required String label, VoidCallback? onPressed}) => Padding(
padding: EdgeInsets.all(12.0),
child: ElevatedButton(
onPressed: onPressed,
child: Text(
label,
style: const TextStyle(color: Colors.white),
),
),
);
void start() => _speech.activate(selectedLang.code).then((_) {
return _speech.listen().then((result) {
print('_MyAppState.start => result $result');
setState(() {
_isListening = result;
});
});
});
void cancel() =>
_speech.cancel().then((_) => setState(() => _isListening = false));
void stop() => _speech.stop().then((_) {
setState(() => _isListening = false);
});
void onSpeechAvailability(bool result) =>
setState(() => _speechRecognitionAvailable = result);
void onCurrentLocale(String locale) {
print('_MyAppState.onCurrentLocale... $locale');
setState(() => selectedLang = languages.firstWhere((l) => l.code == locale));
}
void onRecognitionStarted() {
setState(() => _isListening = true);
}
void onRecognitionResult(String text) {
print('_MyAppState.onRecognitionResult... $text');
setState(() => transcription = text);
}
void onRecognitionComplete(String text) {
print('_MyAppState.onRecognitionComplete... $text');
setState(() => _isListening = false);
}
void errorHandler() => activateSpeechRecognizer();
}
关键点说明
- 激活语音识别器:通过
_speech.activate()
方法激活语音识别器,并设置各种回调函数。 - 开始监听:调用
_speech.listen()
方法开始监听用户的语音输入。 - 取消监听:调用
_speech.cancel()
方法取消当前的语音识别任务。 - 停止监听:调用
_speech.stop()
方法停止当前的语音识别任务。 - 处理识别结果:通过
onRecognitionResult
回调函数获取并处理识别结果。
注意事项
- 在iOS平台上,确保已经在
Info.plist
中添加了必要的权限描述。 - 在实际应用中,可能需要根据具体需求调整语言选择逻辑和UI设计。
希望这个示例能帮助您更好地理解和使用 flutter_speech_recognition
插件!如果有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter语音识别插件flutter_speech的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter语音识别插件flutter_speech的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用flutter_speech
插件进行语音识别的代码案例。flutter_speech
插件允许你进行语音识别和文本到语音的转换。在这个例子中,我将重点介绍如何进行语音识别。
1. 添加依赖
首先,你需要在你的pubspec.yaml
文件中添加flutter_speech
依赖:
dependencies:
flutter:
sdk: flutter
flutter_speech: ^0.7.0 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
2. 导入插件
在你的Dart文件中(例如main.dart
),导入flutter_speech
插件:
import 'package:flutter/material.dart';
import 'package:flutter_speech/flutter_speech.dart';
3. 使用插件进行语音识别
下面是一个简单的例子,展示了如何使用flutter_speech
插件进行语音识别:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Speech Recognition'),
),
body: Center(
child: SpeechRecognitionButton(),
),
),
);
}
}
class SpeechRecognitionButton extends StatefulWidget {
@override
_SpeechRecognitionButtonState createState() => _SpeechRecognitionButtonState();
}
class _SpeechRecognitionButtonState extends State<SpeechRecognitionButton> {
final FlutterSpeech _speech = FlutterSpeech();
String _recognizedText = '';
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () async {
bool hasPermission = await _speech.hasPermission();
if (!hasPermission) {
await _speech.requestPermission();
hasPermission = await _speech.hasPermission();
}
if (hasPermission) {
setState(() {
_recognizedText = 'Listening...';
});
String result = await _speech.listen(
locale: 'en-US', // 你可以设置为你需要的语言
partialResults: true, // 是否返回部分结果
listenFor: Duration(seconds: 10), // 监听时长
cancelOnSilence: true, // 静音时是否取消
prompt: 'Please speak', // 提示用户开始说话
volumeBoost: true, // 是否增强音量
);
setState(() {
_recognizedText = result;
});
} else {
setState(() {
_recognizedText = 'Permission Denied';
});
}
},
child: Text('Start Listening'),
);
}
}
4. 运行应用
确保你的设备或模拟器支持语音识别功能,然后运行你的Flutter应用。点击按钮后,应用将请求语音识别权限(如果尚未授予),然后开始监听用户的语音输入,并在按钮上显示识别的文本。
注意事项
- 确保你的设备或模拟器上的语音识别功能已经启用。
- 某些设备和操作系统版本可能不支持所有语言或功能。
- 监听时间、是否返回部分结果等参数可以根据需要进行调整。
这个代码案例展示了如何在Flutter应用中使用flutter_speech
插件进行基本的语音识别功能。你可以根据需要进行扩展和自定义。