语音识别 trick_客户端

本发明公开一种语音识别服务器的软件设计方法,该语音识别服务器适用于局域网或者其他网络,属于人工智能、并发网络通信领域。

背景技术:

近些年来,随着自动语音识别技术(ASR)的不断完善,涌现了一些拥有较为成熟技术的公司,比如:科大讯飞、百度等。在市场的强烈需求刺激和这些公司的大力推动下,ASR已经走进了很多领域,包括移动设备、汽车、家居等C端应用和电子病历、客服等B端场景。但是,以上公司将自己的服务部署于公网,对于一些只能限定于内网工作的设备(银行、税务、医院的自助设备或者服务机器人等)无法使用,或者将公网服务直接部署于内网将增加过多的成本。因而这里提出一种针对局域网构建语音识别服务器的软件设计方法。

技术实现要素:

本发明要解决的技术问题是提供一种语音识别服务器的软件设计方法,在满足功能需求前提下,以最小的资源占用进行灵活部署,适用于局域网。

为了解决所述技术问题,本发明采用的技术方案是:一种语音识别服务器的软件设计方法,包括以下步骤:

S01)、通信模块设计,socket用来连接服务端与客户端,服务端建立socket连接并进行监听,当收到客户端的连接请求,则建立连接,然后接收消息、解析,经过处理后立即返回给客户端;

S02)、应用层设计,建立在socket上的自定义的数据协议,数据头描述数据包的信息、包含类型、长度,数据包中包含音频数据;

S03)、进程池设计,包括主进程和子进程,主进程监听socket,并在运行之初创建所有子进程,同时建立主进程与子进程之间的通道,主进程向子进程分配客户端连接,子进程接受以后利用任务池完成相应的数据处理;

S04)、任务池设计,任务池是某个子进程内的所有可以执行的任务,它保存某个客户端所有有用的信息,每当子进程检测到某个连接上有数据到来,它会去执行相应的任务;由于语音识别引擎需要占用的资源很多,包括时间和空间,因此,这里执行任务是指将接收到的数据推进对应线程里面运行的语音识别引擎,然后在回调函数里实现识别结果返回;

S05)、线程池设计,每个子进程包含一个线程池,每个线程池里面运行一个独立的语音识别引擎,任务池执行任务时,将接收到的数据推进到相应线程池里面运行的语音识别引擎,然后在回调函数里实现识别结果返回。

进一步的,进程池、任务池、线程池的大小是与语音识别引擎占用的资源和服务器硬件配置相匹配的,程序运行期间固定。

进一步的,服务端与客户端之间的socket为全双工通信,两个线程可以同时对服务端和客户端进行操作,一个接受数据,另一个发送数据。

为了节省带宽,应用层的数据包采用压缩格式,同时带有验证身份的客户端的唯一标识。

由于线程和引擎的创建和销毁占用很多时间,因而线程池在子进程开始运行时即创建完毕,然后等待子进程的主线程利用任务池给相应的线程推送数据。

进一步的,主进程利用epoll机制复用IO,将监听socket、信号加入epoll核心事件表。

进一步的,主进程的消息处理过程为:A、主进程收到监听socket的消息时,说明有客户端请求连接,它计算当前是否还有子进程可以接收,如果有,则通过robin算法选择一个子进程并通知它,否则,通知客户端服务器已经达到负载;B、主进程接收到关闭信号时,将向所有子进程发出停止信号,结束所有子进程;C、主进程接收到子进程结束信号时,对子进程退出码进行分析,如果为异常退出,则重新创建该序号对应的子进程,如果是正常退出,则计算当前正在运行的进程个数,当全部退出时,主进程退出。

进一步的,子进程利用epoll机制复用IO,将与客户端连接、主进程之间的通道、信号加入epoll核心事件表。

进一步的,子进程的消息处理过程为:A、当与主进程之间的通道接收到数据时,从监听socket接受新的连接,将其加入核心事件表进行监听;B、当客户端连接接收到数据时,解析数据后,选择一个空闲的任务,将数据发送到与之对应的线程进行语音识别,该线程将识别结果返回给客户端;C、当接收到停止信号时,进程将立即退出消息循环,停止工作;D、当接收到定时信号时,子进程将分析整个任务池状态,如果发现有异常事件发生,首先将该进程置为异常,然后等待其他线程处理完毕,最终退出进程,主进程检测到异常退出的子进程,将重新创建新的子进程加入进程池,如果发现某个任务一段时间内没有上传数据,则释放该客户端连接占用的资源然后关闭该连接。

