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

来源:互联网 发布:泰罗奥特曼act淘宝 编辑:程序博客网 时间:2024/04/27 23:01

        终端语音控制的实现,主要的工作在于语音识别和语义的识别,而这部分的工作通常借助于现有的语音识别方案提供商,如科大讯飞、车音等。通过与这类语音识别商的合作,对智能终端体系的语音控制就可以指日可待了,只需要实现应用层面的适配对接,实现视频类终端的语音控制体系,通常主要考虑以下几个层面:
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() {@Overridepublic void run() {try {Thread.sleep(100); // TouchEventlong 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>