Ich habe 2 Schleifen, die ich ausführen muss, eins für Sprachbefehle zu hören und das andere, um mit einem MQTT-Broker verbunden zu bleiben und nach/nach einem MQTT-Thema zu warten, wenn ein Sprachbefehl ausgegeben wird. Problem ist, ich bin mir nicht sicher über die beste Möglichkeit, dies einzurichten. Wie würde ich diese beiden Runs einrichten, wenn MQTT auf einen Sprachbefehl wartet, um Funktionen auszuführen/wo würde ich anfangen, nach der Lösung zu suchen? Klassen? Multithreading? Nicht wirklich sicher, wo ich anfangen soll.Lassen Sie 2 Schleifen gleichzeitig laufen, dass der Anruf von einander funktioniert?
Auch - Randnotiz - diese Spracherkennung (PocketSphinx) ist absolut schrecklich. Es nimmt vielleicht 5% der Zeit an/aus und gibt alle Arten von zufälliger Antwort zu jeder anderen Zeit. Bonus-Punkte, wenn Sie mich in die richtige Richtung weisen können, um das zu beheben, indem Sie ein besseres Modul oder eine mögliche Kodierung von Taschensphinx verwenden (ich habe mich bereits für einen Google Cloud-Speech API-Schlüssel angemeldet, ihn aber noch nicht erhalten) .
Hier ist der Code
voice.py:
import pyaudio, os
import mqttPublisher
import speech_recognition as sr
def mainfunction(source):
audio = r.listen(source)
user = r.recognize_sphinx(audio)
print(user)
if user == 'on':
mqttPublisher.led_on()
elif user == 'off':
mqttPublisher.led_off()
if __name__ == '__main__':
r = sr.Recognizer()
with sr.Microphone() as source:
while 1:
mainfunction(source)
mqttPublisher.py:
import paho.mqtt.client as mqtt
def led_on():
mqttc.publish("IoT/LED", payload="1")
print("LED is ON")
def led_off():
mqttc.publish("IoT/LED", payload="2")
print("LED is OFF")
def get_status():
mqttc.publish("IoT/LED", payload="3")
def on_connect(client, userdata, flags, rc):
mqttc.publish("IoT/LED", "connected")
print("connected")
def on_subscribe(client, userdata, mid, granted_qos):
mqttc.publish("IoT/LED", payload="3")
print("subscribed")
def on_publish(client, userdata, mid):
print("message published")
def on_message(client, userdata, message):
print("message printed to topic")
def on_disconnect(client, userdata, rc):
print("Client Disconnected")
mqttc = mqtt.Client()
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_message = on_message
mqttc.on_publish = on_publish
mqttc.on_disconnect = on_disconnect
mqttc.connect("192.168.1.3", 1883)
mqttc.subscribe("IoT/LED", 1)
run = True
while run:
mqttc.loop_start()
Führen Sie die Schleifen auf separaten Threads – hardillb
Es klingt für mich, dass Coroutines sind, was Sie implementieren möchten. – AndyG