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 那样的语音机器人相关推荐

  1. 使用 Flutter 制作一个简单的笑话生成器应用程序

    在本教程中,我将向您展示如何使用 Flutter 制作一个简单的笑话生成器应用程序 对于这个项目,我们将从 RESTful API 获取数据 API的链接: 随机笑话 对于这个项目,我不会关注应用程序 ...

  2. Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面

    本文主要介绍如何使用 Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面 我将向您展示如何使用 Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面,所以不用多说,让我们开始吧.在本课程 ...

  3. Flutter 制作一个抽屉菜单

    什么是抽屉菜单呢?   其实在APP中,抽屉菜单就是当手指在屏幕横向滑动时候,左边屏幕会滑出或者滑入一个View的东西,就像一个抽屉.下面是我在网上找的一个示例图,和现在正跑在我的模拟器上的目标图. ...

  4. 如何让你的网页生成一个像siri一样的语音助手

    首先你要知道两个概念语音识别

  5. 如何制作一个连杆组简易四足机器人

    1. 运动功能说明 本文示例将实现R296样机连杆组简易四足机器人前进的功能. 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno)‍ ...

  6. 怎么用手机制作一个四格漫画(flutter)

    一,背景 四格漫画,是以四个画面分格来完成一个小故事或一个创意点子的表现形式 ,分为开头,发展,高潮,结尾 .那怎么用手机制作一个四格漫画呢?就像下图这样. 二,思考过程 漫画么,简单点就两个主要的元 ...

  7. 利用Flutter写一个跨平台的果核APP(4)——数据存储

    前言 目前我们已经实现了几个界面,今天这篇文章开始着手进行登录页的制作,主要流程就是获取输入框中的内容,发送给后台进行验证,如果成功将返回信息保存在本地并跳转至首页,如果失败就提示用户重新输入. 在这 ...

  8. flutter制作具有自定义导航栏的渐进式 Web 应用程序

    本文主要介绍具有自定义导航栏的渐进式 Web 应用程序 gitee github 哔哩哔哩 第一节 第二节 第三节 让我们准备我们的 - "Main.dart" 我们将整个页面分成 ...

  9. flutter制作博客展示平台,现已支持 Web、macOS 应用、Android 和 iOS

    Flutter Blog Theme using Flutter | Web, macOS, Android, iOS Flutter 最近发布了 Flutter V2.5.1,其性能得到了很大提升, ...

  10. Flutter 构建一个完整的聊天应用程序

    在本教程中,我将向您展示如何使用 Flutter 构建一个完整的聊天应用程序.对于这一部分,我们将创建应用程序的 UI 原型,然后我将向您展示如何使用 firebase 创建后端服务并创建聊天系统. ...

最新文章

  1. 史上最硬核文科生,擅长解决数学难题,却视考试成为终生噩梦
  2. MariaDB安装1,2
  3. hive 优化(二)
  4. 工作流之流程定义存储表
  5. 最全的LED电源解决方案 转载
  6. QQ坦白说解密(一)
  7. 饭店流量预测-多表关联+lightgbm
  8. Python语言程序设计基础_实验3 流程控制I_答案_通识教育必修课程_上海师范大学
  9. 微信扫码支付模式一 : 获取商户订单信息超时或者商户返回的httpcode非200
  10. android设置页面转场特效
  11. java中任何变量都可以被赋值为null,java中当给一个对象赋值为null时发生了什么...
  12. taro 项目中接入EChart图表库
  13. 事件根基event_base、事件循环event_loop、事件event、信号事件SignalEvent
  14. 终于弄个网站关于建站讨论学习(互联网互助联盟建站之家)
  15. 笔记本外接显示器屏幕发灰解决方案
  16. PHP图书馆借阅系统之创建数据库
  17. 给图片加文字,加图片
  18. 基于RRT的路径规划器
  19. 通过Docker Swarm,Docker Compose和Consul扩展到无限(第3/4部分)–蓝绿色部署,自动化和自愈过程...
  20. python rtsp推流_python处理RSTP视频流过程解析

热门文章

  1. Android 根据应用内选择时间调整TextClock时区
  2. 高端疫苗的新冠疫苗二期数据发表;药明生基新建工艺研发和商业化生产中心投运 | 医药健闻...
  3. Windows常见垃圾清理方式
  4. 网络间谍:你的共享文件夹网络监视器
  5. PC 先驱克拉克逝世 曾参与开发首款晶体管 PC
  6. android设置主题背景为壁纸_Android 应用背景加载系统动态壁纸
  7. 『UE4数字孪生』开发流程浅析(持续更新)
  8. Leetcode刷题——题目8、9、10
  9. java add用法
  10. 安装gooreplacer插件为含有googlefonts api的网页提速