祭图__|\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 timeGPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)LED=21
GPIO.setup(LED, GPIO.OUT)
GPIO.output(LED,GPIO.LOW)flag = 0def on_connect(client, userdata, flags, rc):print("Connected with result code "+str(rc))#client.subscribe("hermes/intent/ChangeLightState") #subcribed channelclient.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 + 1flag = flag + 1if flag % 2 == 1: #单数开灯flag = 1 #重置一下flag,不让它变很大GPIO.output(ledpin,GPIO.HIGH)start_time = int(time.time())else:flag = 0GPIO.output(ledpin,GPIO.LOW)client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_messageclient.connect("localhost", 1883)
#client.loop_forever()
try:client.loop_forever()
except:GPIO.output(LED,GPIO.LOW)
import time
import RPi.GPIO as GPIOGPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
LED = 21
GPIO.setup(LED,GPIO.OUT)while True:if GPIO.input(LED) == 1:a = 0while GPIO.input(LED) == 1:time.sleep(1)a = a + 1if 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 文件。
总之就是遭老罪。