Dart | 使用 Flutter 制作一个像 SIRI 那样的语音机器人
1 概述
我们将为语音机器人创建一个应用程序,该程序将监听后台或前台的语音,并将回答提交的查询。
2 开始编码
2.1 首先创建一个新的 flutter 应用程序
2.2 在 pubspec.yaml 文件中添加以下包
dependencies:flutter:sdk: flutterflutter_tts: ^3.3.3flutter_background_service: ^2.1.0speech_to_text:
2.3 Android 配置
在 Android/app/build.gradle 文件中,将 Android SDK 的最小版本更改为21(或更高)。
注意: 针对 Android 11使用文本语音转换的应用程序应该在其清单的查询元素中声明 TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE
<queries><intent><action android:name="android.speech.RecognitionService"/></intent>
</queries>
在 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.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
2.4 在终端运行 flutter pub get
命令
2.5 创建 background_service.dart 文件
final service = FlutterBackgroundService();Future initializeService()async{await service.configure(androidConfiguration: AndroidConfiguration(// this will executed when app is in foreground or background in separated isolateonStart: onStart,// auto start serviceautoStart: true,isForegroundMode: true,),iosConfiguration: IosConfiguration(// auto start serviceautoStart: true,// this will executed when app is in foreground in separated isolateonForeground: onStart,// you have to enable background fetch capability on xcode projectonBackground: onIosBackground,),);await service.startService();
}
bool onIosBackground(ServiceInstance service) {WidgetsFlutterBinding.ensureInitialized();print('FLUTTER BACKGROUND FETCH');return true;
}
void onStart(ServiceInstance service) async {// Only available for flutter 3.0.0 and laterDartPluginRegistrant.ensureInitialized();// For flutter prior to version 3.0.0// We have to register the plugin manuallyif (service is AndroidServiceInstance) {service.on('setAsForeground').listen((event) {//set as foregroundservice.setAsForegroundService();});service.on('setAsBackground').listen((event) async {//set as backgroundservice.setAsBackgroundService();});}service.on('stopService').listen((event) {service.stopSelf();});// bring to foregroundTimer.periodic(const Duration(seconds:1), (timer) async {if (service is AndroidServiceInstance) {service.setForegroundNotificationInfo(title: "My App Service",content: "Updated at ${DateTime.now()}",);}/// you can see this log in logcatprint('FLUTTER BACKGROUND SERVICE: ${DateTime.now()}');// test using external pluginservice.invoke('update',{"current_date": DateTime.now().toIso8601String(),"last_message": '_lastWords',},);});
}
现在应用程序将工作在后台模式。
2.6 设置语音监听
现在让我们设置语音监听器和机器人重播,让说当用户说“我想帮助”或包含“帮助”关键字,系统将回复 我们正在发送帮助 或用户在说”停止”后停止监听器。
final SpeechToText _speechToText = SpeechToText();
bool _speechEnabled = false;
String _lastWords="Say something";
void _initSpeech() async {_speechEnabled = await _speechToText.initialize();}void _startListening() async {await _speechToText.listen(onResult: _onSpeechResult);
}void _stopListening() async {await _speechToText.stop();
}Future<void> _onSpeechResult(SpeechRecognitionResult result) async {var flutterTts = FlutterTts();_lastWords=(result.recognizedWords.toString().toLowerCase());if(_lastWords.contains("hello") || _lastWords.contains('help')){flutterTts.speak("We are sending help");}else if(_lastWords.contains('stop')){_stopListening();flutterTts.speak("Stopped");}}
2.7 启动监听
现在让我们在后台听语音,在函数 initializeService ()
的开头添加以下行 _ initSpeech ()
;并在 Timer.periodic
函数后面添加这些行。
if (_speechEnabled) {_startListening();
}
2.8 创建用户界面
让我们创建一个用户界面,在 main.dart 中添加以下代码:
import 'dart:async';import 'package:flutter_background_service/flutter_background_service.dart' show AndroidConfiguration, FlutterBackgroundService, IosConfiguration, ServiceInstance;
import 'package:flutter/material.dart';
import 'background_service.dart';
Future<void> main() async {WidgetsFlutterBinding.ensureInitialized();await initializeService();runApp( const MyApp());
}class MyApp extends StatefulWidget {const MyApp({Key? key,}) : super(key: key);@overrideState<MyApp> createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {String text = "Stop Service";@overrideWidget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,home: Scaffold(appBar: AppBar(title: const Text("Voice Bot"),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [//for listen Continuous change in foreground we will be using Stream builderStreamBuilder<Map<String, dynamic>?>(stream: FlutterBackgroundService().on('update'),builder: (context,snapshot){if (!snapshot.hasData) {return const Center(child: CircularProgressIndicator(),);}final data = snapshot.data!;String? lastMessage = data["last_message"];DateTime? date = DateTime.tryParse(data["current_date"]);return Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text(lastMessage ?? 'Unknown'),Text(date.toString()),],);}),Padding(padding: const EdgeInsets.all(8.0),child: GestureDetector(child: Container(padding: const EdgeInsets.symmetric(vertical: 10,horizontal: 20),decoration: BoxDecoration(color: Colors.blueAccent,borderRadius: BorderRadius.circular(16)),child: const Text("Foreground Mode",style: TextStyle(color: Colors.white),)),onTap: () {FlutterBackgroundService().invoke("setAsForeground");},),),Padding(padding: const EdgeInsets.all(8.0),child: GestureDetector(child: Container(padding: const EdgeInsets.symmetric(vertical: 10,horizontal: 20),decoration: BoxDecoration(color: Colors.blueAccent,borderRadius: BorderRadius.circular(16)),child: const Text("Background Mode",style: TextStyle(color: Colors.white),)),onTap: () {print('start');FlutterBackgroundService().invoke("setAsBackground");},),),Padding(padding: const EdgeInsets.all(8.0),child: GestureDetector(child: Container(padding: const EdgeInsets.symmetric(vertical: 10,horizontal: 20),decoration: BoxDecoration(color: Colors.blueAccent,borderRadius: BorderRadius.circular(16)),child: Text(text,style: const TextStyle(color: Colors.white),),),onTap: () async {final service=FlutterBackgroundService();var isRunning = await service.isRunning();if (isRunning) {service.invoke("stopService");} else {service.startService();}if (!isRunning) {text = 'Stop Service';} else {text = 'Start Service';}setState(() {});},),),],),),),);}
}
3 可以测试这个程序啦
Dart | 使用 Flutter 制作一个像 SIRI 那样的语音机器人相关推荐
- 使用 Flutter 制作一个简单的笑话生成器应用程序
在本教程中,我将向您展示如何使用 Flutter 制作一个简单的笑话生成器应用程序 对于这个项目,我们将从 RESTful API 获取数据 API的链接: 随机笑话 对于这个项目,我不会关注应用程序 ...
- Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面
本文主要介绍如何使用 Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面 我将向您展示如何使用 Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面,所以不用多说,让我们开始吧.在本课程 ...
- Flutter 制作一个抽屉菜单
什么是抽屉菜单呢? 其实在APP中,抽屉菜单就是当手指在屏幕横向滑动时候,左边屏幕会滑出或者滑入一个View的东西,就像一个抽屉.下面是我在网上找的一个示例图,和现在正跑在我的模拟器上的目标图. ...
- 如何让你的网页生成一个像siri一样的语音助手
首先你要知道两个概念语音识别
- 如何制作一个连杆组简易四足机器人
1. 运动功能说明 本文示例将实现R296样机连杆组简易四足机器人前进的功能. 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) ...
- 怎么用手机制作一个四格漫画(flutter)
一,背景 四格漫画,是以四个画面分格来完成一个小故事或一个创意点子的表现形式 ,分为开头,发展,高潮,结尾 .那怎么用手机制作一个四格漫画呢?就像下图这样. 二,思考过程 漫画么,简单点就两个主要的元 ...
- 利用Flutter写一个跨平台的果核APP(4)——数据存储
前言 目前我们已经实现了几个界面,今天这篇文章开始着手进行登录页的制作,主要流程就是获取输入框中的内容,发送给后台进行验证,如果成功将返回信息保存在本地并跳转至首页,如果失败就提示用户重新输入. 在这 ...
- flutter制作具有自定义导航栏的渐进式 Web 应用程序
本文主要介绍具有自定义导航栏的渐进式 Web 应用程序 gitee github 哔哩哔哩 第一节 第二节 第三节 让我们准备我们的 - "Main.dart" 我们将整个页面分成 ...
- flutter制作博客展示平台,现已支持 Web、macOS 应用、Android 和 iOS
Flutter Blog Theme using Flutter | Web, macOS, Android, iOS Flutter 最近发布了 Flutter V2.5.1,其性能得到了很大提升, ...
- Flutter 构建一个完整的聊天应用程序
在本教程中,我将向您展示如何使用 Flutter 构建一个完整的聊天应用程序.对于这一部分,我们将创建应用程序的 UI 原型,然后我将向您展示如何使用 firebase 创建后端服务并创建聊天系统. ...
最新文章
- 史上最硬核文科生,擅长解决数学难题,却视考试成为终生噩梦
- MariaDB安装1,2
- hive 优化(二)
- 工作流之流程定义存储表
- 最全的LED电源解决方案 转载
- QQ坦白说解密(一)
- 饭店流量预测-多表关联+lightgbm
- Python语言程序设计基础_实验3 流程控制I_答案_通识教育必修课程_上海师范大学
- 微信扫码支付模式一 : 获取商户订单信息超时或者商户返回的httpcode非200
- android设置页面转场特效
- java中任何变量都可以被赋值为null,java中当给一个对象赋值为null时发生了什么...
- taro 项目中接入EChart图表库
- 事件根基event_base、事件循环event_loop、事件event、信号事件SignalEvent
- 终于弄个网站关于建站讨论学习(互联网互助联盟建站之家)
- 笔记本外接显示器屏幕发灰解决方案
- PHP图书馆借阅系统之创建数据库
- 给图片加文字,加图片
- 基于RRT的路径规划器
- 通过Docker Swarm,Docker Compose和Consul扩展到无限(第3/4部分)–蓝绿色部署,自动化和自愈过程...
- python rtsp推流_python处理RSTP视频流过程解析
热门文章
- Android 根据应用内选择时间调整TextClock时区
- 高端疫苗的新冠疫苗二期数据发表;药明生基新建工艺研发和商业化生产中心投运 | 医药健闻...
- Windows常见垃圾清理方式
- 网络间谍:你的共享文件夹网络监视器
- PC 先驱克拉克逝世 曾参与开发首款晶体管 PC
- android设置主题背景为壁纸_Android 应用背景加载系统动态壁纸
- 『UE4数字孪生』开发流程浅析(持续更新)
- Leetcode刷题——题目8、9、10
- java add用法
- 安装gooreplacer插件为含有googlefonts api的网页提速