博舍

添加语音功能   激活语音识别

添加语音功能  

语音操作是穿戴式设备体验的重要组成部分。借助此功能,用户无需动手就能快速执行操作。WearOSbyGoogle谷歌提供了两种语音操作:

系统提供的语音操作这种语音操作基于任务并内置于Wear平台。说出语音操作时,在您要启动的Activity中过滤它们。示例包括“添加记事”或“设置闹钟”。应用提供的语音操作这种语音操作基于应用,您可以像声明启动图标一样声明它们。用户可以说出“启动(您的应用名称)”以使用这些语音操作,此时您指定的Activity将会启动。声明系统提供的语音操作

WearOS平台提供了一些基于用户操作(如“添加记事”或“设置闹钟”)的语音intent。这可让用户说出他们想要执行的操作,然后让系统确定要启动的最佳Activity。

当用户说出语音操作时,您的应用可以过滤为了启动Activity而触发的intent。如果您要启动一项服务以在后台执行某项操作,可显示一个Activity作为视觉提示,并在此Activity中启动该服务。如果您想去除视觉提示,请务必调用finish()。

例如,对于“添加记事”命令,可声明以下intent过滤器以启动一个名为MyNoteActivity的Activity:

下面列出了Wear平台支持的语音Intent:

名称示例语句Intent叫辆车/出租车“OkGoogle,叫辆出租车”“OkGoogle,叫辆车”操作com.google.android.gms.actions.RESERVE_TAXI_RESERVATION添加记事“OkGoogle,添加记事”“OkGoogle,自我提醒”操作android.intent.action.SEND类别com.google.android.voicesearch.SELF_NOTE额外项android.content.Intent.EXTRA_TEXT-带有记事正文的字符串设置闹钟“OkGoogle,设置早上8点的闹钟”“OkGoogle,明天6点叫醒我”操作android.intent.action.SET_ALARM额外项android.provider.AlarmClock.EXTRA_HOUR-一个整数,表示闹铃的小时。

android.provider.AlarmClock.EXTRA_MINUTES-一个整数,表示闹铃的分钟

(这两个额外项是可选的,要么都不提供,要么都提供)

设置定时器“OkGoogle,设置一个10分钟的定时器”操作android.intent.action.SET_TIMER额外项android.provider.AlarmClock.EXTRA_LENGTH-一个整数,范围为1到86400(24小时的秒数),表示定时器的时长启动秒表“OkGoogle,启动秒表”操作com.google.android.wearable.action.STOPWATCH开始/停止骑自行车“OkGoogle,开始骑车”“OkGoogle,开始骑自行车”“OkGoogle,停止骑车”操作vnd.google.fitness.TRACKMimeTypevnd.google.fitness.activity/biking额外项actionStatus-一个字符串,在开始时值为ActiveActionStatus,在停止时值为CompletedActionStatus。开始/停止跑步“OkGoogle,跟踪我的跑步”“OkGoogle,开始跑步”“OkGoogle,停止跑步”操作vnd.google.fitness.TRACKMimeTypevnd.google.fitness.activity/running额外项actionStatus-一个字符串,在开始时值为ActiveActionStatus,在停止时值为CompletedActionStatus开始/停止锻炼“OkGoogle,开始锻炼”“OkGoogle,跟踪锻炼”“OkGoogle,停止锻炼”操作vnd.google.fitness.TRACKMimeTypevnd.google.fitness.activity/other额外项actionStatus-一个字符串,在开始时值为ActiveActionStatus,在停止时值为CompletedActionStatus显示心率“OkGoogle,我的心率是多少?”“OkGoogle,我的bpm是多少?”操作vnd.google.fitness.VIEWMimeTypevnd.google.fitness.data_type/com.google.heart_rate.bpm显示步数“OkGoogle,我走了多少步?”“OkGoogle,我的步数是多少?”操作vnd.google.fitness.VIEWMimeTypevnd.google.fitness.data_type/com.google.step_count.cumulative

如需查看有关注册平台Intent和访问其中包含的额外项信息的文档,请参阅常见Intent。

声明应用提供的语音操作

如果没有适合您的平台语音intent,您可以通过“启动MyActivityName”语音操作直接启动您的应用。

在手持设备上,注册“启动”操作与注册启动器图标相同。但是,应用不会请求启动器中的应用图标,而会请求语音操作。

