赞
踩
懒~!对,您没看错,就是因为懒,懒是进步的关键因素,哈哈。因为卧室灯的开关距离的比较远,每次睡觉都感觉不远万里去关掉灯,最崩溃的是已经躺下了,还是会被媳妇吼起来关灯,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()
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
5.对返回的文字进行简单的逻辑判断,对灯是开是关,然后封装MQTT协议发出去。
6.esp8266控制继电器程序:我是用arduino写的,然后串口烧到板子里,就是接受的mqtt主题消息进行相关操作,方法见,arduino环境搭建
7.把esp8266节点以开关传感器添加到home-assistant的配置文件中,然后重启下home-assistant,界面就会有控制按钮啦。
使用唤醒词的目的是不希望百度翻译一直听着,什么声音都传百度去了。这个驺吾唤醒的效果我还挺满意,还不错。
发现可以用苹果的siri控制了,貌似网上有教程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。