首页 文章 精选 留言 我的

精选列表

搜索[智能审核],共10000篇文章
优秀的个人博客,低调大师

基于Android TTS服务开发智能助手

简介 本文中将向你展示一个基本的Android应用程序,此程序能够聆听用户的声音并把它转换为文本数据。而且,此程序还能够进行文本分析,然后执行相应的命令来实现数据存储及用户应答功能。 注意,本文源码工程下载地址是:https://github.com/sitepoint-editors/SpeechApplication。 程序快照如下: 创建应用程序 打开Android Studio创建一个新的项目,选择最小版本的Android API 18并添加一个空的Activity。这也是本项目中唯一的一个Activity。 为了实现视图的全屏显示,打开配置文件AndroidManifest.xml,并设置如下: android:theme="@style/Theme.AppCompat.NoActionBar" 这个配置将使我们当前的活动(Activity)中隐藏ActionBar的显示。 到此,你已经拥有一个全屏式的白色背景色布局的视图,其中仅有一个TextView控件。为了作一些改进,你可以把一个渐变形状添加到RelativeLayout上。 接下来,右击drawable文件夹并选择New->Drawable resource file。命名这个资源文件为background,并使用如下代码替换原来的内容: <?xmlversion="1.0"encoding="UTF-8"?> <shapexmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:type="linear" android:startColor="#FF85FBFF" android:endColor="#FF008080" android:angle="45"/> </shape> 实际上,你可以根据自己的喜欢任意地修改颜色与角度。 注意:布局中的ImageButton控件使用了一个来自于https://design.google.com/icons/#ic_mic_none网站提供的图像。你可以下载并把它以资源方式添加使用。 接下来,更新文件activity_main.xml中的代码: <?xmlversion="1.0"encoding="utf-8"?> <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background" android:id="@+id/rel" tools:context="com.example.theodhor.speechapplication.MainActivity"> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/microphoneButton" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:src="@drawable/ic_mic_none_white_48dp" android:background="@null"/> </RelativeLayout> 增加说话功能 现在,用户接口部分已经完成,接下来要编写位于MainActivity内部的Java代码了。 首先,在onCreate方法上面声明一个变量TextToSpeech: privateTextToSpeechtts; 然后,在onCreate方法中添加如下代码: tts=newTextToSpeech(this,newTextToSpeech.OnInitListener(){ @Override publicvoidonInit(intstatus){ if(status==TextToSpeech.SUCCESS){ intresult=tts.setLanguage(Locale.US); if(result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED){ Log.e("TTS","ThisLanguageisnotsupported"); } speak("Hello"); }else{ Log.e("TTS","InitilizationFailed!"); } } }); 上述代码将启动系统中的TextToSpeech服务。其中的speak()方法使用了一个String类型的参数,它是你要求你的Android设备需要念出的文字。 下面要创建这个方法,并添加如下代码: privatevoidspeak(Stringtext){ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){ tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null); }else{ tts.speak(text,TextToSpeech.QUEUE_FLUSH,null); } } 上面代码中使用了Build.VERSION检查,因为tts.speak(param,param,param)格式的调用对于Android API 5.1来说已经废弃了。 在speak()方法后面再创建另一个方法,用于当用户关闭程序时负责停止TextToSpeech服务: @Override publicvoidonDestroy(){ if(tts!=null){ tts.stop(); tts.shutdown(); } super.onDestroy(); } 到此,一旦你启动程序,这个程序便能说出“Hello”这样的语句了。接下来要实现的是使程序具备听的功能。 增加聆听功能 为了使程序能够具备听的功能,你需要使用麦克风按钮。为此,需要在onCreate方法中添加如下代码: findViewById(R.id.microphoneButton).setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ listen(); } }); 点击ImageButton控件时,将触发调用下面这个函数: privatevoidlisten(){ Intenti=newIntent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); i.putExtra(RecognizerIntent.EXTRA_LANGUAGE,Locale.getDefault()); i.putExtra(RecognizerIntent.EXTRA_PROMPT,"Saysomething"); try{ startActivityForResult(i,100); }catch(ActivityNotFoundExceptiona){ Toast.makeText(MainActivity.this,"Yourdevicedoesn'tsupportSpeechRecognition",Toast.LENGTH_SHORT).show(); } } 此方法将启动listening Activity,这个活动会显示一个带有一段文本提示的对话框。讲话所使用的语言是设备提供的,通过Locale.getDefault()方法实现。 StartActivityForResult (i,100)方法等待当前活动返回一个结果。100只是一个附加到已启动活动的随机代码,其实也可以是一个任何适合你需要的数字。当结果从已启动的活动返回时,它包含这个代码并使用此代码来区分来自于彼此的多个结果。 要从已启动的活动中捕获结果,需要添加下面的重写方法: @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ super.onActivityResult(requestCode,resultCode,data); if(requestCode==100){ if(resultCode==RESULT_OK&&null!=data){ ArrayList<String>res=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); StringinSpeech=res.get(0); recognition(inSpeech); } } } 这个方法捕获来自于活动的每一个结果并使用requestCode来处理语言识别器结果数据。如果requestCode等于100,requestCode等于OK并且来自于这个结果的数据不是null。你会从res.get(0)中取得result字符串。 接下来,创建一个新方法recognition,此方法将使用一个String类型的参数: privatevoidrecognition(Stringtext){ Log.e("Speech",""+text); } 到现在为止,当用户点击麦克风按钮时,程序能够听声音了,并且能够把用户的语言转换为文本数据,最终结果将通过Error日志打印输出。 增加学习功能 为了使程序更有趣一些,在这一小节中你要使应用程序能够学习一些简单的事情,例如你的名字。为了实现这一功能,需要使用本地存储功能。 首先,在onCreate方法中添加如下代码: privateSharedPreferencespreferences; privateSharedPreferences.Editoreditor; privatestaticfinalStringPREFS="prefs"; privatestaticfinalStringNAME="name"; privatestaticfinalStringAGE="age"; privatestaticfinalStringAS_NAME="as_name"; 然后,在onCreate方法中添加如下代码: preferences=getSharedPreferences(PREFS,0); editor=preferences.edit(); 首先,你需要使应用程序提问问题,所以需要把speak("Hello")修改为speak(“What is your name?)。 在这里,您可以使用一个简单的逻辑;所以,当有人问"你的名字是什么?",答案是"我的名字是Dori",于是从答案中提出名字。一个简单的方法是把答案拆分由空格分隔的字符串并获取最后一个索引的值。 于是,我们要更新recognition方法中的代码,如下所示: privatevoidrecognition(Stringtext){ Log.e("Speech",""+text); //creatinganarraywhichcontainsthewordsoftheanswer String[]speech=text.split(""); //thelastwordisourname Stringname=speech[speech.length-1]; //wegotthename,wecanputitinlocalstorageandsavechanges editor.putString(NAME,name).apply(); //maketheapptellourname speak("Yournameis"+preferences.getString(NAME,null)); } recognition方法使用来自用户语音的所有结果。既然讲话可能是不同的,你可以使用它们可能包含的某些单词来区别它们。 例如,这个方法中的代码可以是: privatevoidrecognition(Stringtext){ Log.e("Speech",""+text); String[]speech=text.split(""); //ifthespeechcontainsthesewords,theuserissayingtheirname if(text.contains("mynameis")){ Stringname=speech[speech.length-1]; Log.e("Yourname",""+name); editor.putString(NAME,name).apply(); speak("Yournameis"+preferences.getString(NAME,null)); } } 但这仍然是一个与应用程序的简单交互。你可以让它学习你的年龄,或者给它起一个名字。 在同一个方法中,你可以尝试下面这些简单的条件: //Thismustbetheage //Justspeak:Iamxyearsold. if(text.contains("years")&&text.contains("old")){ Stringage=speech[speech.length-3]; Log.e("THIS",""+age); editor.putString(AGE,age).apply(); } //Thenaskitforyourage if(text.contains("howoldamI")){ speak("Youare"+preferences.getString(AGE,null)+"yearsold."); } 应用程序能够告诉你时间信息: //Ask:Whattimeisit? if(text.contains("whattimeisit")){ SimpleDateFormatsdfDate=newSimpleDateFormat("HH:mm");//dd/MM/yyyy Datenow=newDate(); String[]strDate=sdfDate.format(now).split(":"); if(strDate[1].contains("00"))strDate[1]="o'clock"; speak("Thetimeis"+sdfDate.format(now)); } 小结 在我创建的GitHub工程(https://github.com/sitepoint-editors/SpeechApplication)中包含了更多的例子,你可以充分地进行实验并开发出你自己真正的Android助手程序。 最后,希望你喜欢这个教程,并希望你能够与自己的手机产生一次真正有用的对话。 作者:朱先忠 来源:51CTO

