如何保证大规模语音理解和合成的准确性和响应速度?
字节跳动智能语音方向工程负责人司徒文畅
首先分解下,先从准确性上去描述,然后再说响应速度的问题。准确性上其实识别跟合成稍微不同,识别可以分为声学模型的方案,还有语言模型的方案,声学模型主要是通过加数据做数据增强,肯定是加越多场景的数据会越好,可以让整个声学预测的准确率得到很好的提升,然后让模型深度加深,让整个模型具有更好的效果;对于语言模型,除了加数据以外,还能做一些其他方案,像一些比较关键的词的lm boosting,或者如果你专注于某些领域类的数据,也可以做一些领域domain比较小的lm bias方案,都是可以提升准确率的方法。对于合成来讲,准确率主要分成前端文本分析的准确性,以及后端建模的准确性,我觉得在合成里面更重要的是打造一种反馈的闭环,比如在前端包括一些多音字,多音词,还有停顿、边界,这本身也是业界里的难区,除了模型本身不停的加速数据去优化外,首先是有一些规则和兜底,然后线上可以实时的去消化一些新的规则,去做一些紧急的修复。在后面把整个反馈流程建立起来以后,我们随时可以收集这些badcase,再反馈到模型训练里面去,让前端的模型变得更鲁棒,更好。后端基本上也是通过不停的加数据的方式去做,因为前后端主要是采用了一个端到端的方案,主要还是去针对badcase进行分析,加一些对应的数据去做修复。
下面说下响应速度,其实这也是一个很大的话题。可以分4个部分,首先,第一部分先从后端的推理速度开始抓起,这部分是重中之重,如果这个环节比较慢,那整体的响应延迟是没办法谈起的,对于这部分我刚才的分享也提到过,其实是建自己的一个推理的框架,然后对很多模型的op进行了专门的优化,来确保能够在流式场景下有很好的性能,很低的延迟;第二部分是后端服务这块,是流量调度的一个问题,模型推理本身是计算密集型的,即使优化的再好,有时候为了保证请求的延迟能够控制的很好,单机上承受的并发还是很有限,这个场景下,中间的负载均衡其实是非常重要的,要根据后端实时的一些负载的情况来分配新的请求处理方,让整体能够达到一个比较均衡的状态,这样才不会出现部分机器可能因为负载过高而造成延迟变大的情况;第三点是说如果服务本身需要做外网访问,那在网络传输上也需要下很大的功夫,因为语音本身是一个很大数据,以一般语音识别为例,我们一般用16k的采样率,然后是2个byte一个采样点,相当于一秒里面就会有32k字节的数据,如果通过外网纯粹去传这个数据,不做任何的优化,整体的体验会比较差,这里涉及到包括像音频怎么去做编解码,中间网络传输怎么做,怎么去做一些优化等;最后一个是对于需要使用手机端来访问的场景,根据不同的场景会有不同的优化方法,最常见的是离在线融合,就是会有一个离线的兜底模型,当在线模型比较慢的时候,会用本地的模型来兜住整体的请求,让整个响应能够控制的很好。当然还有一些其他更细节的方案,我觉得这四个是对整个响应速度保证比较关键的点。