Начать взаимодействие с Alexa из серверной части

Я пишу свой первый навык Alexa с целью взаимодействия с роботом, обеспечивая голосовой ввод, а также позволяя роботу отправлять обратно сообщения через интерфейс Alexa.

Я использую расширение Flask-Ask Python для написания локального бэкэнда, используя ngrok для установления связи http и ROS для связи с роботом.

Я создаю намерения запуска и остановки, а также личное, в котором прошу Алексу переместить робота.

Что мне нужно сделать сейчас, так это создать функцию, которая позволяет мне передавать сообщение, используя вывод alexa speak, без взаимодействия с пользователем; Например, когда срабатывает пользовательское условие if, я хочу, чтобы Алекса воспроизвела образец сообщения:

if condition == True:
    def advise_function():
        sample_message = 'Messaggio di avviso'
        return statement(sample_message)

Это фактический код (для справки):

#!/usr/bin/env python
import os
import rospy
import threading
import requests
import time

from flask import Flask
from flask_ask import Ask, question, statement, session
from std_msgs.msg import String, Float64


#---------------------------------------------- FLASK & ROS INIZIALIZATION ---------------------------------------------#

app = Flask(__name__)
ask = Ask(app, "/")

# ROS node, publisher, and parameter. The node is started in a separate thread to avoid conflicts with Flask.
# The parameter *disable_signals* must be set if node is not initialized in the main thread.
threading.Thread(target=lambda: rospy.init_node('alexa_ros_node', disable_signals=True)).start()
direction_publisher = rospy.Publisher('alexa/direction', String, queue_size=100)
length_publisher = rospy.Publisher('alexa/lenght', Float64, queue_size=100)
NGROK = rospy.get_param('/ngrok', None)


#------------------------------------------------------- INTENTS -------------------------------------------------------#

# LaunchIntent -> Avvio dell'applicazione: "Apri nodo ros"
@ask.launch
def launch():
    welcome_message = 'Benvenuto nel nodo di controllo ROS. Come posso aiutarti?'
    return question(welcome_message)

# MuoviRobotIntent: "Muovi il robot"
@ask.intent('MuoviRobotIntent', default={'direzione':None, 'lunghezza':None})
def move_robot_function(direzione, lunghezza):
    direction_publisher.publish(direzione)
    length_publisher.publish(float(lunghezza))
    return statement('Ho pubblicato direzione e lunghezza sul topic ROS: {0} di {1} metri.'.format(direzione, lunghezza))


# StopIntent -> Uscita dall'applicazione: "Stop / Esci..."
@ask.session_ended
def session_ended():
    return "{}", 200

# ngrok app running
if __name__ == '__main__':
    if NGROK:
        print 'NGROK mode'
        app.run(host=os.environ['ROS_IP'], port=5000)
    else:
        print 'Manual tunneling mode'
        dirpath = os.path.dirname(__file__)
        cert_file = os.path.join(dirpath, '../config/ssl_keys/certificate.pem')
        pkey_file = os.path.join(dirpath, '../config/ssl_keys/private-key.pem')
        app.run(host=os.environ['ROS_IP'], port=5000,
                ssl_context=(cert_file, pkey_file))

person Davide Ferrari    schedule 23.06.2020    source источник


Ответы (1)


Ознакомьтесь с API проактивных событий. Я считаю, что это должно охватывать ваш вариант использования. https://developer.amazon.com/en-US/docs/alexa/smapi/proactive-events-api.html.

person LetMyPeopleCode    schedule 23.06.2020
comment
Ладно, так что нет способа использовать alexa в качестве динамика? Например: речь (что-то речевое). Потому что я новичок в программировании на Python и Alexa (JSON), поэтому мне сложно реализовать Proactive Events API. - person Davide Ferrari; 28.06.2020
comment
В Alexa Skills Kit речь (речь что-то) должна быть ответом на событие, инициированное клиентом. Вы можете настроить своего робота в качестве источника потокового аудио, настроить потоковую передачу музыки или звука, а затем наложить на него предупреждения, а затем запустить этот источник потоковой передачи из навыка. Или вы можете подключиться к эхо-устройству через Bluetooth и использовать его в качестве динамика Bluetooth для воспроизведения звука со своего телефона или ноутбука. Зависит от того, что питает ваш робот. Если это Raspberry Pi, вы можете транслировать с него или подключить к нему динамик Bluetooth. - person LetMyPeopleCode; 29.06.2020