优秀的个人博客,低调大师

高速光纤能连接智能工厂吗?

为了保持工厂持续前进的步伐,业界开始着眼于使用高速光纤连接制造设施的想法。透过光纤网路,可以连接远端的制造作业,提升生产最佳化与供应链管理… 机器对机器(M2M)互连以及物联网(Internet of Things;IoT)已经升华成为许多策略技术对话的最前哨了。 业界多家公司正进一步改善其产品设计与元件性能,期望在装置之间建立起无缝且即时的通讯流程。企业高层也热衷于讨论持续传输与自动化分析机器所产生的资讯,如何使我们的生活、工作、游戏、驾车与购物方式转型,以及如何改变我们的家庭、办公室、车辆、购物中心、超级市场、医院、加油站以及每天所经之处的样貌。 随着M2M和IoT形成商业和营运策略,影响了产品的设计,同时也迫使企业重新审视如何收集供应商和客户数据并有效使用,应运而生的一个问题是:企业如何配合IoT所承诺的速度、一致性与可靠性,将所有内部工厂和供应链数据汇整在一起?毕竟,工厂是让许多公司持续经营的命脉,一旦出现任何数据瓶颈都将带来昂贵的代价。 业界中有许多人已经开始意识到这一点,并促成围绕着工业IoT或IIoT的更深层次对话。 为了保持工厂持续前进的步伐,一些对话开始着眼于使用高速光纤连接制造设施的想法。透过光纤网路,可以连接远端的制造操作,其用途包括生产最佳化与供应链管理。 在制造厂中导入高速网路实现M2M通讯与即时监控,并不是什么新的话题。先进的制造及其对于监控主动系统的需求,实现了高速网路,而对于大数据的需求更将此需求推向新的高度。此外,制造商希望网路不仅是单一的设施,而是经常部署在不同的生产据点。这需要一种全新的长距离高速网路。 工业数据正呈指数级增加,未来将需要高速网路以实现无缝、安全与可靠的数据传输 同时,工业网际网路联盟(IIC)在此发挥领导的作用。这个以通用电气(General Electric;GE)为主导、并获得思科(Cisco)、Accenture与Bayshore Networks支持的组织,目前已经建立了高速网路测试平台。这种新的光纤技术能够达到每秒100Gb的速度,相当于同时下载6,000部高解析影片。 然而,100Gbps的高速M2M如何实现?根据该组织表示,100Gbps的能力可延伸到无线网路边缘,让测试台主导厂商能够透过先进的通讯技术,为移动用户提供更多的数据与分析结果。GE目前正在其全球研究中心(Global Research Center)安装网路;思科提供了所需的基础架构,让网路得以扩展至全国。Accenture与Bayshore Networks则展示电力发电的高速网路基础架构应用。 Bayshore Networks表示,该测试平台使用其IT/OT闸道过滤器将发电机数据转换为标准分析格式,以便与第三方的Accenture Insights Platform分析进行整合。该闸道器负责确保移动中的数据,并将其安全地馈送至分析平台。 GE软体研究副总裁Colin Parris表示:“GE的软体研究重点在于推动大规模系统之间的即时互连,并开发先进复杂的控制系统,以提高产品的性能和效率。”他并强调,“这些高速网路可以在工业网际网路产品与服务之间加速数据移动,以及提高数据量。这种能力将大幅加速在这些领域中所需的进展,而借由IIC联盟展开合作,将有助于推动工业标准。” 高速光纤技术是否将成为IIoT的业界标准,目前还有待观察。但是,无论标准的主导最终落户何处,希望保持竞争力的公司都必须致力于超越其现有的先进技术与自动化。整合能够重塑产品设计、对内与对外供应链活动以及客户互动的大数据(big data),迟早都将成为讨论话题。 M2M和IoT如何塑造您的制造策略?您打算如何让工厂以大数据分析的语言开启对话? 作者:佚名 来源:51CTO

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册