本发明涉及语音交互技术领域,特别涉及一种语音交互方法、存储介质及终端设备。
背景技术:
目前的语音进化系统在启动语音交互时,语音交互应用程序以广播下行的方式通知应用,以告知应用开始提交应用界面和应用界面中所显示的信息,这使得需要响应语音的应用均需要与语音应用程序进行对接适配,使得语音程序工作量大,并且可移植性和可维护性较差。为了解决这个问题,中国专利cn106098061a《一种基于安卓系统的语音交互方法和装置》中提出了通过预先修改安卓系统中的activity组件,将语音包广播注册到所述activity组件中,从而使得系统中依附在activity组件上的应用程序自动接收到语音控制指令对应的广播信息,根据所述广播信息查找对应的控件,调用相应的函数响应所述语音控制指令。
但是,所述方法仅能应用于系统预装的应用程序,而对应终端设备装载的第三方应用程序,第三方应用程序在开发时并未是基于修改后的activity组件对应的系统或jar包。这使得第三方应用程序应需要与语音应用程序进行对接适配,造成语音交互系统的可移植性和可维护性较差。
技术实现要素:
鉴于现有技术的不足,本发明旨在提供一种语音交互方法、存储介质及终端设备。
本发明所采用的技术方案如下:
一种语音交互方法,其包括:
预先通过反编译方式在应用程序的各界面启动函数中注册语音包接收广播;
接收语音控制指令,根据所述语音控制指令对应的指令信息在所述应用程序的当前界面中查找所述语音控制指令对应的控件;
调用所述控件对应的响应函数,以响应所述语音控制指令。
所述语音交互方法,其中,所述预先通过反编译方式在应用程序的各界面启动函数中注册语音包接收广播具体包括:
对于终端设备装载的各应用程序,获取所述应用程序的各界面的界面名称;
对所述应用程序进行反编译,并根据各界面名称确定各界面的界面启动函数,并在各界面启动函数中动态注册语音包接收广播。
所述语音交互方法,其中,所述对于终端设备装载的各应用程序,获取所述应用程序的各界面的界面名称具体包括:
对于终端设备装载的各应用程序,解析所述应用程序的安装包以获取所述应用程序的配置文件;
根据所述配置文件确定所述应用程序包含的各界面的界面名称。
所述语音交互方法,其中,所述对所述应用程序进行反编译,并根据各界面名称确定各界面的界面启动函数,并在各界面启动函数中动态注册语音包接收广播具体包括:
对所述应用程序进行反编译,并获取反编译得到的smali文件;
在所述smali文件中查找各界面名称对应的包含界面启动函数的代码文件,并将语音包接收广播注册于所述界面启动函数内。
所述语音交互方法,其中,所述对所述应用程序进行反编译,并根据各界面名称确定各界面的界面启动函数,并在各界面启动函数中动态注册语音包接收广播还包括:
根据各界面名称确定各界面的界面退出函数,并在各界面退出函数中注册语音包销毁广播。
所述语音交互方法,其中,所述根据各界面名称确定各界面的界面退出函数,并在各界面退出函数中注册语音包销毁广播具体包括:
获取反编译得到的smali文件,并在所述smali文件中查找各界面的代码文件;
在查找到的各界面的代码文件中查找各界面的界面退出函数;
若查找到界面退出函数,则在所述界面退出函数中注册语音包销毁广播;
若未查找到界面退出函数,则在代码文件中创建界面退出函数,并在建立得到的界面退出函数中注册语音包销毁广播。
所述语音交互方法,其中,所述预先通过反编译方式在应用程序的各界面启动函数中注册语音包接收广播还包括:
重构所述应用程序,以使得所述应用程序的各界面启动函数中注册有语音包接收广播。
所述语音交互方法,其中,所述接收语音控制指令,根据所述语音控制指令对应的指令信息在所述应用程序的当前界面中查找所述语音控制指令对应的控件具体包括:
接收语音控制指令,并识别所述语音控制指令对应的指令信息;
遍历当前界面包含的每一节点,并将每一节点包含的节点指令与所述指令信息进行匹配;
当遍历到匹配成功的节点时,根据所述节点确定所述语音控制指令对应的控件。
一种计算机可读存储介质,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如上任一所述的语音交互方法中的步骤。
一种终端设备,其包括:处理器、存储器及通信总线;所述存储器上存储有可被所述处理器执行的计算机可读程序;
所述通信总线实现处理器和存储器之间的连接通信;
所述处理器执行所述计算机可读程序时实现如上任一所述的语音交互方法中的步骤。
有益效果:与现有技术相比,本发明提供了一种语音交互方法、存储介质及终端设备,所述方法包括:预先通过反编译方式在应用程序的各界面启动函数中注册语音包接收广播;接收语音控制指令,根据所述语音控制指令对应的指令信息在所述应用程序的当前界面中查找所述语音控制指令对应的控件;调用所述控件对应的响应函数,以响应所述语音控制指令。本申请通过对应用程序进行反编译而将语音包接收广播注册到界面启动函数中,这样当应用程序启动是便会启动所述语音包接收广播以接收语音控制指令,从而避免了应用程序与语音应用程序的对接,提高了语音交互的响应速度。
附图说明
图1为本发明提供的语音交互方法的一个实施例的流程图。
图2为本发明提供的语音交互方法的一个实施例中步骤s10的流程图。
图3为本发明提供的语音交互方法的一个实施例中步骤s12的流程图。
图4为本发明提供的语音交互方法的一个实施例中步骤s20的流程图。
图5为本发明提供的一种终端设备的一个实施例的结构原理图。
具体实施方式
本发明提供一种语音交互方法、存储介质及终端设备,为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
下面结合附图,通过对实施例的描述,对发明内容作进一步说明。
本实施例提供了一种语音交互方法,如图1所示,所述方法包括:
s10、预先通过反编译方式在应用程序的各界面启动函数中注册语音包接收广播。
具体地,所述界面启动函数为配置于应用程序中,并且应用程序的每个界面在启动时均会触发其对应的界面函数。也就是说,应用程序的每个界面对应一个界面函数,并且当界面启动时或触发所述界面函数。从而在界面启动函数中动态注册语音包广播,这样当界面启动时便注册语音包的广播,从而使得所述界面可以接收语音控制指令。此外,在安卓系统中,应用程序的每个界面均会继承安卓原生中的activity,并且从activity的生命周期来看,每个界面启动首先触发界面函数。其中,所述界面函数可以为oncreate函数,在反编译得到的smali代码中,所述界面启动函数的代码可以为:
#virutalmethods
.methodprotectedoncreate(landroid/os/bundle;)v
其中,#virutalmethods是方法声明指令,后面引入的.methodprotectedoncreate(landroid/os/bundle;)v表示oncreate函数。
进一步,在本发明的一个实施例中,如图2所示,所述预先通过反编译方式在应用程序的各界面启动函数中注册语音包接收广播具体包括:
s11、对于终端设备装载的各应用程序,获取所述应用程序的各界面的界面名称;
s12、对所述应用程序进行反编译,并根据各界面名称确定各界面的界面启动函数,并在各界面启动函数中动态注册语音包接收广播。
具体地,所述界面名称为应用程序各界面的界面唯一标识,根据所述界面名称可以应用程序的一个界面,所述界面名称可以在解析应用程序安装包时,在应用程序的配置文件查找到,其中,所述界面名称为配置文件中<activity>节点的标签值。也就是说,对于终端设备装载的各应用程序会解析应用程序的安装包,并获取所述应用成员中的配置文件androidmanifest.xml,并且当解析到应用中的配置文件androidmanifest.xml中<activity>节点时,获取其android:name标签值并保存,其中,android:name标签值为各界面的界面名称。相应的,所述对于终端设备装载的各应用程序,获取所述应用程序的各界面的界面名称具体包括:
对于终端设备装载的各应用程序,解析所述应用程序的安装包以获取所述应用程序的配置文件;
根据所述配置文件确定所述应用程序包含的各界面的界面名称。
具体地,所述根据配置文件确定应用程序包含的各界面的界面名称是在苏搜配置文件中查找各界面的界面名称。所述配置文件中各界面的界面名称可以采用相同的格式存储,例如,android:name的形式,其中,android:name的标签值为界面名称。也就是说,提取配置文件中所有的android:name的标签值,即获取到所述应用程序包含的所有界面的界面名称。
进一步,所述反编译是在解析应用程序安装包是通过反编译工具进行,其中,所述反编译工具可以为apktool工具等。相应的,如图3所示,所述对所述应用程序进行反编译,并根据各界面名称确定各界面的界面启动函数,并在各界面启动函数中动态注册语音包接收广播具体包括:
s121、对所述应用程序进行反编译,并获取反编译得到的smali文件;
s122、在所述smali文件中查找各界面名称对应的包含界面启动函数的代码文件,并将语音包接收广播注册于所述界面启动函数内。
具体地,当对应用程序进行反编译时,会在反编译工程目录下生成一个smali文件夹,所述smali文件中里面存放着所有反编译出的smali文件,并且所有的smali文件会根据程序包的层次结构生成相应的目录,程序中所有的类都会在相应的目录下生成独立的smali文件。例如,假设一个应用界面名称是com.sunxz.test.mainactivlty,就会在smali目录下依次生成com\sunxz\test\目录结构,然后在这个目录下生成mainactivlty.smali文件。
进一步,在所述smali文件夹中,可以查找与在配置文件中获取到界面名称相同的smali代码文件,继续以上面的mainactivlty.smali为例,内容如下:
.classpubliclcom/sunxz/test/mainactivlty;
.superlandroid/app/activlty;
.source"mainactivlty.java"
#virutalmethods
.methodprotectedoncreate(landroid/os/bundle;)v
.locals3
.parameter"savedinstancestate".prologue
.line14
invoke-super{p0,p1},landroid/app/activity;->oncreate(landroid/os/bundle;)v
.line15
const/high16v2,0x7f03
invoke-virtual{p0,v2},lcom/sunxz/test/mainactivlty;->setcontentview(i)v
其中,第一行".class"指令指定了当前类的类名,第二行".super"指令指定了当前类的父类,第三行".source"指令指定了当前类的源文件名。#virutalmethods是方法声明指令,parameter是参数指令,prologue是代码起始指令,invoke-virtual是方法调用指令。
进一步,为了避免应用程序退出前台运行时,应用程序仍继续接收语音控制指令,在所述应用程序的各界面的界面退出函数中注册语音包注销广播。相应的,所述对所述应用程序进行反编译,并根据各界面名称确定各界面的界面启动函数,并在各界面启动函数中动态注册语音包接收广播还包括:
根据各界面名称确定各界面的界面退出函数,并在各界面退出函数中注册语音包销毁广播。
具体地,所述界面退出函数存储于应用界面对应的smali代码文件,也就是说,在应用程序各界面对应的smali代码文件中查找界面退出函数,并在所述界面退出函数中动态销毁注册的语音包广播。其中,当所应用程序包含多个界面时,依次对各界面对应的smali代码文件进行修改,即当一个界面对应的smali代码文件的界面启动函数和界面退出函数注册完成后,在获取下一个界面名称对应的smali代码文件,重复界面启动函数和界面退出函数的注册,直至应用程序的所有界面均完成配置。
此外,应用程序的各界面对应的smali代码文件中可以不携带界面退出函数,此时,需要在smali代码文件增设界面退出函数,并在所述界面退出函数中注册语音包销毁广播。相应的,所述根据各界面名称确定各界面的界面退出函数,并在各界面退出函数中注册语音包销毁广播具体包括:
获取反编译得到的smali文件,并在所述smali文件中查找各界面的代码文件;
在查找到的各界面的代码文件中查找各界面的界面退出函数;
若查找到界面退出函数,则在所述界面退出函数中注册语音包销毁广播;
若未查找到界面退出函数,则在代码文件中创建界面退出函数,并在建立得到的界面退出函数中注册语音包销毁广播。
具体地,所述代码文件为界面的smali代码文件,所述代码文件中存储有界面的界面启动函数和界面退出函数。也就是说,在所述界面的smali代码文件中查找界面退出函数,如果未查找到界面退出函数,则在smali代码文件中添加界面退出函数,同时在界面退出函数中动态销毁注册的语音包广播。
进一步,在对应用程序反编译并在界面启动函数内注册语音包广播后,需要对所述应用程序进行重构。相应的,所述预先通过反编译方式在应用程序的各界面启动函数中注册语音包接收广播还包括:重构所述应用程序,以使得所述应用程序的各界面启动函数中注册有语音包接收广播。其中,所述重构过程是采用反编译得到的安装包重新安装所述应用程序。
此外,为了保证终端设备中的各应用程序均进行反编译,终端设备监听其自身是否安装方应用程序,当监听到安装应用程序时,可以对安装的应用程序进行反编译,并在反编译得到的各界面的smali代码文件中的界面启动函数中注册语音包接收广播,在界面退出函数中注册语音包销毁广播,以使得终端设备装载的所有应用程序均不需要与语音应用程序对接,即可以接收语音控制指令。当然,所述终端设备中的应用程序可以是预装配程序,也可以是第三应用程序,对于所有第三方应用程序均采用反编译的方式注册语音包广播,对于预装配应用程序,可以采用反编译的方式注册语音包广播,也可以采用预先修改安卓系统中的activity组件,将语音包广播注册到所述activity组件的方式。
s20、接收语音控制指令,根据所述语音控制指令对应的指令信息在所述应用程序的当前界面中查找所述语音控制指令对应的控件。
具体地,所述语音控制指令可以是终端设备通过拾音器接收的,也可以是与所述终端设备相连接的外部设备发送的。所述语音控制指令携带指令信息,当接收到语音控制指令时需要对所述语音控制指令进行识别,以得到其携带指令信息。其中,语音控制指令识别方法可以采用现有的语音识别方法,这里就不再赘述。
进一步,当获取到所述指令信息后,在应用程序的显示界面,这里记为当前界面中查找所述指令信息,并在查找到携带所述指令信息的控件,以通过查找到的控件响应。相应的,如图4所示,所述接收语音控制指令,根据所述语音控制指令对应的指令信息在所述应用程序的当前界面中查找所述语音控制指令对应的控件具体包括:
s21、接收语音控制指令,并识别所述语音控制指令对应的指令信息;
s22、遍历当前界面包含的每一节点,并将每一节点包含的节点指令与所述指令信息进行匹配;
s23、当遍历到匹配成功的节点时,根据所述节点确定所述语音控制指令对应的控件。
具体地,应用程序通过注册的语音包接收语音控制指令,并得到语音控制指令所对应的指令信息,继承accessibilityservice的service,并通过accessibilityservice的service发送通知,通过所述通知触发onaccessibilityevent回调函数,通过发onaccessibilityevent回调函数遍历当前界面中的每一个节点,并判断各节点是否携带文字,当携带文字时,将所述节点指令与指令信息进行匹配;若匹配成功则触发所述节点对应的控件。当然,当未存在文字或者匹配不成功时,检测是否遍历当前界面中的所有节点,如果遍历所有节点,则反馈语音控制指令无法响应,如图未遍历所有节点,则重复上述过程直至遍历所有节点。
s30、调用所述控件对应的响应函数,以响应所述语音控制指令。
具体地,所述调用所述控件对应的响应函数可以是获取控件对应的文字节点的所在位置,并根据所述位置生成触摸事件,以触发所述控件对应的响应函数,通过所述响应函数来响应所述语音控制指令。
基于上述语音交互方法,本发明还提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如上任一所述的语音交互方法中的步骤。
基于上述语音交互方法,本发明还提供了一种终端设备,如图5所示,其包括至少一个处理器(processor)20;显示屏21;以及存储器(memory)22,还可以包括通信接口(communicationsinterface)23和总线24。其中,处理器20、显示屏21、存储器22和通信接口23可以通过总线24完成相互间的通信。显示屏21设置为显示初始设置模式中预设的用户引导界面。通信接口23可以传输信息。处理器20可以调用存储器22中的逻辑指令,以执行上述实施例中的方法。
此外,上述的存储器22中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。
存储器22作为一种计算机可读存储介质,可设置为存储软件程序、计算机可执行程序,如本公开实施例中的方法对应的程序指令或模块。处理器20通过运行存储在存储器22中的软件程序、指令或模块,从而执行功能应用以及数据处理,即实现上述实施例中的方法。
存储器22可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端设备的使用所创建的数据等。此外,存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器。例如,u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等多种可以存储程序代码的介质,也可以是暂态存储介质。
此外,上述存储介质以及终端设备中的多条指令处理器加载并执行的具体过程在上述方法中已经详细说明,在这里就不再一一陈述。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。