樹莓派安裝snowboy
樹莓派現在已經出到4了,暫時還沒有入手的意思,看到我已經靜靜吃灰的3b,剛好現在有點閒,就想折騰一下,就想着先安裝snowboy試一試吧。
1.樹莓派換源
我的樹莓派的系統是最新的樹莓派官方系統buster,編輯list文件
nano /etc/apt/sources.list
註釋掉官方源,添加國內的源,我添加的是東軟源,添加好之後,按ctrl+x,輸入Y,直接回車確認就行了。
#deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
deb http://mirrors.neusoft.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
執行一下,更新源操作。
apt-get source && apt-get update
2.安裝依賴環境,先更新一下系統。
apt-get upgrade
安裝依賴環境。
sudo apt-get install python3-pyaudio
sudo apt-get install swig
sudo apt-get install libatlas-base-dev
apt-get install pulseaudio
apt-get install sox
apt-get install alsa-utils
插入usb聲卡,查看當前是否有錄音設備。
arecord -l
出現了usb聲卡編號,card1
**** List of CAPTURE Hardware Devices ****
card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0
查看當前的播放設備
aplay -l
列出了當前的所有設備。
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
Subdevices: 7/7
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: ALSA [bcm2835 ALSA], device 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
新建 ~/.asoundrc文件,並添加如下內容,注意card的編號,是前面的usb聲卡的編號。
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "hw:0,0"
}
capture.pcm {
type plug
slave.pcm "hw:1,0"
}
}
ctl.!default {
type hw
card 1
}
錄一段音頻查看設備是否工作正常,我使用的是綠聯的usb聲卡,麥克風的插孔不要全部插入,要留一部分在外面,這樣纔可以正常工作,這一點非常重要!!!
rec test.wav
播放剛剛錄製的音頻,看看是否有雜音,可以通過alsamixer進行調節
aplay test.wav
播放錄製的音頻或者通過以下命令通過音箱聽見你說話的聲音。
sox -d -d
3.編譯snowboy
下載snowboy源碼
git clone https://github.com/Kitt-AI/snowboy.git
cd snowboy/swig
進入目錄之後選擇你要編譯的語言,選擇哪門語言進入對應的目錄,我選擇Python3,進入之後直接make進行編譯
make
編譯成功之後,進入snowboy目錄下的examples中運行對應語言的例子
python3 demo.py resources/models/snowboy.umdl
運行官方的demo,並指定官方的語音模型,可以在網站上登錄之後使用自定義的模型,但是受限於錄音設備,效果一般。
官網地址
4.解決報錯
1.官方的python例子中有一個導入的錯誤,在同一目錄下的snowboydecoder.py文件中
from * import snowboydetect 改爲 import snowboydetect 就可以運行了
2.OSError: [Errno -9997] Invalid sample rate 採樣率無效的問題,這裏只要把安裝好的pulseaudio啓動一下就可以了。
pulseaudio --start
在root用戶下啓動會報錯,但是沒有問題可以運行,只是提示權限的問題,
我們也可以將它加入到/etc/systemd/system/pulseaudio.service中去,確保它能在重新啓動後繼續工作:
[Unit]
Description=PulseAudio Sound System
Before=sound.target
[Service]
BusName=org.pulseaudio.Server
ExecStart=/usr/bin/pulseaudio
Restart=always
[Install]
WantedBy=session.target
3.在demo中要修改一個參數,不然還是會報錯。
detector.start(detected_callback=snowboydecoder.play_audio_file,
interrupt_check=interrupt_callback,
sleep_time=0.3)
把sleep_time從0.03改爲0.3纔可以,這樣一來就可以了。
alsa的報錯可以忽略,JackShmReadWritePtr好像是一個音頻驅動,不用管。
對着麥克風說出snowboy就可以聽見叮叮的聲音,就成功了,並輸出下面的信息,我的輸出音箱接在usb聲卡的輸出口,才聽到提示音。
INFO:snowboy:Keyword 1 detected at time:
修改響應
可以在官方的demo中修改detected_callback參數之後的函數進行自定義,官方也有demo可以實現用語音控制gpio引腳的例子。
import snowboydecoder
import sys
import signal
interrupted = False
def signal_handler(signal, frame):
global interrupted
interrupted = True
def interrupt_callback():
global interrupted
return interrupted
if len(sys.argv) == 1:
print("Error: need to specify model name")
print("Usage: python demo.py your.model")
sys.exit(-1)
model = sys.argv[1]
# capture SIGINT signal, e.g., Ctrl+C
signal.signal(signal.SIGINT, signal_handler)
detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
print('Listening... Press Ctrl+C to exit')
# main loop
detector.start(detected_callback=snowboydecoder.play_audio_file,
interrupt_check=interrupt_callback,
sleep_time=0.03)
detector.terminate()
好像還可以通過snowboy通過文字轉語音進行識別,但是百度的語音接口好像不支持,再研究研究吧。