语音识别工具部署方法、装置、计算机设备及存储介质与流程

文档序号:16684247发布日期:2019-01-19 00:47阅读:384来源:国知局
语音识别工具部署方法、装置、计算机设备及存储介质与流程

本发明涉及语音识别技术领域,尤其涉及一种语音识别工具部署方法、装置、计算机设备及存储介质。



背景技术:

kaldi是一种强大的语音识别工具,目前,很多企业和研发中心均采用kaldi进行语音识别的研究和应用。但是,由于kaldi的使用对系统环境的要求较多,在搭建kaldi的语音识别环境时,需要安装众多第三方插件和工具,比如cuda(computeunifieddevicearchitecture)、gst(gstreamer,用来构建流媒体应用的开源多媒体框架)、libatlas(automatictunedlinearalgebrasoftware)等,安装过程繁琐且耗时巨大,不利于kaldi在不同终端上的部署和应用。



技术实现要素:

基于此,有必要针对上述技术问题,提供一种可以提高语音识别工具部署效率的语音识别工具部署方法、装置、计算机设备及存储介质。

一种语音识别工具部署方法,包括:

在第一终端的应用容器引擎上安装操作系统镜像;

在所述操作系统镜像上安装语音识别工具以及语音识别工具所需的依赖包,得到工具环境镜像;

通过所述第一终端的应用容器引擎导出工具环境镜像至第二终端的应用容器引擎上,以使所述第二终端的应用容器引擎运行所述工具环境镜像并工提供语音识别服务。

一种语音识别工具部署装置,包括:

系统镜像安装模块,用于在第一终端的应用容器引擎上安装操作系统镜像;

语音识别工具安装模块,用于在所述操作系统镜像上安装语音识别工具以及语音识别工具所需的依赖包,得到工具环境镜像;

环境镜像导出模块,用于通过所述第一终端的应用容器引擎导出工具环境镜像至第二终端的应用容器引擎上,以使所述第二终端的应用容器引擎运行所述工具环境镜像并提供语音识别服务。

一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述语音识别工具部署方法的步骤。

一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述语音识别工具部署方法的步骤。

上述语音识别工具部署方法、装置、计算机设备及存储介质,首先,在第一终端的应用容器引擎上安装操作系统镜像;然后,在所述操作系统镜像上安装语音识别工具以及语音识别工具所需的依赖包,得到工具环境镜像;接着,通过所述第一终端的应用容器引擎导出工具环境镜像至第二终端的应用容器引擎上,以使所述第二终端的应用容器引擎运行所述工具环境镜像并工提供语音识别服务。可见,本发明通过应用容器引擎制作语音识别工具的工具环境镜像,由于该工具环境镜像中已安装好语音识别工具以及语音识别工具所需的依赖包,从而将所述工具环境镜像导入至第二终端的应用容器引擎上以后无需再安装语音识别工具或语音识别工具所需的依赖包,可以直接运行该工具环境镜像来提供语音识别服务,避免了语音识别工具在不同终端上部署时繁琐的安装过程,大大提高了诸如kaldi这样的语音识别工具的部署效率,有利于语音识别工具的推广应用。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明一实施例中语音识别工具部署方法的一应用环境示意图;

图2是本发明一实施例中语音识别工具部署方法的一流程图;

图3是本发明一实施例中语音识别工具部署方法步骤s102在一个应用场景下的流程图;

图4是本发明一实施例中语音识别工具部署方法步骤s204在一个应用场景下的流程图;

图5是本发明一实施例中语音识别工具部署方法在一个应用场景下检测kaldi重装次数的流程图;

图6是本发明一实施例中语音识别工具部署装置的结构示意图;

图7是本发明一实施例中计算机设备的一示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本申请提供的语音识别工具部署方法,可应用在如图1的应用环境中,其中,第一终端和第二终端通过网络与服务器进行通信。其中,第一终端和第二终端可以包括但不限于各种个人计算机、笔记本电脑、智能手机、平板电脑和/或便携式可穿戴设备。服务器可以用独立的服务器或者是多个服务器组成的服务器集群来实现。

需要说明的是,为了便于描述,本发明下述将以kaldi这一个典型的语音识别工具作为代表来详细描述该语音识别工具部署方法的具体内容,本领域技术人员应当可以理解的是,下述描述的内容不仅适用于kaldi,也同样适用于其它语音识别工具。

