现状
人与之间通过声音来直接沟通交流,人与机器之间的交流也渐渐脱离了传统的沟通模式,进入了语音交流时代。语音交流更是拉近了人和机器之间情感,现在的语音技术就是为了使机器更好的识别人声、并合成接近人类的声音以达到更好的交流。
目前国内研究语音相关的团队主要包括科研院所、语音技术公司以及互联网公司三部分:
- 科研院所主要包括高校和科学院,比如科学院里有声学所、自动化所,高校里面研究比较多的清华、北大、西工大、科大、上海交大等,这些都是在语音圈里占有较高位置的老牌队伍。
- 语音技术公司包括我们比较熟悉的科大讯飞、云知声、思必驰、极限元等。
- 互联网公司包括BAT、搜狗等拥有强大的语音技术团队来支撑着其本身的很多业务。
测试方案
接触语音识别、语音合成项目的测试将近一年,认识还非常浅薄,大家有更好的想法或者技术方案可以多多沟通交流。下面分别从语音识别、语音合成谈谈一些我在项目中用的测试方案。
语音识别
语音识别的整体流程如上,站在测试角度思考,测试最简单的切入点就是最终生成文本内容的校验上。
目前的测试方案是事先标注一批语音的文本内容,与识别出的文本内容做对比,获取识别的准确率。但是这种准确率统计脱离了实际使用场景,比如车载模式下的噪音、与麦克风的距离都会影响识别准确率。
另外,从上图流程可以看出,识别准确率还会受声学模型、解码器的影响。语音信号经过特征提取得到声学特征,再通过声学特征训练得到声学模型,声学模型结合语言模型以及发音辞典构建声码器以后进行解码来输出文本,所以声学模型的训练结果一定是正确的吗?这也是测试的一个切入点。
语音合成
测试考虑从以下两方面入手:
- 服务端的文本分析
- 合成效果的评测
文本分析
语音合成的测试前期工作主要放在前端文本分析上,用python中的Snownlp及pypinyin将文本进行分分词及注音后输出注音及音调,服务端的前端模块输出注音及音调,将脚本输出的结果和服务端输出的结果做对比。这种方式可以对比出音调、多音字的差异。
from pypinyin import pinyin #pinyin将汉字转为拼音。可以用于汉字注音、排序、检索
from snownlp import normal #snownlp 转换成拼音,繁体转简体,提取文本关键词
from snownlp import seg
#分词
text_normal = normal.zh2hans(text_path)
sent_normal = normal.get_sentences(text_normal)
words = seg.seg(sent_normal.decode('utf-8'))
#匹配多音字
word = SnowNLP(words_list)
word = word.sim(sim_word.decode('utf-8'))
#注音
txt_zhuyin = pinyin(word, style=pypinyin.TONE3)
合成效果评测
成功效果评测的方式也有两种:一种方式众包评测,这种方式是靠人的主管感受去评测合成的语音是否流畅、自然、发音正确等,这种方式的结果更有说服力,但是人力成本较大。
另一种方式是对比语音的波形图,python中的wave模块支持将语音转为波形图,python中还有其他模块如eyeD3,PyAudio,Audacity等等可以处理语音暂且不介绍这些模块。先介绍wave中的一些方法:
- getparams()
获取wav文件的参数(以tuple形式输出),依次为(声道数,采样精度,采样率,帧数等)
- readframes()
得到每一帧的声音数据,返回的值是二进制数据,在python中用字符串表示二进制数据。
步骤如下:
- 通过wav库获得night.wav的头文件中的信息,如采样率/声道数等等.
- 提取出DATA区域的信息,用numpy将string格式数据转化为数组
- 通过判定声道数将DATA区域数据进行处理(对数组矩阵进行转换)
- 得到每个绘制点的时间(x坐标)
- 用matplotlib库提供的方法绘制出波形图
对波形的信息进行对比分析,可以从中得到很多有效信息,但是这些信息是否能有效过滤掉不同的口音、情绪、呼吸等的差异,去提取自己想要的信息如音调差异、错别字的差异还在探索中。