樹莓派的語音識別
1. 安裝linux下的聲音庫
sudo apt-get install alsa-base
sudo apt-get install alsa-utils
sudo apt-get install libasound2-dev
可能遇到的問題:
E: Unable to locate package alsa-base
解決:更換系統的源
cd /etc/apt/
cp sources.list sources.list.bak
sudo apt-get install vim
sudo vim source.list
...中科大的軟件源
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
...
sudo apt-get update # 更新源
sudo apt-get -f install #修復損壞的軟件包
sudo apt-get upgrade #更新軟件
換源可能出現的問題:
Err:1 http://mirrors.aliyun.com/ubuntu xenial InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
解決:
sudo gpg --keyserver keyserver.ubuntu.com --recv 3B4FE6ACC0B21F32 //(這個公鑰根據提示來寫的)
sudo gpg --export --armor 3B4FE6ACC0B21F32 | sudo apt-key add -
sudo apt-get update
輸入alsamixer
2.聲音的輸入和輸出
將usb聲卡作為默認的聲卡:
cd
vim .asoundrc
... 內容如下
pcm. !default sysdefault:Device
...
聲音的輸出: 挑選一個wav格式的音樂: 可以在這個網站下載示例 https://www.ape8.cn/
sudo aplay loveme.wav #開始播放音樂
聲音輸入:
sudo arecord -D hw:1,0 -c1 -r16000 -fS16_LE test.wav #對着話筒說話進行錄制
參數說明:
-h,—help(幫助)
-V,–version(打印版本信息)
-l,–list-devices(列出全部聲卡和數字音頻設備)
-L,–list-pcms(列出全部PCM定義)
-D,–device(指定PCM設備名稱)
-q,–quiet(安靜模式)
-t,–file-type(文件類型voc,wav,raw或au)
-c,–channels(設置通道數)
-f,–format(設置格式)
-r,–rate(設置頻率)
-d,–duration(設置持續時間,單位為秒)
-s,–sleep-min(設置最小休眠時間)
-M,–mmap(mmap流)
-N,–nonblock(設置為非塊模式)
-B,–buffer-time(緩沖持續時長,單位為微秒)
-v,–verbose(顯示PCM結構和設置)
-I,–separate-channels(設置為每個通道一個單獨文件)
3. 語音識別
采用開源庫: PocketShinx
下載安裝:
#下載
wget https://sourceforge.net/projects/cmusphinx/files/sphinxbase/5prealpha/sphinxbase-5prealpha.tar.gz/download -O sphinxbase.tar.gz
wget https://sourceforge.net/projects/cmusphinx/files/pocketsphinx/5prealpha/pocketsphinx-5prealpha.tar.gz/download -O pocketsphinx.tar.gz
# 解壓
tar -xzvf sphinxbase.tar.gz
tar -xzvf pocketsphinx.tar.gz
# 安裝依賴
sudo apt-get install bison libasound2-dev swig
#先安裝sphinxbase
cd sphinxbase-5prealpha
sudo ./configure --enable-fixed
sudo make
sudo make install
#安裝pocketsphinx
cd pocketsphinx-5prealpha
sudo ./configure
sudo make
sudo make install
#讓系統知道PocketPhinx庫文件的位置
sudo vim /etc/ld.so.conf
...追加一行
/usr/local/lib
...
# 進入pocketPhinx下的src/programs
./pocketsphinx_continuous -inmic yes #這樣就可以對着話筒說了,語音識別完成
4. 提高識別精度
通過上述的開源庫,測試發現十分的不准確,提高准確率的方法有兩種,一種是通過訓練模型,過程很復雜,另一種是通過制定一些關鍵字進行范圍限定.下面是第二種方法的操作步驟
創建字典
vim keyword.txt
...
up
down
left
right
light
hello
...
生成程序識別的文件:訪問http://www.speech.cs.cmu.edu/tools
將字典文件上傳,生成指定的.tgz壓縮文件,點擊下載
./pocketsphinx_continuous -lm 3253.lm -dict 3253.dic -inmic yes
發現識別精度直線上升
5.理解語音並發起動作
動作可以多種多樣,他可以是觸發一個腳本,可以是回復一句話,下面的實例,做一個簡單回應,當我說出hello
, 他回復im okay
,這樣的功能
讓程序說話: 文本轉語音: TTS(TextToSpeach)
sudo apt-get install espeak
修改pocketPhinx的程序
cp continuous.c continuous.c.bak # 做好備份
...修改如下
if (!in_speech && utt_started) {
/* speech -> silence transition, time to start new utterance */
ps_end_utt(ps);
hyp = ps_get_hyp(ps, NULL );
if (hyp != NULL) {
printf("開始識別了昂....");
if(strcmp(hyp,"HELLO")==0){
system("sudo espeak \"im okay\"");
}
printf("%s\n ", hyp);
fflush(stdout);
}
if (ps_start_utt(ps) < 0)
E_FATAL("Failed to start utterance\n");
utt_started = FALSE;
E_INFO("Ready....\n");
}
sudo make # 重新編譯
./pocketsphinx_continuous -lm 3253.lm -dict 3253.dic -inmic yes