# SoftBank Robotics documentation What's new in NAOqi 2.8?

# ALDialog Tutorials

NAOqi Interaction engines - Overview | API | Tutorials

## Getting started

### Start with Choregraphe

Choregraphe offers a full environment enabling you to quickly create and test dialog boxes.

Follow step by step the tutorials: Creating Dialog boxes.

### Go deeper with the full syntax

Once familiar with the main functions, you can add more complex rules.

For further details, see: QiChat - Syntax.

## Other option: Python

Two Python examples below show how to load and unload dialog topics. There are two ways to do it: either you need to have a .top file ready on the robot (you can use the example file below), or you can pass your qichat syntax directly to the dialog engine, as a text string. The second way is more useful for very short topics (as you don’t need any additional files), whereas the first is general.

`aldialog_example_topic_file.top`

    topic: ~example_topic()
    language: enu

    concept:(food) [fruits chicken beef eggs]

    u: (I [want "would like"] {some} _~food) Sure! You must really like $1 .
    u: (how are you today) Hello human, I am fine thank you and you?
    u: (Good morning Nao did you sleep well) No damn! You forgot to switch me off!

    u: ([e:FrontTactilTouched e:MiddleTactilTouched e:RearTactilTouched]) You touched my head!

    u: (Do you want to be tested) %testing Yes, please, test me now!
    u: (test test test) Yes, it works!
        u1: ([cool awesome]) isn't it?

    u:(start counting) 0, 1, 2, 3, 4, 5.

`aldialog_example_load_as_file.py`

    #! /usr/bin/env python
    # -*- encoding: UTF-8 -*-

    """Example: Using ALDialog Methods"""

    import qi
    import argparse
    import sys

    def main(session, topic_path):
        """
        This example uses ALDialog methods.
        It's a short dialog session with one topic.
        """
        # Getting the service ALDialog
        ALDialog = session.service("ALDialog")
        ALDialog.setLanguage("English")

        # Loading the topic given by the user (absolute path is required)
        topf_path = topic_path.decode('utf-8')
        topic_name = ALDialog.loadTopic(topf_path.encode('utf-8'))

        # Activating the loaded topic
        ALDialog.activateTopic(topic_name)

        # Starting the dialog engine - we need to type an arbitrary string as the identifier
        # We subscribe only ONCE, regardless of the number of topics we have activated
        ALDialog.subscribe('my_dialog_example')

        try:
            raw_input("\nSpeak to the robot using rules from the just loaded .top file. Press Enter when finished:")
        finally:
            # stopping the dialog engine
            ALDialog.unsubscribe('my_dialog_example')

            # Deactivating the topic
            ALDialog.deactivateTopic(topic_name)

            # now that the dialog engine is stopped and there are no more activated topics,
            # we can unload our topic and free the associated memory
            ALDialog.unloadTopic(topic_name)

    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument("--ip", type=str, default="127.0.0.1",
                            help="Robot's IP address. If on a robot or a local Naoqi - use '127.0.0.1' (this is the default value).")
        parser.add_argument("--port", type=int, default=9559,
                            help="port number, the default value is OK in most cases")
        parser.add_argument("--topic-path", type=str, required=True,
                            help="absolute path of the dialog topic file (on the robot)")

        args = parser.parse_args()
        session = qi.Session()
        try:
            session.connect("tcp://{}:{}".format(args.ip, args.port))
        except RuntimeError:
            print ("\nCan't connect to Naoqi at IP {} (port {}).\nPlease check your script's arguments."
                   " Run with -h option for help.\n".format(args.ip, args.port))
            sys.exit(1)
        main(session, args.topic_path)

Execution:

    $ python aldialog_example_load_file.py --ip $YOUR_ROBOTS_IP_ADDRESS --topic-path $ABSOLUTE_PATH_TO_YOUR_TOPIC_ON_THE_ROBOT

`aldialog_example_load_as_content.py`

    #! /usr/bin/env python
    # -*- encoding: UTF-8 -*-

    """Example: Using ALDialog Methods"""

    import qi
    import argparse
    import sys

    def main(session):
        """
        This example uses ALDialog methods.
        It's a short dialog session with two topics.
        """
        # Getting the service ALDialog
        ALDialog = session.service("ALDialog")
        ALDialog.setLanguage("English")

        # writing topics' qichat code as text strings (end-of-line characters are important!)
        topic_content_1 = ('topic: ~example_topic_content()\n'
                           'language: enu\n'
                           'concept:(food) [fruits chicken beef eggs]\n'
                           'u: (I [want "would like"] {some} _~food) Sure! You must really like $1 .\n'
                           'u: (how are you today) Hello human, I am fine thank you and you?\n'
                           'u: (Good morning Nao did you sleep well) No damn! You forgot to switch me off!\n'
                           'u: ([e:FrontTactilTouched e:MiddleTactilTouched e:RearTactilTouched]) You touched my head!\n')

        topic_content_2 = ('topic: ~dummy_topic()\n'
                           'language: enu\n'
                           'u:(test) [a b "c d" "e f g"]\n')

        # Loading the topics directly as text strings
        topic_name_1 = ALDialog.loadTopicContent(topic_content_1)
        topic_name_2 = ALDialog.loadTopicContent(topic_content_2)

        # Activating the loaded topics
        ALDialog.activateTopic(topic_name_1)
        ALDialog.activateTopic(topic_name_2)

        # Starting the dialog engine - we need to type an arbitrary string as the identifier
        # We subscribe only ONCE, regardless of the number of topics we have activated
        ALDialog.subscribe('my_dialog_example')

        try:
            raw_input("\nSpeak to the robot using rules from both the activated topics. Press Enter when finished:")
        finally:
            # stopping the dialog engine
            ALDialog.unsubscribe('my_dialog_example')

            # Deactivating all topics
            ALDialog.deactivateTopic(topic_name_1)
            ALDialog.deactivateTopic(topic_name_2)

            # now that the dialog engine is stopped and there are no more activated topics,
            # we can unload all topics and free the associated memory
            ALDialog.unloadTopic(topic_name_1)
            ALDialog.unloadTopic(topic_name_2)

    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument("--ip", type=str, default="127.0.0.1",
                            help="Robot's IP address. If on a robot or a local Naoqi - use '127.0.0.1' (this is the default value).")
        parser.add_argument("--port", type=int, default=9559,
                            help="port number, the default value is OK in most cases")

        args = parser.parse_args()
        session = qi.Session()
        try:
            session.connect("tcp://{}:{}".format(args.ip, args.port))
        except RuntimeError:
            print ("\nCan't connect to Naoqi at IP {} (port {}).\nPlease check your script's arguments."
                   " Run with -h option for help.\n".format(args.ip, args.port))
            sys.exit(1)
        main(session)

Execution:

    $ python aldialog_example_load_content.py --ip $YOUR_ROBOTS_IP_ADDRESS

Glossary Site map Index Support Contact Legal Notices