要指定在“启动”后要说的内容,可为您要启动的Activtiy指定label属性。例如,以下Intent过滤器可识别“启动MyRunningApp”语音操作并启动StartRunActivity。

获取自由格式的语音输入

除使用语音操作启动Activity外,您还可以调用系统内置的语音识别程序Activity来获取用户的语音输入。这对于获取用户输入而后对其进行处理(如执行搜索或将其作为消息发送)非常有用。

在您的应用中,使用ACTION_RECOGNIZE_SPEECH操作调用startActivityForResult()。这将启动语音识别Activity,然后您可以在onActivityResult()中处理结果。

KotlinprivateconstvalSPEECH_REQUEST_CODE=0...//CreateanintentthatcanstarttheSpeechRecognizeractivityprivatefundisplaySpeechRecognizer(){valintent=Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply{putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)}//Starttheactivity,theintentwillbepopulatedwiththespeechtextstartActivityForResult(intent,SPEECH_REQUEST_CODE)}//ThiscallbackisinvokedwhentheSpeechRecognizerreturns.//Thisiswhereyouprocesstheintentandextractthespeechtextfromtheintent.overridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent){if(requestCode==SPEECH_REQUEST_CODE&&resultCode==Activity.RESULT_OK){valspokenText:String?=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS).let{results->results[0]}//DosomethingwithspokenText}super.onActivityResult(requestCode,resultCode,data)}JavaprivatestaticfinalintSPEECH_REQUEST_CODE=0;//CreateanintentthatcanstarttheSpeechRecognizeractivityprivatevoiddisplaySpeechRecognizer(){Intentintent=newIntent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);//Starttheactivity,theintentwillbepopulatedwiththespeechtextstartActivityForResult(intent,SPEECH_REQUEST_CODE);}//ThiscallbackisinvokedwhentheSpeechRecognizerreturns.//Thisiswhereyouprocesstheintentandextractthespeechtextfromtheintent.@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){if(requestCode==SPEECH_REQUEST_CODE&&resultCode==RESULT_OK){Listresults=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);StringspokenText=results.get(0);//DosomethingwithspokenText}super.onActivityResult(requestCode,resultCode,data);}

另请参阅以下相关资源:

WearOS设计原则

语音识别之VAD——静默检测

1、简介

     静默检测对于语音识别有这很重要作用,什么是静默检测?顾名思义就是检测语音的状态,静默状态还是激活状态,这样才能保证送进语音识别模型的是一句完整语音数据,排除一些噪音的干扰。如同下图所示,当然这里存在一个问题,就是多长时间的静默状态才当作语音的结束,以及多大的语音能量以及多长时间的状态持续才当作语音的开始。

2、算法简介

     2.1语音激活状态检测

        一般情况下,麦克风录入的音量肯定存在或多或少的噪音,例如撞击声、敲击声等,一般需要排除的噪音是端、快类型,防止造成检测为误激活状态。噪音具有时效性,也就是说不同时间不同地点的噪音肯定都不同,所以这里就需要对噪音有一个取样评判的过程。

        语音在短时间内都是为平稳状态,一般10到30ms,也就是这一段时间的语音状态近乎一致。故对录入的音频数据要有一个分帧的过程,当然一般情况下也需要帧移,例如:每次录入30ms,但是我每次只取20ms的音频,为保证每次处理的音频数据与上次的变化不会过于跳变,所以下次处理的数据包含上次数据的后10ms。

        |————10ms——————|—————10ms—————|—————10ms—————|

        ||

                               ||

      每次处理数据的最小单位为一帧,也就是上图所说的状态,当然对于一般情况就取10ms一帧不进行帧移也可以。首先获取背景噪音的能量,每帧的能量可以取平方均值,可以取前n帧作为背景噪音的能量值,噪音的能量值需要设置一个最小门限,防止出现很安静的状态下误处理。仅仅比较当前的语音能量与噪音能量,显然不够,还需要监控语音的变化状态,是否跳动以及此状态的维持时间。当这几个条件同时满足方可判断为激活状态。常用方法:过零检测与门限控制。

例程如下:

//能量计算

floatCalculateEnergy(constfloat*frames,size_tframes_count)

{  floatenergy=0;  for(size_ti=0;i

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