淺談語音測試方案(一)
現狀
人與之間通過聲音來直接溝通交流,人與機器之間的交流也漸漸脫離了傳統的溝通模式,進入了語音交流時代。語音交流更是拉近了人和機器之間情感,現在的語音技術就是為了使機器更好的識別人聲、並合成接近人類的聲音以達到更好的交流。
目前國內研究語音相關的團隊主要包括科研院所、語音技術公司以及互聯網公司三部分:
科研院所主要包括高校和科學院,比如科學院裏有聲學所、自動化所,高校裏麵研究比較多的清華、北大、西工大、科大、上海交大等,這些都是在語音圈裏占有較高位置的老牌隊伍。
語音技術公司包括我們比較熟悉的科大訊飛、雲知聲、思必馳、極限元等。
互聯網公司包括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庫提供的方法繪製出波形圖
對波形的信息進行對比分析,可以從中得到很多有效信息,但是這些信息是否能有效過濾掉不同的口音、情緒、唿吸等的差異,去提取自己想要的信息如音調差異、錯別字的差異還在探索中。
最後更新:2017-09-28 16:33:07