實際工程中,常有將文字轉爲語音播放的需求。好比車輛進場時播放「京B123Y5歡迎光臨」,車輛離場時播放「請繳費15元,一帆風順」等。算法
語料指基礎的語音材料,是控制系統提供的可播放的語音片斷。語料庫通常包括:單個的字母數字、使用漢字、經常使用的詞語組合如「歡迎光臨」、「一帆風順」等。以下表:編程
語音索引號測試 |
語音內容spa |
0orm |
0排序 |
1索引 |
1內存 |
。。。ci |
|
9字符串 |
9 |
10 |
十 |
11 |
百 |
12 |
千 |
13 |
萬 |
14 |
年 |
15 |
月 |
16 |
日 |
17 |
天 |
18 |
歡迎光臨 |
19 |
一路平安 |
20 |
此卡 |
21 |
已過時 |
22 |
無效 |
23 |
有效 |
24 |
有效期 |
。。。 |
|
37 |
A |
38 |
B |
。。。 |
|
61 |
Y |
62 |
Z |
63 |
京 |
64 |
黑 |
。。。 |
|
96 |
學 |
97 |
警 |
。。。 |
|
101 |
請繳費 |
102 |
點 |
103 |
元 |
。。。 |
|
112 |
您 |
113 |
好 |
114 |
謝謝 |
115 |
歡迎回家 |
。。。 |
|
161 |
歡迎 |
162 |
泊車 |
163 |
一帆風順 |
。。。 |
|
表1,語料庫
好比,要播放「京B123Y5歡迎光臨」,按照上述語料庫,分別對應:京à63,Bà38,1à1,2à2,3à3,Yà61,5à5,歡迎光臨à18,就須要按順序傳遞「語音索引號」參數列表:63,38,1,2,3,61,5,18
本文研究對於給定的語料庫,輸入任意文字字符串,如何高效轉換爲語料庫中對應的「語音索引號」列表。
顯然,要實現上述需求,就要對輸入的文字串進行切分(即切詞),同時切分以後的各部分片斷應知足如下要求:
1) 儘量多地對應於語料庫元素,即沒法讀出的片斷儘可能少
2) 優先採用語料庫中較長元素,使語音讀出更加天然。如,假設語料庫中有「有效期」、「有效」、「期」三種元素,那麼切詞應將「有效期」切爲一個詞,而不是切爲「有效」、「期」2個詞。
3) 計算速度儘量快,耗用CPU和內存儘量少。
首先,因爲切詞的位置和長度不肯定,形成切詞結果的可能性組合很是大。如輸入一個20字符的句子,對於一個語料長度最多10字符的1000條語料庫來講,徹底的匹配計算次數爲:
1000*10^20次。參照主流PC機每秒100億次浮點運算的能力,須要時間爲10^13秒。而通常實際要求均須要毫秒級反饋,所以採用有效算法進行查找十分必要。
有效算法依賴於有效的查找表,構建一個適合順序查找的「語料查找表(PLT)」頗有必要。如下爲構建要點:
1) 基於語料庫
2) 按語料欄位排序,而不是按索引號排序
3) 爲知足「要求3「,應從第一個字符開始比對和定位,所以對於語料庫中不存在首單字索引的語料,要增長「虛擬」語料。如語料庫中有「歡迎」一詞,但沒有「歡」這個字,就增長一條語料「歡」,其索引爲 -1,表示不存在。
4) 擴展PLT欄位:除了語音元素(語料)、索引號之外,增長長度、標記。
a) 長度爲語音元素的字節數。如A長度爲1,「歡迎光臨「長度爲8
b) 標記爲語料查找提供提示。詳見第5條。
5) 爲知足「要求2「,在已經查找到語料時,應繼續向後查找,看看是否能匹配到更長的語料。假設第L條語料的語音元素爲Y(L),若Y(L)不包含在Y(L+1)中,則沒必要向後查找,此時第L條語料的「標記」欄位設置爲0;不然設置爲1,其後凡包含Y(L)的語料,設置「標記」欄位爲2.
語料查找表(PLT,Part Lookup Table)編制原理如上,具體編制過程可編程實現。
以下是依據「表1,語料庫」實現的一個PLT。
語音元素 |
長度 |
標記 |
索引號 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
。。。 |
|
|
|
9 |
1 |
0 |
9 |
A |
1 |
0 |
37 |
B |
1 |
0 |
38 |
。。。 |
|
|
|
Y |
1 |
0 |
61 |
Z |
1 |
0 |
62 |
澳 |
2 |
0 |
152 |
百 |
2 |
0 |
11 |
。。。 |
|
|
|
成 |
2 |
1 |
133 |
成功 |
4 |
2 |
30 |
川 |
2 |
0 |
77 |
。。。 |
|
|
|
光 |
2 |
1 |
-1 |
光臨 |
4 |
2 |
165 |
歡 |
2 |
1 |
-1 |
歡迎 |
4 |
2 |
161 |
歡迎光臨 |
8 |
2 |
18 |
歡迎回家 |
8 |
2 |
115 |
及 |
2 |
1 |
-1 |
及時 |
4 |
2 |
186 |
。。。 |
|
|
|
按 |
2 |
1 |
-1 |
按臨時車計費 |
12 |
2 |
204 |
表2,語料查找表(PLT)
輸入:InSentence字符串
1) N=0
2) N=n+1
3) N>length(InSentence)? 如果,結束算法;不然繼續4
4) 取InSentence第N個字節ByteN
5) ByteN是否在爲0-9或A-Z之間?如果,則轉100;不然轉3
6) N=n+1
7) 取InSentence第N個漢字符CharN
8) 在PLT中查找長度爲2的元素,是否有匹配M?若無,轉2;如有,轉9
9) 記錄下M的索引爲Idx,標記爲F
10) F是否爲0?如果,轉100;若否,轉11
11) M=M+1
12) 記錄M的標記是否爲2?若否,轉200;不然轉13
13) 設M的長度爲L,語音元素爲CharM, 索引號爲IdxM。
14) 取InSentence長度爲L的字符串與CharM比對是否一致。
15) 若一致,則N=n+L,將索引號IdxM,加入結果集,轉2;不然轉11
100) 在PLT中查找ByteN的索引號Idx,加入結果集,轉2
200) 將索引號Idx,加入結果集,轉2
輸入:你好AB請等待歡迎回來請及時繳費
返回:,-1,113,37,38,98,161,-1,-1,155,186,174
語料切詞表以下:
語料切詞 |
語料索引 |
你 |
-1 |
好 |
113 |
A |
37 |
B |
38 |
請等待 |
98 |
歡迎 |
161 |
回 |
-1 |
來 |
-1 |
請 |
155 |
及時 |
186 |
繳費 |
174 |
可見,除了語料庫中不存在的「你」、「回」、「來」這3個詞之外,其他輸入均進行了正確切分,算法實現了語料切詞的3條需求。