Raspberry Pi 和 ReSpeaker 麦克风 DIY 智能家庭助理

我们已经说了这么多年的智能家居,但是我们的家还不够聪明。 而这一次,它真的来了,Amazon Echo,Google Home,Apple homekit 等等的智能音箱,带来新的智能。

在这里,ReSpeaker 阵列麦克风作为 Raspberry Pi 的“耳朵”,可以听到你的声控命令并发送给Raspberry Pi。并根据您的指令,Raspberry Pi 将通过 Wi-Fi 控制 Wio Link 进行所需的操作。

步骤1:材料准备

  • Raspberry Pi(带网络连接)* 1
  • ReSpeaker阵列麦克风带音频插孔 * 1
  • 带有 Raspberry Pi 图片的 SD 卡 * 1
  • Wio Link与WS2812 LED灯条 * 1
  • USB 线 * 2
  • PC或Mac

步骤2:从 GitHub 下载代码

首先,你需要 SSH 到 Raspberry Pi 上,并在 Raspberry Pi 上从我们的 Github 下载 ReSpeaker 阵列麦克风:

git clone https://github.com/respeaker/mic_array.git

步骤3:测试阵列麦克风

1.运行 pixel_ring.py,其将通过 USB HID 来控制阵列麦克风上的像素环( pixel ring)。开始运行后,ReSpeaker 麦克风将开始闪烁。

sudo pip install pyusb
sudo python pixel_ring.py

如果您不想使用 sudo 访问 USB 设备,请将 udev.rules 文件添加到 /etc/udev/rules.d 中:

echo 'SUBSYSTEM=="usb", MODE="0666"' | sudo tee -a /etc/udev/rules.d/60-usb.rules
sudo udevadm control -R  # then re-plug the usb device 

2.从阵列麦克风读取 8 声道音频,并评估声音的 DOA。 然后阵列麦克风上的 LED,将显示声音的方向。

sudo apt-get install python-numpy    # or pip install numpypythonmic_array.py 

3.做 VAD,然后评估 DOA。 同样的,阵列麦克风上的 LED 也会显示声音的方向。

sudo pip install webrtcvad
python vad_doa.py 

4.做 KWS,然后评估 DOA。接着让 snowboy 工作,并运行 python kws_doa.py。 然后,您应该对阵列麦克风说“alexa”来唤醒它,如果检测到声音,LED 将显示声音的方向。

git submodule init
git submodule update
cd snowboy/swig/Python
sudo apt-get install python-dev libatlas-base-dev swig           # requiremetns to compile snowboy
echo 'from snowboydetect import *' >__init__.py     # create__init__.pyfor a python module
cd ../../..                                          # chang to the root directory of the repository
ln -s snowboy/swig/Python snowboydetect
python kws_doa.py

步骤4:安装 ReSpeaker Python 库

安装 ReSpeaker Python Library,以使用Bing Speech API

git clone https://github.com/respeaker/respeaker_python_library.git
cd respeaker_python_library 
python setup.py install 

这时,你需要一个 Bing 密钥,可以阅读这篇文章获取它:Voice Respeaker

步骤5:设置您的 Wio Link

将 WS2812 LED 条添加到 Wio Link 的数字 0 端口,并更新固件。然后单击“view api”并获取访问令牌。

如果您是Wio Link的新手,请点击此处查看维基和指南。

步骤6:将 Bing 密钥和 Wio Token 添加到 Python 代码中

将下面的代码保存在您的 Raspberry Pi 中,不要忘记填写 Bing 密钥和Wio Token:

from respeaker.bing_speech_api import BingSpeechAPI as Bing
import wave
from mic_array import MicArray
import Queue
from pixel_ring import pixel_ring
import sys
import numpy as np
import collections
from snowboydetect import SnowboyDetect
import time
import json
from urllib import urlencode
from urllib2 import Request, urlopen, URLError, HTTPError

# write your Wio token here

WIO_TOKEN = "**************"

# write your Bing key here

KEY = "**********"
bing = Bing(key=KEY)

RATE = 16000
CHANNELS = 8
KWS_FRAMES = 10     # ms
DOA_FRAMES = 800    # ms

detector = SnowboyDetect('snowboy/resources/common.res', 'snowboy/resources/snowboy.umdl')
detector.SetAudioGain(1)
detector.SetSensitivity('0.5')

# about 5seconds
q = Queue.Queue(maxsize=768)

def gen_queue(q):
    try:
        data = q.get(timeout=1)
        while data:
            yield data
            data = q.get(timeout=1)
    except Queue.Empty:
        pass

def controlLED(onoff=0): 
    try:
        if onoff == 1:
            rgb_hex_string = '000080'
        else:
            rgb_hex_string = '000000'
        url = 'https://cn.wio.seeed.io/v1/node/GroveLedWs2812D0/clear/4/{}?access_token={}'.format(rgb_hex_string, WIO_TOKEN)
        request = Request(url, data='')
        response = urlopen(request)
        data = response.read()
        result = json.loads(data)
        if result['result'] == 'ok':
            return True
        else:
            return False
    except Exception as err:
        return False

def main():
    history = collections.deque(maxlen=int(DOA_FRAMES / KWS_FRAMES))
    global q

    try:
        with MicArray(RATE, CHANNELS, RATE * KWS_FRAMES / 1000)  as mic:
            for chunk in mic.read_chunks():
                history.append(chunk)
                # Detect keyword from channel 0
                ans = detector.RunDetection(chunk[0::CHANNELS].tostring())
                if ans > 0:
                    print("wake up")
                    print("start recording")
                    pixel_ring.arc(12)
                    q.queue.clear()
                    for chunk in mic.read_chunks():
                        q.put(chunk[0::CHANNELS].tostring())
                        if q.full():
                            break
                    print "queue full"
                    pixel_ring.spin()
                    text = bing.recognize(gen_queue(q))   # data can be generator
                    if text:
                        print('{}'.format(text))
                        if 'turn on' in text:
                            controlLED(1)
                        if 'turn off' in text:
                            controlLED(0)
                    pixel_ring.off()

    except KeyboardInterrupt:
        pass

    pixel_ring.off()
    # except ValueError:
    #     pass

if __name__ == '__main__':
    main()

步骤7:运行演示

将步骤6 中的 python 代码保存在 smart_home.py 中,然后运行它:

python smart_home.py

唤醒它说“snowboy”,然后说“please turn on the light”,或者“please turn off the light”来控制Wio Link。

Enjoy it!!

原文链接:http://www.instructables.com/id/Diy-Smart-Home-Assistant-With-Raspberry-Pi-and-ReS/

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.