在一实施例中,如图2所示,提供一种语音识别工具部署方法,以该方法应用在图1中的服务器为例进行说明,包括如下步骤:

s101、在第一终端的应用容器引擎上安装操作系统镜像;

本实施例中,该应用容易引擎将以docker为例进行说明。docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后方便地将这些打包好的应用迁移至其它终端上。本发明正式利用docker的工作原理,将kaldi程序以及kaldi的依赖包打包到docker上制作kaldi环境镜像,通过迁移该kaldi环境镜像实现kaldi的快速部署和迁移。

首先,由于kaldi依赖于系统环境才能正常启动,因此,在安装kaldi和制作kaldi镜像之前,需要现在docker上安装一个操作系统镜像。这里所说的操作系统可以是ubuntu、centos、oraclelinux、windows等操作系统中的任意一种。该操作系统镜像可以通过网络下载获取得到,也可以直接从安装有该操作系统的终端上刻录得到,对此本实施例不作限定。

需要说明的是,该第一终端与下述的第二终端可以是指任意的两台不同的终端,“第一”和“第二”仅为区分两台不同终端的号码。一般来说,第一终端可以是kaldi环境镜像制作的源终端,第二终端则是需要将kaldi进行快速迁移的目标终端,因此,第一终端一般为一台即可,而第二终端可以是一台、两台甚至多台。本方案通过在一台第一终端上制作好kaldi环境镜像,可以将该kaldi环境镜像装载到多台第二终端上,实现kaldi的快速迁移和部署。

s102、在所述操作系统镜像上安装语音识别工具以及语音识别工具所需的依赖包,得到工具环境镜像;

在docker上安装好操作系统镜像后,可以在该操作系统镜像上安装kaldi以及kaldi所需的依赖包,得到kaldi环境镜像,可知,该kaldi环境镜像位于docker上,其包含了操作系统镜像的数据以及kaldi程序相关的数据(kaldi程序和依赖包),也即kaldi程序以及其所依赖的环境数据。

需要说明的是,kaldi所需的依赖包具体可以包括apt-get、libtool、tornado,等等。这些依赖包是指kaldi程序正常运行时所依赖的程序或服务支持的安装包,现有的kaldi程序在安装时同样需要安装这些依赖包才可实现kaldi的正常装载。其中,apt-get,是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统,其是用于安装kaldi所需的软件包;libtool主要的一个作用是在编译大型软件的过程中解决了库的依赖问题,本实施例中,libtool用于编译kaldi环境;tornado是一种web服务器软件的开源版本,其用于处理kaldi的解码环境。

进一步地,如图3所示,上述步骤s102具体可以包括:

s201、获取语音识别工具的安装包以及所述语音识别工具所需的依赖包;

s202、在所述第一终端的应用容器引擎上运行所述操作系统镜像以启动目标操作系统;

s203、在所述目标操作系统上安装所述语音识别工具的安装包;

s204、在成功安装所述语音识别工具的安装包之后,根据所述语音识别工具所需的依赖包的默认安装顺序依次且逐个安装所述语音识别工具所需的依赖包;

s205、在成功安装所述语音识别工具所需的依赖包之后,确定得到所述工具环境镜像。

对于步骤s201,可以理解的是,kaldi的安装包以及kaldi所需的依赖包可以通过网络下载得到,或者由工作人员预先准备。一般来说,kaldi的安装包以及依赖包会在制作kaldi环境镜像之前预先准备,本方案中,只需为第一终端准备kaldi的安装包以及依赖包即可,相比现有技术中需要为各个部署kaldi的终端均准备一套kaldi的安装包、依赖包,本方案无疑更加简便,节省成本。

对于步骤s202,可知,该第一终端的docker上安装操作系统镜像,在docker上安装操作系统镜像后,可以直接在docker上运行该操作系统镜像,相当于启动了该操作系统,即第一操作系统。

对于步骤s203,目标操作系统启动后,只需像现有kaldi的安装流程一样,将kaldi的安装包安装到该目标操作系统上即可。

