Android 视频终端语音控制、按键模拟

        终端语音控制的实现,主要的工作在于语音识别和语义的识别,而这部分的工作通常借助于现有的语音识别方案提供商,如科大讯飞、车音等。通过与这类语音识别商的合作,对智能终端体系的语音控制就可以指日可待了,只需要实现应用层面的适配对接,实现视频类终端的语音控制体系,通常主要考虑以下几个层面:
1、模拟按键
如确定、返回、主页、菜单以及其他按键控制等。
2、系统设置
如音量控制、画面调节等,音量控制如音量加、音量减、静音、取消静音。
3、应用调度
搜索、电影、电视、应用商店产品呼出等。
4、场景控制
当前场景内的各类可视交互元素跳转(全程语音交互),例如:
(1)对视频搜索结果之后的控制
(2)对视频播放环节的控制,如暂停、停止、返回、重新播放、下一集、快进、快退等。甚至对直播节目进行中文、数字频道切换
(3)其他的特色类服务控制。

相应的顶层、部分一二级用例场景如下图所示:



语音控制的基本过程,可主要参见如下的语音搜索类控制的交互过程:



对于按键的模拟,主要通过以下方法来实现:

注意,按键的模拟需要拥有root权限,所以通常会将以下处理封装为Android系统层服务进行调用(需做系统签名),相关权限配置:

<uses-permission android:name="android.permission.INJECT_EVENTS"/>

// 4.2.2之前适用
public class KeySimulate {

	/* The WindowManager capable of injecting keyStrokes. */
	final IWindowManager windowManager = IWindowManager.Stub
			.asInterface(ServiceManager.getService("window"));

	/**
	 * Wrapper-function taking a KeyCode. A complete KeyStroke is DOWN and UP
	 * Action on a key!
	 */
	public void simulateKeystroke(int KeyCode) {
		VoiceMgr.d("simulate keyCode:" + KeyCode);
		doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyCode));
		doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyCode));
	}

	/** This function actually handles the KeyStroke-Injection. */
	public void doInjectKeyEvent(KeyEvent kEvent) {
		try {
			/* Inject the KeyEvent to the Window-Manager. */
			windowManager.injectKeyEvent(kEvent, false);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
}


// 4.2.2之后适用
public class KeySimulateExt {
	public void simulateKeystroke(final int KeyCode) {
		VoiceMgr.d("simulate keyCode:" + KeyCode);

		Thread sendKeyEvent = new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(100); // TouchEvent
					long now = SystemClock.uptimeMillis();
					KeyEvent down = new KeyEvent(now, now,
							KeyEvent.ACTION_DOWN, KeyCode, 0);
					KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP,
							KeyCode, 0);

					InputManager.getInstance().injectInputEvent(down,
							InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
					InputManager.getInstance().injectInputEvent(up,
							InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};

		sendKeyEvent.start();
	}

	/** This function actually handles the KeyStroke-Injection. */
	public void doInjectKeyEvent(KeyEvent kEvent) {
		try {
			InputManager.getInstance().injectInputEvent(kEvent,
					InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


对于语音消息的收集处理,可以建立语音消息总线进行分发处理,相关设计类图如下:

 

 

相关代码示例:点击下载

        <receiver android:name="com.voice.VoiceReceiver" >
            <intent-filter>
                <action android:name="com.xxx.xiri.VOD" />
                <action android:name="com.xxx.xiri.TV" />
                <action android:name="com.xxx.xiri.KEY" />
                <action android:name="com.xxx.xiri.VOLUME" />
                <action android:name="com.xxx.xiri.PLAYER" />
                <action android:name="com.action.RECEIVE_XMPP" />
                <action android:name="xxx.action.msgbus" />
            </intent-filter>
        </receiver>



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/webwalker/article/details/8064343
个人分类: Android
上一篇【Python】之基础介绍
下一篇MFS过程指导
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