You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
# Make a bot just echo what you say
|
|
|
|
import paho.mqtt.client as mqtt
|
|
import json
|
|
from time import sleep
|
|
|
|
HOST = 'localhost'
|
|
PORT = 1883
|
|
|
|
# To play wave files
|
|
from subprocess import call
|
|
|
|
# Mary server informations
|
|
mary_host = "localhost"
|
|
mary_port = "59125"
|
|
# HTTP + URL packages
|
|
import httplib2
|
|
from urllib.parse import urlencode, quote # For URL creation
|
|
|
|
|
|
|
|
def on_connect(client, userdata, flags, rc):
|
|
print("Connected to {0} with result code {1}".format(HOST, rc))
|
|
# Subscribe to the hotword detected topic
|
|
client.subscribe("hermes/hotword/default/detected")
|
|
client.subscribe("hermes/asr/textCaptured")
|
|
|
|
def on_message(client, userdata, msg):
|
|
if msg.topic == 'hermes/hotword/default/detected':
|
|
print("Wakeword detected!")
|
|
|
|
elif msg.topic == 'hermes/asr/textCaptured':
|
|
print("Text caught")
|
|
txt = json.loads(msg.payload)
|
|
|
|
#print(txt)
|
|
print(txt['text'])
|
|
return tts("dfki-prudence",txt['text'],'default');
|
|
|
|
def onIntentNotRecognized(client, userdata, msg):
|
|
print("null")
|
|
|
|
def tts(voice, input_text, speaker):
|
|
# Build the query
|
|
query_hash = {"INPUT_TEXT": input_text,
|
|
"INPUT_TYPE":"TEXT", # Input text
|
|
"LOCALE":"en_GB",
|
|
"VOICE": voice, # Voice informations (need to be compatible)
|
|
"OUTPUT_TYPE":"AUDIO",
|
|
"AUDIO":"WAVE", # Audio informations (need both)
|
|
}
|
|
query = urlencode(query_hash)
|
|
print("query = \"http://%s:%s/process?%s\"" % (mary_host, mary_port, query))
|
|
|
|
# Run the query to mary http server
|
|
h_mary = httplib2.Http()
|
|
resp, content = h_mary.request("http://%s:%s/process?" % (mary_host, mary_port), "POST", query)
|
|
|
|
# Decode the wav file or raise an exception if no wav files
|
|
if (resp["content-type"] == "audio/x-wav"):
|
|
|
|
# Write the wav file
|
|
f = open("/tmp/output_wav.wav", "wb")
|
|
f.write(content)
|
|
f.close()
|
|
|
|
# Play the wav file
|
|
# output = sc.get_speaker('Scarlett')
|
|
# a = read("/tmp/output_wav.wav")
|
|
# data = numpy.array(a[1],dtype=float)
|
|
# print(data)
|
|
# with sc.get_speaker('Scarlett').player(a[0], channels=[0]) as speaker:
|
|
# speaker.play(data)
|
|
|
|
# aplay -D mono3 /tmp/output_wav.wav
|
|
sleep(0.2)
|
|
call(["aplay", "-D", speaker, "/tmp/output_wav.wav"])
|
|
|
|
#pygame.mixer.init(frequency=16000) # Initialise the mixer
|
|
#s = pygame.mixer.Sound("/tmp/output_wav.wav")
|
|
#s.play()
|
|
#pygame.time.wait(int(math.ceil(s.get_length() * 1000)))
|
|
|
|
else:
|
|
raise Exception(content)
|
|
|
|
client = mqtt.Client()
|
|
client.on_connect = on_connect
|
|
client.on_message = on_message
|
|
client.message_callback_add("hermes/nlu/intentNotRecognized", onIntentNotRecognized)
|
|
|
|
client.connect(HOST, PORT, 60)
|
|
client.loop_forever() |