对于步骤s204,在成功安装所述kaldi的安装包之后,由于kaldi所需的依赖包之间一般具有严格的安装顺序,因此,安装依赖包时也需要根据该kaldi所需的依赖包的默认安装顺序依次且逐个安装这些依赖包,从而保证依赖包的正确安装,减少安装异常的情况出现。

更进一步地,如图4所示,上述步骤s204可以具体包括:

s301、获取所述语音识别工具所需的依赖包的默认安装顺序;

s302、确定所述默认安装顺序中排序第一的依赖包为当前依赖包;

s303、制作当前的目标操作系统的一个复制镜像作为最新的系统镜像;

s304、在当前的目标操作系统上安装所述当前依赖包;

s305、判断所述当前依赖包是否安装成功,若所述当前依赖包安装失败,则执行步骤s306,若所述当前依赖包是否安装成功,则执行步骤s308;

s306、在所述第一终端的应用容器引擎上运行最新的系统镜像来重新启动目标操作系统;

s307、在重启后的所述目标操作系统上安装所述当前依赖包,返回执行步骤s305;

s308、直到所述语音识别工具所需的所有依赖包均安装成功之前,根据所述默认安装顺序确定下一个依赖包作为当前依赖包,返回执行步骤s303。

对于步骤s301,kaldi所需的依赖包之间一般具有严格的安装顺序,因此,服务器可以直接将该安装顺序预先设为所述默认安装顺序即可。

对于步骤s302,本方法中需要根据该kaldi所需的依赖包的默认安装顺序依次且逐个安装这些依赖包,因此,第一个要安装的依赖包就是该默认安装顺序中排序第一的依赖包,将其作为当前依赖包。

对于步骤s303,本方法为了避免安装错误而污染了docker上的操作系统镜像,在安装每个当前依赖包之前,先制作当前的目标操作系统的一个复制镜像作为最新的系统镜像。这样,当发现某个依赖包安装错误时,可以直接退回至安装前的操作系统状态,提升了安装kaldi所需依赖包时的稳定性。需要说明的是,本方法中每成功安装一个依赖包后,均会返回步骤s303制作一个最新的系统镜像,最新制作的系统镜像会覆盖前一个系统镜像,相当于记录下成功安装依赖包的最新的操作系统,这样当某个依赖包安装失败后,就能退回到最近一次安装成功的操作系统状态,在保证安装依赖包稳定性的同时确保了安装的效率。

对于步骤s304,在准备好当前的目标操作系统的复制镜像后,可以在当前的目标操作系统上安装所述当前依赖包。

对于步骤s305,可以理解的是,每个依赖包安装后其均带有自检的程序,会向服务器反馈安装是否成功的信息,服务器获取到该信息后即可得知当前依赖包是否安装成功。

对于步骤s306和s307,可以理解的是,若所述当前依赖包安装失败,为了避免该依赖包安装过程中给该目标操作系统带来污染(比如残留安装文件)而导致后续依赖包也安装失败,本方法通过在所述第一终端的docker上运行最新的系统镜像来重新启动目标操作系统,将目标操作系统回复到安装当前依赖包之前的状态。然后,在重启后的所述目标操作系统上安装所述当前依赖包,再反馈执行步骤s305,再次判断重启后安装当前依赖包是否成功。

对于步骤s308,可以理解的是,若所述当前依赖包安装成功,则可以根据所述默认安装顺序确定下一个依赖包作为当前依赖包,然后返回执行步骤s303继续安装其它依赖包,直到所述kaldi所需的所有依赖包均安装成功。

由上述内容可知,通过上述步骤s301-s308,本方法可以实现根据所述kaldi所需的依赖包的默认安装顺序依次且逐个安装所述kaldi所需的依赖包,在保证安装依赖包稳定性的同时也确保了安装的效率,从而间接提升服务器制作kaldi环境镜像的成功率。

对于步骤s205,在成功安装kaldi安装包以及依赖包后,一般来说,docker上已经得到了kaldi的环境镜像了,因此,可以确定得到所述kaldi环境镜像。该kaldi环境镜像中打包了运行kaldi所需的操作系统、kaldi程序以及kaldi依赖包。

