语音从零之五用科大讯飞语音包实现语音打开已安装应用程序
Posted yangykaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语音从零之五用科大讯飞语音包实现语音打开已安装应用程序相关的知识,希望对你有一定的参考价值。
【更新】有人说不会使用科大讯飞的语音包。这里是传送门,能够參考从零系列的前四篇文章
本文主要介绍怎样利用语音包实现口语控制打开应用程序,比如:说“打开计算器”,计算器就彭地打开了。
要完毕这个功能,首先要识别出指令是“打开",然后识别出应用程序名称是”计算器“。这些工作都交给科大讯飞语音包的语义理解模块完毕。
我们要做的,首先是把已安装的应用程序的名称和包名保存下来,由于启动一个应用程序须要它的包名(PackageName)和类名(ClassName)。
List<PackageInfo> packages = getPackageManager().getInstalledPackages(0); for (PackageInfo pi : packages){ InstalledAppMap.put(pi.applicationInfo.loadLabel(getPackageManager()).toString(), pi.packageName); }
第二,我们须要通过应用程序名找到向相应的包名。应用程序名靠语音包解析返回的Json获取,一般语义理解返回的结构是这种
String str = "{\"semantic\": {\"slots\": {\"name\": \"计算器\"" +
"}},\"rc\": 0,\"operation\": \"LAUNCH\",\"service\": \"app\","+
"\"text\": \"打开计算器\"}";
\"就是Java中String内容中的转义引號,你懂得。然后我写了一个方法专门依据SlotItem获取SlotValue,比較简单就不贴了,非常easy得到应用名为”计算器“。
第三步就是通过包名获得类名,这里用到了ResolveInfo类。
String AppName = Utils.GetValueGivenSlot(tmpString, "name"); if (AppName.equals("")) Log.e(Const.LAUNCHAPP_TAG,"App name can not be recongnized"); Intent Newintent = new Intent(); Intent resolveIntent = new Intent(Intent.ACTION_MAIN,null); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); String packageName = InstalledAppMap.get(AppName); resolveIntent.setPackage(packageName); List<ResolveInfo> apps = getPackageManager().queryIntentActivities(resolveIntent, 0); ResolveInfo ri = apps.iterator().next(); if (ri!=null){ String className = ri.activityInfo.name; Newintent.setComponent(new ComponentName(packageName,className)); } startActivity(Newintent);
Utils.GetValueGivenSlot(tmpString, "name")//这是我自己写的方法转载请注明出处,谢谢咯!
以上是关于语音从零之五用科大讯飞语音包实现语音打开已安装应用程序的主要内容,如果未能解决你的问题,请参考以下文章