本发明的有益效果:本发明提出一种针对局域网基于socket网络通信的语音识别服务器软件设计方法,采用进程池+任务池+线程池构建socket服务器,设计并优化了系统架构,从而达到可以支撑一定的并发(适配服务器硬件)、可靠地服务客户端、占用较少的资源。这种设计方法特点就是能够在满足功能需求前提下,以最小的资源占用进行灵活部署。本发明中提出的设计方法在局域网中搭建的语音识别服务器,在给定的并发量下,识别效果流畅,性能稳定可靠,占用资源有限。

附图说明

图1为本软件设计方法的框架图;

图2为主进程消息处理过程的流程图;

图3为子进程消息处理过程的流程图。

具体实施方式

下面结合附图和具体实施例对本发明作进一步的说明。

实施例1

根据局域网中语音识别服务器的特点,本实施例公开了一种上述设计方法的具体实现方式,能够高效可靠经济的完成功能需求,其是在Linux服务器上的一种实施方式,包括以下步骤:

1)主进程加载配置文件,主要包括该服务器的性能调节参数、网络配置等。

2)创建并绑定监听socket,服务端与客户端之间的socket为全双工通信,两个线程可以同时对服务端和客户端进行操作,一个接受数据,另一个发送数据。

3)通过fork创建进程池,建立主进程与子进程之间的通道,主进程与子进程之间共享监听socket,这样可以达到主进程监听与分发,子进程进行处理。

4)利用epoll机制复用IO,主进程可以将监听socket、信号加入epoll核心事件表,这样就实现了统一信号源。

5)如图2所示,主进程的消息处理过程如下:

(a)每当进程收到监听socket的消息,说明有客户端请求连接。主进程计算进程池当前的空闲情况,如果没有空闲进程,说明目前服务器已经满负荷,将给客户端发送服务端超负荷消息;如果存在空闲进程,主进程将利用robin算法,在空闲的进程中选择一个子进程用于处理客户端请求,发送消息给该子进程。

(b)当接收到关闭信号时,将向所有子进程发出停止信号,结束所有子进程。

(c)当接收到子进程结束信号时,对子进程退出码进行分析,如果为异常退出,则重新创建该序号对应的子进程,这样可以保证,整个语音识别服务器不会因为一个小的错误而出现宕机的现象,增加了服务器的稳定性,能够更加可靠的为终端提供语音识别服务。如果是正常退出,则计算当前正在运行的进程个数,当全部退出时,主进程退出。

6)子进程利用epoll机制复用IO,可以将与客户端连接、主进程之间的通道、各种信号等加入epoll核心事件表,从而实现统一事件源。

7)创建并初始化任务池、线程池,启动语音识别服务器引擎。

8)如图3所示,子进程消息处理过程如下:

(a)当与主进程之间的通道接收到数据时,表明有新的客户端请求连接,此时从监听socket接受新的连接,将其加入核心事件表进行监听。

(b)当客户端连接接收到数据时,解析数据后,选择一个空闲的任务,将数据发送到与之对应的线程进行语音识别,该线程会负责将识别结果返回给客户端,包括临时结果、最终结果、各种错误信息等。

(c)当接收到停止信号时,进程将立即退出消息循环,停止工作。

(d)当接收到定时信号时,子进程将分析整个任务池状态,如果发现有异常事件发生,首先将该进程置为异常,然后等待其他线程处理完毕,最终退出进程。父进程检测到异常退出的子进程,将重新创建新的子进程加入进程池,从而保证服务的稳定性。如果发现某个任务一段时间内没有上传数据,则释放该客户端连接占用的资源(语音识别服务引擎、任务中的相关资源),然后关闭该连接。

如图1所示,为本实施例所述语音识别服务器的软件设计方法的框架图,包括通信模块、应用层、进程池、任务池、线程池,设计时先完成所述模块的设计,然后定义它们在处于客户端的请求连接、数据时的作用,通信模块基于socket网络通信,进程池、任务池、线程池的大小是与语音识别引擎占用的资源和服务器硬件配置相匹配的,程序运行期间固定。进程池的规模是固定的,不会超过指定的进程数目。这个数目是根据服务器硬件和局域网中同时在线终端数量决定的。线程池的规模也是固定的,不是动态创建与销毁。在局域网环境中同时在线终端设备数量是有限的、可以预测的。这样,同时保证了效率和功能。

本实施例所述语音识别服务的软件设计方法可以根据服务器硬件配置灵活的部署,占用最小资源的同时满足局域网环境下功能的需求。

以上描述的仅是本发明的基本原理和优选实施例,本领域技术人员根据本发明做出的改进和替换,属于本发明的保护范围。