考虑到该kaldi环境镜像将要提供给其它终端(比如第二终端)进行部署,因此,需要在部署之前检测目标操作系统上的kaldi是否能正常启动来确保后续kaldi部署的安全。本实施例中,可以在所述目标操作系统上启动kaldi,若启动正常,则说明该第一终端docker上的kaldi环境镜像能正常使用,从而确定得到所述kaldi环境镜像;若启动失败,则说明该第一终端docker上的kaldi环境镜像无法正常使用,自动重新安装kaldi安装包和依赖包。具体地,在确定得到所述kaldi环境镜像之前,本方法还可以包括:检测在所述目标操作系统上是否正常启动kaldi,若否,则返回执行步骤s203,若是,则执行步骤s205。

更进一步地,如图5所示,在返回执行步骤s203之前,本方法还可以包括:

s401、累计语音识别工具重装次数加1;

s402、判断所述语音识别工具重装次数是否超过预设阈值,若否,则返回执行步骤s203,若是,则执行步骤s403;

s403、反馈关于工具环境镜像制作失败的信息。

对于步骤s401,该kaldi重装次数用来统计本次制作kaldi镜像时重新安装kaldi程序以及kaldi所需的依赖包的次数。可知,每当检测到在所述目标操作系统上无法正常启动kaldi时,该kaldi重装次数累计加1。可以理解的是,该kaldi重装次数应当在适当的时候清零,可以在本方案运行结束后清零,也可以在步骤s403反馈关于kaldi环境镜像制作失败的信息后清零,具体可以根据实际使用情况确定,本实施例对此不作限定。

对于步骤s402至s403,可以理解的是,若kaldi重装次数过多,则可以认为本次kaldi环境镜像制作失败,避免过多消耗服务器的运行资源,应当告知管理员及时停止,或者服务器自动停止制作该kaldi环境镜像。因此,可以判断所述kaldi重装次数是否超过预设阈值,若所述kaldi重装次数不超过预设阈值,则可以返回执行上述步骤s203;反之,若所述kaldi重装次数超过预设阈值,则可以反馈关于kaldi环境镜像制作失败的信息,通知服务器的管理员进行检查处理。需要说明的是,该预设阈值可以在服务器上预先设定,比如设置为3,即当kaldi重装次数超过3次时,则认为本次kaldi环境镜像制作失败。

由上述内容可知,通过上述步骤s401-s403,本方法可以在kaldi重装次数过多时及时反馈,让服务器管理员第一时间得知并及时检查处理,避免过多消耗服务器的运行资源。

s103、通过所述第一终端的应用容器引擎导出工具环境镜像至第二终端的应用容器引擎上,以使所述第二终端的应用容器引擎运行所述工具环境镜像并提供语音识别服务。

本方案中,在确定得到kaldi环境镜像之后,即可通过第一终端的docker上的导出功能,将该kaldi环境镜像导出。可以理解的是,docker提供导出应用镜像的功能,这些从docker上导出的应用镜像可以完整地导入到其他终端的docker上,实现应用的快速迁移。本方案正是开创性地将docker这一特性应用到kaldi的迁移、部署上,该导出的kaldi环境镜像可以被导入至其他终端的docker上。

可以理解的是,在部署kaldi时,可以直接通过所述第一终端的docker导出kaldi环境镜像至第二终端的docker上,以使所述第二终端的docker运行所述kaldi环境镜像并提供语音识别服务。需要说明的是,这里的第二终端可以一个、两个或多个,由于kaldi环境镜像已经包含了kaldi运行所需的全部数据,因此,导入该kaldi环境镜像至第二终端的docker上后,当需要启动kaldi时,直接通过第二终端上的docker运行kaldi,即可通过docker的接口对外提供语音识别服务。可见,本方案可以实现kaldi的快速迁移和部署,尤其是当第二终端数量很多时,本方案的方法可以节省大量的时间和人力成本,使得大量的第二终端可以在短时间内装载好kaldi程序并对外提供语音识别服务。

本实施例中,通过docker制作kaldi环境镜像,由于该kaldi环境镜像中已安装好kaldi以及kaldi所需的依赖包,从而将所述kaldi环境镜像导入至第二终端的docker上以后无需再安装kaldi或kaldi所需的依赖包,可以直接运行该kaldi环境镜像来提供语音识别服务,避免了kaldi在不同终端上部署时繁琐的安装过程,大大提高了kaldi的部署效率,有利于kaldi的推广应用。

应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。

