首页 > 代码库 > 【语音从零之五】用科大讯飞语音包实现语音打开已安装应用程序

【语音从零之五】用科大讯飞语音包实现语音打开已安装应用程序

本文主要介绍如何利用语音包实现口语控制打开应用程序,例如:说“打开计算器”,计算器就彭地打开了。

要完成这个功能,首先要识别出指令是“打开",然后识别出应用程序名称是”计算器“。这些工作都交给科大讯飞语音包的语义理解模块完成。

我们要做的,首先是把已安装的应用程序的名称和包名保存下来,因为启动一个应用程序需要它的包名(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,比较简单就不贴了,很容易得到应用名为”计算器“。

第三步就是通过包名获得类名,这里用到了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")//这是我自己写的方法
转载请注明出处,谢谢咯!


【语音从零之五】用科大讯飞语音包实现语音打开已安装应用程序