樹莓派安裝snowboy

樹莓派安裝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進行調節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通過文字轉語音進行識別,但是百度的語音接口好像不支持,再研究研究吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章