Понимание слотов и получение их значений в Alexa Skills Kit - PullRequest
6 голосов
/ 16 апреля 2019

Я пытаюсь правильно понять, как слоты работают программно.Прежде чем что-то кодировать, я пытаюсь понять это, взглянув на примеры для alexa sdk для python.

В частности, я пытался понять основы слотов в Пример ColorPicker (я правильно понял hello_world и сам немного кодировал, добавляя что-то. Работало нормально).

Мне трудно понять, как для доступа к этим значениям слотов (потому что я вижу, что это делается двумя разными способами).

def whats_my_color_handler(handler_input):
    """Check if a favorite color has already been recorded in
    session attributes. If yes, provide the color to the user.
    If not, ask for favorite color.
    """
    # type: (HandlerInput) -> Response
    if color_slot_key in handler_input.attributes_manager.session_attributes:
        fav_color = handler_input.attributes_manager.session_attributes[
            color_slot_key]
        speech = "Your favorite color is {}. Goodbye!!".format(fav_color)
        handler_input.response_builder.set_should_end_session(True)
    else:
        speech = "I don't think I know your favorite color. " + help_text
        handler_input.response_builder.ask(help_text)

    handler_input.response_builder.speak(speech)
    return handler_input.response_builder.response

Что я понимаю в этой функции, так это то, что color_slot_key - это имя переменной в слотев Alexa (de frontend, Alexa Developer).Но тогда handler_input.attributes_manager.session_attributes, насколько я понимаю, это слоты в целом, и доступ по его ключу handler_input.attributes_manager.session_attributes['color_slot_key'] получит значение слота с этим ключом.

Если я правильно понял это, для меня это имеет смысл.Если есть цвет, Алекса произносит его.Если нет, то это не так.

Сейчас:

@sb.request_handler(can_handle_func=is_intent_name("MyColorIsIntent"))
def my_color_handler(handler_input):
    """Check if color is provided in slot values. If provided, then
    set your favorite color from slot value into session attributes.
    If not, then it asks user to provide the color.
    """
    # type: (HandlerInput) -> Response
    slots = handler_input.request_envelope.request.intent.slots

    if color_slot in slots:
        fav_color = slots[color_slot].value
        handler_input.attributes_manager.session_attributes[
            color_slot_key] = fav_color
        speech = ("Now I know that your favorite color is {}. "
                  "You can ask me your favorite color by saying, "
                  "what's my favorite color ?".format(fav_color))
        reprompt = ("You can ask me your favorite color by saying, "
                    "what's my favorite color ?")
    else:
        speech = "I'm not sure what your favorite color is, please try again"
        reprompt = ("I'm not sure what your favorite color is. "
                    "You can tell me your favorite color by saying, "
                    "my favorite color is red")

    handler_input.response_builder.speak(speech).ask(reprompt)
    return handler_input.response_builder.response

Я не понимаю, почему в этой функции к значению цвета обращаются:

handler_input.request_envelope.request.intent.slots[color].value

И не так, как в первой функции (что-то вроде этого):

handler_input.attributes_manager.session_attributes[color_slot_key]

Я предполагаю, что первая просто проверяет, есть ли она в атрибутах сеанса или нет(Который я не очень понимаю, что это такое), а другой имеет отношение к запросам Alexa .Но почему формат отличается?

1 Ответ

1 голос
/ 20 апреля 2019

Вы смешиваете две разные вещи.Атрибуты сеанса не имеют ничего общего со значениями слотов.Вы извлекаете слоты с помощью:

handler_input.request_envelope.request.intent.slots

, и пример для удобства сохраняет полученный цвет в атрибуте сеанса, чтобы он сохранялся в течение всего сеанса умения.Думайте об атрибутах сеанса как о постоянных атрибутах (ключ + значение), которые выживают во время сеанса навыка (они могут быть любыми, какими вы хотите).

Пример использования атрибутов сеанса в качестве средства выбора цвета объясняется здесь:

https://developer.amazon.com/de/docs/custom-skills/manage-skill-session-and-session-attributes.html#save-data-during-the-session

(у вас даже есть вкладка для выбора Python)

На вкладке «Тест» проверьте навык и посмотрите на входящий и исходящий JSON.Вещи станут ясны!

...