在一实施例中,提供一种语音识别工具部署装置,该语音识别工具部署装置与上述实施例中语音识别工具语音识别工具部署方法一一对应。如图6所示,该语音识别工具语音识别工具部署装置包括系统镜像安装模块601、语音识别工具安装模块602和环境镜像导出模块603。各功能模块详细说明如下:

系统镜像安装模块601,用于在第一终端的应用容器引擎上安装操作系统镜像;

语音识别工具安装模块602,用于在所述操作系统镜像上安装语音识别工具以及语音识别工具所需的依赖包,得到工具环境镜像;

环境镜像导出模块603,用于通过所述第一终端的应用容器引擎导出工具环境镜像至第二终端的应用容器引擎上,以使所述第二终端的应用容器引擎运行所述工具环境镜像并提供语音识别服务。

进一步地,所述语音识别工具安装模块可以包括:

第一获取单元,用于获取语音识别工具的安装包以及所述语音识别工具所需的依赖包;

操作系统启动单元,用于在所述第一终端的应用容器引擎上运行所述操作系统镜像以启动目标操作系统;

语音识别工具安装单元,用于在所述目标操作系统上安装所述语音识别工具的安装包;

依赖包安装单元,用于在成功安装所述语音识别工具的安装包之后,根据所述语音识别工具所需的依赖包的默认安装顺序依次且逐个安装所述语音识别工具所需的依赖包;

确定单元,用于在成功安装所述语音识别工具所需的依赖包之后,确定得到所述工具环境镜像。

进一步地,所述依赖包安装单元可以包括:

安装顺序获取子单元,用于获取所述语音识别工具所需的依赖包的默认安装顺序;

当前依赖包确定子单元,用于确定所述默认安装顺序中排序第一的依赖包为当前依赖包;

镜像复制子单元,用于制作当前的目标操作系统的一个复制镜像作为最新的系统镜像;

当前依赖包安装子单元,用于在当前的目标操作系统上安装所述当前依赖包;

判断子单元,用于判断所述当前依赖包是否安装成功;

第一处理子单元,用于若所述判断子单元的判断结果为否,则在所述第一终端的应用容器引擎上运行最新的系统镜像来重新启动目标操作系统,并在重启后的所述目标操作系统上安装所述当前依赖包,之后返回触发所述判断子单元;

第二处理子单元,用于若所述判断子单元的判断结果为是,则直到所述语音识别工具所需的所有依赖包均安装成功之前,根据所述默认安装顺序确定下一个依赖包作为当前依赖包,返回触发所述镜像复制子单元。

进一步地,所述语音识别工具安装模块还可以包括:

启动检测单元,用于检测在所述目标操作系统上是否正常启动语音识别工具;

返回触发单元,用于若所述启动检测单元检测到在所述目标操作系统上无法正常启动语音识别工具,则返回触发所述语音识别工具安装单元;

触发确定单元,用于若所述启动检测单元检测到在所述目标操作系统上正常启动语音识别工具,则返回触发所述确定单元。

进一步地,所述语音识别工具安装模块还可以包括:

次数累计单元,用于若所述启动检测单元检测到在所述目标操作系统上无法正常启动语音识别工具,累计语音识别工具重装次数加1;

次数判断单元,用于判断所述语音识别工具重装次数是否超过预设阈值;

第一触发单元,用于若所述次数判断单元的判断结果为否,则触发所述返回触发单元;

信息反馈单元,用于若所述次数判断单元的判断结果为是,则反馈关于工具环境镜像制作失败的信息。

关于语音识别工具部署装置的具体限定可以参见上文中对于语音识别工具部署方法的限定,在此不再赘述。上述语音识别工具部署装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图7所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储语音识别工具部署方法中涉及到的数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种语音识别工具部署方法。

在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述实施例中语音识别工具部署方法的步骤,例如图2所示的步骤s101至步骤s103。或者,处理器执行计算机程序时实现上述实施例中语音识别工具部署装置的各模块/单元的功能,例如图6所示模块601至模块603的功能。为避免重复,这里不再赘述。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述实施例中语音识别工具部署方法的步骤,例如图2所示的步骤s101至步骤s103。或者,计算机程序被处理器执行时实现上述实施例中语音识别工具部署装置的各模块/单元的功能,例如图6所示模块601至模块603的功能。为避免重复,这里不再赘述。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。

以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1