前一篇說了一下只有RX,TX,VCC,GND的WIFI模塊軟串口通訊;在實現了遠程觀察數據,類似的就可以實現遠程控制。接下來說一下近距離控制,很多情況下應用語音識別技術無疑比掏出手機操作要更人性化一些,當然有些情況是例外,例如半夜起床來,那么人體感應模塊和光傳感器結合就更人性化。LD3320模塊本身識別准確率並不高,但是通過編寫程序的一些技巧,可以提高這個准確度。不過這個模塊接線的時候有一些小問題,我買的是很多教程上的那個長方形模塊,頭上有倆插孔,尾巴上面2排12個針那種。說一下怎么用起來:
一、接線
A、下排
CS是片選,很多教程講接GND,如果有多個SPI設備,則需要接一個引腳。
P0-P2,接UNO11-13引腳。(通訊+時鍾)。
同排的GND,3.3V接UNO的GND,和3.3輸出。
B、上排
IRQ是中斷,接PIN2
WR接GND
RST接PIN9
共9線完成。
二、程序
首先,感謝ld3320.h的原作者。
然后,說一下這個“垃圾關鍵詞”:首先,明確的說,把垃圾關鍵詞都認為是真垃圾的思路我不認同;讓我說嚴重點這就是誤導,是背道而馳,貴圈確實很亂。提出幾點原因:
1、本身識別准確率並不高,假定為60%,並且要求發音清楚、連貫性適中。
2、“垃圾關鍵詞”是接近正確命令的發音,其中有相當部分是用戶正確發音但未正確識別,假定為30%。
如果,代碼中讓“垃圾關鍵詞”並不“垃圾”,那么識別率就是60%+30%;換一種說法,垃圾關鍵詞中即使有1%是正確發音但未被准確識別的,我們把它加上,也是提高1%的正確識別。那么,接下來的問題就是真的垃圾怎么辦。
1、場景切換(口令模式),當15%的真垃圾進入下一個場景,接下來的語句仍然符合下一場景的關鍵詞的幾率是多少?
2、長口令,帶稱呼的口令更符合人們的習慣,所以開燈可以變成二狗子開燈……長口令的錯誤識別率無疑要低。
所以,我的程序中,數據結構和邏輯結構是這樣的:
struct AsrCommand { char* flag; int ID; }; AsrCommand CallName[] = { { "da hei", 0 }, { "da ei", 0 }, { "da kei", 0 }, { "da bai", 1 }, { "da he", 1 } }; AsrCommand ExecuteCommand[] = { { "kai dian shi",0 }, { "ai dian shi",0 }, { "kai yan shi",0 }, { "ai yan shi",0 }, { "kai tian shi",0 }, { "ai tian shi",0 }, { "guan dian shi",1 }, { "kuan dian shi",1 }, { "guan yan shi",1 }, { "kuan yan shi",1 }, { "guan tian shi",1 }, { "kuan tian shi",1 } };
CallName中,編號為1的是真垃圾關鍵詞,但是編號是0的部分里面包含了一部分假垃圾關鍵詞,通過場景切換,使用ExecuteCommand中的關鍵詞,兩組都是命令,一組是開電視,一組是關電視。通過場景切換,第一組中的錯誤識別將被縮小。你可以嘗試一下這個模式,它可以讓你不必咬文嚼字的和機器對話而機器也會正確的響應你。識別率被提高,而不必非常擔心:它會不會知道我說了什么?盡可能的不要讓我們找方便的時候被搞得不痛快吧,那就不是用機器了,簡直就是被機器用。