当前位置:   article > 正文

搭建简单的智能家居语音控制系统:树莓派+唤醒词+esp8266_家用语音智能系统 lib

家用语音智能系统 lib

搭建简单的语音控制系统:自己家用

为什么要整个这玩意

~!对,您没看错,就是因为是进步的关键因素,哈哈。因为卧室灯的开关距离的比较远,每次睡觉都感觉不远万里去关掉灯,最崩溃的是已经躺下了,还是会被媳妇吼起来关灯,5555555,于是乎,整了个这玩意

思路

前提:语音控制或者app,再或者web页面控制灯的亮灭,反正就是我不动也能控制,另外原来电路仍然可用。

硬件树莓派+esp8266+麦克风
软件:语音唤醒+语音转文字+语义判断

树莓派:自己有个3,现状已经出到4了,好像也不贵,选3,3b+都行 。主要用来跑服务的程序,其实用自己家电脑也可以,但一直开着比较费电。
esp8266:用它来控制继电器的开闭,就能实现灯的亮灭啦,单片子几块钱就能买,对于新手还是直接买现成的(20多块钱连app都带了,按上直接能用,但我偏偏要自己写个程序烧进去,哈哈)

开干

1.树莓派装系统:百度一堆,很简单,官网下img镜像,然后软件烧进去就行
2.安装home-assistant:主要是省去了自己写web节面,安装参考:home-asistantan安装

3.语音唤醒:目前比较出名的snowboy,但我在github上新发现了个ZouWu(驺吾,又是一神兽),Readme里宣称不必snowboy差,看了代码,是非常简洁易上手,提供了c和python的调用例子,不过缺点在于需要自己用树莓派录制三段唤醒词音频发到指定邮箱,没能像snowboy可以直接在网站录制生成模型,很意外的是我发过去没几分钟,模型就给我发回来了,比较赞,分享点其中python录音例子代码,其他的可以去GitHub上看:驺吾

import argparse
import struct
import os
import sys
import numpy as np
import pyaudio
from datetime import datetime
from threading import Thread
from zouwu import ZouWu

class ZouWuDemo(Thread):              
    def __init__(
        self,
        library_path,
        model_path,
        sensitivities,
        mdl_id):
           
        super(ZouWuDemo, self).__init__()
        self._library_path = library_path
        self._model_path = model_path
        self._sensitivities = sensitivities
        self._mdl_id = mdl_id
        self._CHUNK = 512
               
    def rundemo(self):
        zouwu = None
        p = None
        stream = None
        try:
            zouwu = ZouWu(self._library_path)            
            p = pyaudio.PyAudio()
            stream = p.open(
                rate=16000,
                channels=1,
                format=pyaudio.paInt16,
                input=True,
                frames_per_buffer=2048)
            #load model
            zouwu.LoadModel(self._model_path)
            #set sensitivity
            zouwu.SetParam(self._sensitivities,self._mdl_id)            
            while True:
                #pcm = stream.read(self._CHUNK,exception_on_overflow = False)
                pcm = stream.read(self._CHUNK)
                data = struct.unpack_from("h" * self._CHUNK, pcm)
                result = zouwu.Proc(data)
                if result  > 0:
                   print('[%s] detected keyword %d'  % (str(datetime.now()),result))           
        except KeyboardInterrupt:
            print('demo exiting ...')
        finally:
            if zouwu is not None:
                zouwu.release()
            if stream is not None:
                stream.close()
            if p is not None:
                p.terminate()                       

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--library_path',
        help="Zouwu's dynamic library path",
        type=str,
        default=os.path.join(os.path.dirname(__file__), '../../lib/rpi/libZouwu.so'))
    parser.add_argument(
        '--model_path',
        help='model path',
        type=str,
        default=os.path.join(os.path.dirname(__file__), '../../resources/model/mdl'))
    parser.add_argument('--sensitivities', help='detection sensitivity [0, 1]', default=0.3)
    args = parser.parse_args()
    mdl_id = 1
    ZouWuDemo(
        library_path=args.library_path,
        model_path=args.model_path,
        sensitivities=args.sensitivities,
        mdl_id=mdl_id).rundemo() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

4.语音转文字STT:讯飞和百度都能实现语音转文字,效果应该差不多,百度有账户就用百度了,讯飞还的注册,没去折腾,下面是调用的代码,这里是读文件的,可以直接录音传过去识别,自己根据情况改吧,参数数码可以看百度官网文档说明

RATE = "16000"
FORMAT = "wav"
CUID="wate_play"
DEV_PID="1536"  #普通话识别
framerate=16000
NUM_SAMPLES=2000
channels=1
sampwidth=2
TIME=2

def get_token():
    server = "https://openapi.baidu.com/oauth/2.0/token?"
    grant_type = "client_credentials"
    #API Key
    client_id = "写自己的key"
    #Secret Key
    client_secret = "写自己的key" 
    #拼url
    url ="%sgrant_type=%s&client_id=%s&client_secret=%s"%(server,grant_type,client_id,client_secret)
    #获取token
    res = requests.post(url)
    token = json.loads(res.text)["access_token"]
    return token
#def get_word(token):
def get_word(token,wav):
    with open(wav, "rb") as f:
        speech = base64.b64encode(f.read()).decode('utf8')
    size = os.path.getsize(wav)
    headers = { 'Content-Type' : 'application/json'} 
    url = "https://vop.baidu.com/server_api"
    data={
            "format":FORMAT,
            "rate":RATE,
            "dev_pid":DEV_PID,
            "speech":speech,
            "cuid":CUID,
            "len":size,
            "channel":1,
            "token":token,
        }
    req = requests.post(url,json.dumps(data),headers)
    result = json.loads(req.text)
    print(result)
    ret=result["result"][0]
    return ret
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

5.对返回的文字进行简单的逻辑判断,对灯是开是关,然后封装MQTT协议发出去。
6.esp8266控制继电器程序:我是用arduino写的,然后串口烧到板子里,就是接受的mqtt主题消息进行相关操作,方法见,arduino环境搭建
7.把esp8266节点以开关传感器添加到home-assistant的配置文件中,然后重启下home-assistant,界面就会有控制按钮啦。

最后

使用唤醒词的目的是不希望百度翻译一直听着,什么声音都传百度去了。这个驺吾唤醒的效果我还挺满意,还不错。
发现可以用苹果的siri控制了,貌似网上有教程。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/88488
推荐阅读
相关标签
  

闽ICP备14008679号