Flutter后台语音识别插件background_stt的使用
Flutter后台语音识别插件background_stt的使用
安装
在 pubspec.yaml
文件中添加依赖项:
dependencies:
background_stt: [LATEST_VERSION]
在 Dart 文件中导入插件:
import 'package:background_stt/background_stt.dart';
使用示例代码
import 'package:flutter/material.dart';
import 'package:background_stt/background_stt.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
var _service = BackgroundStt();
String result = "Say something!";
String confirmation = "";
String confirmationReply = "";
String voiceReply = "";
var isListening = false;
double _currentPitchValue = 1;
double _currentRateValue = 1;
[@override](/user/override)
void initState() {
_service.startSpeechListenService;
setState(() {
if (mounted) isListening = true;
});
_service.getSpeechResults().onData((data) {
print("getSpeechResults: ${data.result} , ${data.isPartial} [STT Mode]");
_doOnSpeechCommandMatch(data.result);
setState(() {
confirmation = "";
confirmationReply = "";
voiceReply = "";
result = data.result!;
});
});
_service.getConfirmationResults().onData((data) {
print(
"getConfirmationResults: Confirmation Text: ${data.confirmationIntent} , "
"User Replied: ${data.confirmedResult} , "
"Voice Input Message: ${data.voiceInput} , "
"Is Confirmation Success?: ${data.isSuccess}");
setState(() {
confirmation = data.confirmationIntent!;
confirmationReply = data.confirmedResult!;
});
});
super.initState();
}
void _doOnSpeechCommandMatch(String? command) {
if (command == "start") {
_service.confirmIntent(
confirmationText: "Do you want to start?",
positiveCommand: "yes",
negativeCommand: "no");
} else if (command == "stop") {
_service.confirmIntent(
confirmationText: "Do you want to stop?",
positiveCommand: "yes",
negativeCommand: "no");
} else if (command == "hello") {
_service.confirmIntent(
confirmationText: "Hello to you!",
positiveCommand: "hi",
negativeCommand: "bye");
} else if (command == "address") {
_service.confirmIntent(
confirmationText: "What is the address?",
positiveCommand: "yes",
negativeCommand: "no",
voiceInputMessage: "Is the address correct?",
voiceInput: true);
}
setState(() {
confirmation = "$command [Confirmation Mode]";
});
}
void updateSpeaker() {
print("setSpeaker: pitch($_currentPitchValue) rate($_currentRateValue)");
_service.setSpeaker(_currentPitchValue / 100, _currentRateValue / 100);
}
[@override](/user/override)
void dispose() {
super.dispose();
_service.stopSpeechListenService;
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Background Speech-to-Text'),
),
body: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('$result\n\n'),
confirmation.isNotEmpty
? Text('Confirmation: $confirmation')
: Container(),
confirmationReply.isNotEmpty
? Text('Reply: $confirmationReply')
: Container(),
voiceReply.isNotEmpty
? Text('Voice Reply: $voiceReply')
: Container(),
confirmation.isNotEmpty
? RaisedButton(
child: Text("Cancel Confirmation"),
onPressed: () async {
await _service.cancelConfirmation;
setState(() {
result = "Say something!";
confirmation = "";
confirmationReply = "";
voiceReply = "";
});
},
)
: Container(),
Visibility(
child: RaisedButton(
child: Text("Pause Listening"),
onPressed: () async {
await _service.pauseListening();
setState(() {
result = "Speech listener Paused!";
confirmation = "";
confirmationReply = "";
voiceReply = "";
isListening = false;
});
},
),
replacement: RaisedButton(
child: Text("Resume Listening"),
onPressed: () async {
await _service.resumeListening();
setState(() {
result = "Speech listener Resumed!";
confirmation = "";
confirmationReply = "";
voiceReply = "";
isListening = true;
});
},
),
visible: isListening,
),
RaisedButton(
child: Text("Speak"),
onPressed: () async {
var t = DateTime.now();
await _service.speak(
"Hello, time is ${t.hour}:${t.minute}:${t.second}",
false);
setState(() {
result = "Speech listener Paused!";
confirmation = "";
confirmationReply = "";
voiceReply = "";
isListening = false;
});
},
),
Slider(
value: _currentPitchValue,
min: 0,
max: 100,
divisions: 10,
label: "Pitch: ${_currentPitchValue.round().toString()}",
onChanged: ( (double value) {
setState(() {
_currentPitchValue = value;
});
updateSpeaker();
},
),
Slider(
value: _currentRateValue,
min: 0,
max: 100,
divisions: 10,
label: "Rate: ${_currentRateValue.round().toString()}",
onChanged: ( (double value) {
setState(() {
_currentRateValue = value;
});
updateSpeaker();
},
)
],
),
),
),
);
}
}
更多关于Flutter后台语音识别插件background_stt的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter后台语音识别插件background_stt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成和使用background_stt
插件进行后台语音识别的示例代码。这个插件允许你的应用在后台进行语音识别,非常适合需要持续监听语音输入的应用场景。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加background_stt
依赖:
dependencies:
flutter:
sdk: flutter
background_stt: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置Android权限
由于语音识别需要麦克风权限,你需要在AndroidManifest.xml
中添加相关权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
... >
...
</application>
</manifest>
3. 请求权限
在Flutter代码中,你需要请求麦克风权限。可以使用permission_handler
插件来处理权限请求(如果尚未添加,请先添加permission_handler
依赖)。
import 'package:permission_handler/permission_handler.dart';
Future<void> requestPermissions() async {
var status = await Permission.microphone.status;
if (!status.isGranted) {
Map<Permission, PermissionStatus> permissions = await Permission.requestMultiple([Permission.microphone]);
status = permissions[Permission.microphone]?.status ?? PermissionStatus.denied;
}
if (!status.isGranted) {
// 处理权限被拒绝的情况
}
}
4. 初始化并使用background_stt
下面是一个简单的示例,展示了如何初始化background_stt
插件并处理语音识别结果:
import 'package:flutter/material.dart';
import 'package:background_stt/background_stt.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Background STT Example'),
),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String recognitionText = '';
@override
void initState() {
super.initState();
initBackgroundSTT();
}
Future<void> initBackgroundSTT() async {
// 初始化插件
await BackgroundSTT.initialize(
onResult: (String result) {
// 更新UI以显示识别结果
setState(() {
recognitionText = result;
});
},
onError: (String error) {
print("Error: $error");
},
onStatus: (String status) {
print("Status: $status");
},
);
// 请求麦克风权限
await requestPermissions();
// 开始语音识别
await BackgroundSTT.startListening();
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Recognition Text:'),
Text(recognitionText, style: TextStyle(fontSize: 20)),
],
),
);
}
}
注意事项
- 权限处理:确保在启动语音识别之前已经获得了必要的权限。
- 后台服务:
background_stt
插件使用了Android的前台服务来保持应用在后台运行。你可能需要处理前台服务的通知。 - 电池优化:长时间运行语音识别可能会影响电池寿命,确保在不需要时停止监听。
- 隐私政策:在你的应用中添加隐私政策,告知用户你将如何处理和存储他们的语音数据。
这个示例代码提供了一个基本的框架,你可以根据自己的需求进行扩展和修改。