Rpi Zero W做的老头乐声控灯

祭图__|\0==>历经各种尝试,最后选了docker 里装个rhasspy,配上paho-mqtt搞出了这个奇葩夜灯。各种曲折就不说了,直接分享捷径思路。

这个绿板子是respeaker hat with 2 mic 用的是seeed-voicecard,跟着github编译,不废话。上图Rhasspy中开3个模块足够了。

intent recognition或者intent handling模块真不建议。喵的说个词,它后台运行十几秒,还开个毛线灯。有尝试在pocketsphinx下用mfa和praat自己编个迷你g2p.fst去找,做到textgrid file之后,再打包成customized model.zip 居然还要用kaldi,然后这个kaldi软件死活要配置好显卡参数才能装,终于成功在这里把我劝退了。

此时恍悟,不如直接用唤醒词试试,发现唤醒词敏感度很好且误报率又低,于是直接用这个思路来了个歪招。而且后来一看htop的情况,也觉得rpi zero 也撑到极限了,想上点花里胡哨的,1Ghz内核不答应(运算能力),armv6也不会答应(软件多样性)。

代码结构上,就俩文件一个订阅对应频道,响应唤醒词。另一个是监控对应gpio,长时间高电平,我就给你关了。

import RPi.GPIO as GPIO
import paho.mqtt.client as mqtt
import time

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

LED=21
GPIO.setup(LED, GPIO.OUT)
GPIO.output(LED,GPIO.LOW)

flag = 0

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    #client.subscribe("hermes/intent/ChangeLightState") #subcribed channel
    client.subscribe("hermes/hotword/bumblebee_raspberry-pi/detected")
    #client.subscribe("hermes/asr/textCaptured")

#def on_message(client, userdata, msg,ledpin=LED):
#  mypay = msg.payload.decode("utf-8")
#  print ("message received:",msg.topic,mypay)
#  if mypay=="1":
#    GPIO.output(ledpin,GPIO.HIGH)
#  if mypay=="0":
#    GPIO.output(ledpin,GPIO.LOW)

def on_message(client,userdata,msg,ledpin=LED):
    print("message: ",msg.topic)
    global flag
    #if flag % 2 == 1 and GPIO.input(ledpin) == 0: #单数但低电平,说明时间程序关了gpio,实际应用其实可以不加,喊多一声而已。
    #    flag = 0
    #else:
    #    flag = flag + 1
    flag = flag + 1
    if flag % 2 == 1: #单数开灯
        flag = 1 #重置一下flag,不让它变很大
        GPIO.output(ledpin,GPIO.HIGH)
        start_time = int(time.time())
    else:
        flag = 0
        GPIO.output(ledpin,GPIO.LOW)
    

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("localhost", 1883)
#client.loop_forever()
try:
    client.loop_forever()
except:
    GPIO.output(LED,GPIO.LOW)
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
LED = 21
GPIO.setup(LED,GPIO.OUT)

while True:
    if GPIO.input(LED) == 1:
        a = 0
        while GPIO.input(LED) == 1:
            time.sleep(1)
            a = a + 1
            if a > 59:
                GPIO.output(LED,GPIO.LOW)
    time.sleep(3)

rhasspy中有用的配置也就红绿框,

docker 跑rhasspy 针对pi zero是要选择平台参数才能pull的。然后运行命令如下

docker run -p 12101:12101  --network host    --name rhasspy --restart unless-stopped -v "$HOME/.config/rhasspy/profiles:/profiles" -v "/etc/localtime:/etc/localtime:ro" -v "/etc/asound.conf:/etc/asound.conf" --device /dev/snd:/dev/snd --ipc="host" rhasspy/rhasspy --user-profiles /profiles --profile vv

#这个vv profile是customized profile,是我照抄标准en后,对字典做了缩减,但是因为没有用intent类型的功能,这玩意儿也不重要。

接下来太阳能部分用到的工具(还在犯懒,此刻没有焊上去),除了那块太阳能板,你还需要一个mppt和一个稳压电路。

等试运行了看下实际不实际吧,嘎嘎。

最后吐槽一下pocketsphinx以及与它沆瀣一气的那些个科研工具,mfa和praat。喵了个咪的,我就想说有点装。搞一个自己的音频模型,过程里的其他软件使用很多。截图一下mfa alignment的基本使用和Textgrid的生成。然后再截图一个praat软件,对于说话识别的使用方式。万一没头脑以后还要用,这里可以提示一下用法。

图中参数有点错了,我其实应该选single speaker。

下图为praat,音频对应的语音标注。注意最初这个textgrid,无中生有是从wav变出来的,下拉菜单里有个叫annotation的东西,点了之后把默认的bell改成pitch。图中是人工标注,保存后再会由mfa根据标准字典,矫正好并在english_output文件夹里输出最终版的Textgrid 文件。

总之就是遭老罪。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取啥都被占用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值