Knoten - dialogos-project/dialogos GitHub Wiki
Im folgenden Kapitel werden die verschiedenen Knotentypen beschrieben, die zur Beschreibung des Dialogablaufs zur Verfügung stehen. Jeder Knotentyp erfüllt eine bestimmte Funktion und hat dementsprechend eine bestimmte Anzahl von Ausgängen, über die der Dialog zur Laufzeit fortgesetzt werden kann.
Zu jedem Knoten können Sie eine Reihe von allgemeinen Parametern (Name und Farbe für die Darstellung sowie einen beliebigen Kommentar) angeben. Darüber hinaus hat jeder Knotentyp eine Menge von speziellen Parametern, die das Verhalten des Knotens bestimmen. All diese Parameter können Sie bearbeiten, indem Sie einen Doppelklick auf das Symbol des Knotens machen.
Start
Jeder Graph oder Untergraph hat automatisch genau einen Startknoten, in dem die Ausführung des (Teil-)Dialogs beginnt. Startknoten haben immer genau einen Ausgang, über den der Dialog beginnt. Es ist nicht möglich, den Startknoten zu löschen oder zusätzliche Startknoten anzulegen. Es ist aber durchaus möglich, Kanten zurück zum Startknoten zu ziehen, um einen Dialog in einer Schleife mehrfach auszuführen.
Startknoten haben keine speziellen Parameter.
Endknoten
Endknoten markieren das Ende eines (Teil-)Dialogs. Erreicht der Dialog bei der Ausführung einen Endknoten des Hauptgraphen, so wird die Ausführung beendet. Dementsprechend haben Endknoten keinen Ausgang. Ein Graph kann mehrere Endknoten enthalten, die möglicherweise verschiedene Endkonditionen symbolisieren.
Je nach Art des Graphen gibt es verschiedene Arten von Endknoten.
Endknoten haben keine speziellen Parameter.
Ende
Der Endeknoten ist nur im Hauptgraphen verfügbar und kann in diesem mehrfach auftreten. Wird jener erreicht, so wird die Ausführung des Dialogs komplett beendet.
Fortfahren
Ein Fortfahren-Knoten kann nur innerhalb von Teildialogen der globalen Eingabebehandlung auftreten. Er macht sich in Form eines Ausgangs an allen Eingabe-Knoten bemerkbar, an denen die jeweilige Eingabebehandlung aktiv ist. Endet dieser Teildialog, so wird der Eingabe-Knoten über den entsprechenden Ausgang verlassen. Auch Fortfahrenknoten können mehrfach auftreten, wobei jeder Knoten einen neuen Ausgang darstellt. Äußerlich unterscheiden diese sich nur am Namen.
Loop
Der Loopknoten ist, wie auch der Fortfahren-Knoten, nur innerhalb von Teildialogen der globalen Eingabebehandlung auswählbar. Der wesentliche Unterschied zu diesem ist jedoch, dass der übergeordnete Graph nach Beenden des Teildialogs sich im Zustand des entsprechenden Eingabeknoten befindet und kein neuer Ausgang erzeugt wird.
Return
Returnknoten treten in Untergraphen und Prozeduren auf. Sie verhalten sich ähnlich wie der Fortfahrenknoten: Jeder Returnknoten erzeugt einen Ausgang, entweder am Untergraphenknoten oder an einem Aufrufknoten, der die Prozedur aufruft, indem jener Knoten vorkommt. Der Ablauf des Dialogs folgt nach Beendigung des Teildialogs also dem zum Returnknoten zugehörigen Ausgang.
Bedingung
An einem Bedingungsknoten verzweigt sich der Ablauf des Dialogs in Abhängigkeit von einer frei definierbaren Bedingung. Die Bedingung selbst ist ein spezieller Parameter des Knotens und kann ein beliebiger Ausdruck sein, der zur Laufzeit ausgewertet wird. Das Ergebnis der Auswertung muss ein boolescher Wert sein.
Bedingungsknoten haben immer genau zwei Ausgänge: "wahr" und "falsch". Je nachdem welches Ergebnis die Auswertung der Bedingung liefert, wird der Dialogablauf über den entsprechenden Ausgang fortgesetzt.
Warten
Warteknoten erlauben, im Dialogablauf eine beliebige Verzögerung einzubauen. Die Länge der Ausführungspause wird durch den speziellen Parameter des Knotens angegeben. Dies kann ein beliebiger Ausdruck sein, dessen Auswertung als Ergebnis eine Zahl liefern muss. Diese Zahl gibt die Pausenlänge in Millisekunden an.
Warteknoten haben immer genau einen Ausgang.
Ausgabeknoten
Ausgabe
Der Knotentyp Ausgabe erlaubt die Kommunikation mit externen Geräte. An einem Ausgabeknoten können gleichzeitig mehrere Ausgaben an alle definierten Geräte geschickt werden. Pro Gerät kann eine Liste von Ausdrücken angegeben werden. Jede Liste wird sequentiell abgearbeitet, indem der jeweilige Ausdruck ausgewertet und das Ergebnis an das angegebene Gerät geschickt wird. Die Abarbeitung der Listen erfolgt für alle Geräte parallel.
Klicken Sie links auf eines der Geräte, um sich die Ausgabeliste für dieses Gerät anzeigen zu lassen. Klicken Sie auf die Schaltfläche Neu, um einen weiteren Ausdruck zu dieser Liste hinzuzufügen. Durch Doppelklick auf eine Zeile können Sie diese bearbeiten. Die Reihenfolge der Ausdrücke lässt sich durch Klicken und Ziehen der Maus verändern.
Ausgabeknoten haben immer genau eine Ausgangskante, über die der Dialog nach erfolgter Ausgabe fortgesetzt wird. Zusätzlich zu den auszugebenden Werten können Sie einige Optionen für die Ausgabe konfigurieren:
Gerät erst zurücksetzen:
Wenn Sie diese Option aktivieren, werden alle noch laufenden Ausgaben (z.B. eine im Hintergrund spielende Audiodatei) abgebrochen, bevor die Ausgaben des aktuellen Knotens an die Geräte geschickt werden.
Warten, bis die Ausgabe abgeschlossen ist:
Normalerweise wird die Ausführung des Dialogs fortgesetzt, sobald alle Ausgabeelemente an die Geräte geschickt wurden. Dabei kann die eigentliche Ausgabe (Abspielen einer Audiodatei, Vorlesen eines Textes über TTS, etc.) im Hintergrund noch andauern. Manchmal ist es jedoch notwendig, die tatsächliche Ausgabedauer mit dem Dialogfluss zu synchronisieren. Wenn Sie diese Option aktivieren, wird die Ausführung des Dialogs erst fortgesetzt, wenn alle Geräte zurückmelden, dass die aktuelle Ausgabe komplett abgeschlossen wurde.
Sprachausgabeknoten
Der Sprachausgabeknoten dient der Erzeugung von Sprache mit dem in DialogOS eingebauten Synthese-Modul. Es ist dabei möglich, Klartext zu verwenden oder einen komplexen Ausdruck wie im allgemeineren Ausgabeknoten. Für den ersten Fall wählen Sie als Ausgabe-Typ Text und schreiben Ihren Text in das Ausgabe-Feld. Für einen komplexen Ausdruck wählen Sie die Option Ausdruck und geben diesen anschließend im Ausgabe-Feld ein. Sie können den zu sprechenden String auch mit einem Groovy-Ausdruck berechnen, wenn Sie den Ausgabetyp "Groovy" auswählen.
In dem Auswahlmenü "Stimme" erhalten Sie eine Liste der mit DialogOS installierten Stimmen. Nach Auswahl der Optionen ist es möglich, sich durch einen Mausklick auf Anhören vorab anzuhören, wie der eingegebene Text mit der ausgewählten Stimme klingt.
Je nachdem, ob die Option "Warten bis die Ausgabe abgeschlossen ist" ausgewählt ist, wird der Sprachausgabeknoten während oder nach der Ausgabe über einen einzelnen Ausgang verlassen.
Eingabeknoten
Eingabe
Der Knotentyp Eingabe dient zur Verarbeitung von Eingaben externer Geräte. Dabei kann es sich z.B. um das Ergebnis eines Spracherkenners handeln, der den Inhalt einer Benutzereingabe an die Dialogsteuerung liefert, oder um eine Datenbank, die auf Anfrage hin eine Liste von Datensätzen zurückliefert.
Die eigentliche Verarbeitung findet durch eine Liste von Mustern statt, die Sie als Parameter der Eingabeknotens angeben können. Für jedes dieser Muster erhält der Eingabeknoten eine Ausgangskante. Zur Laufzeit wird nun die tatsächliche Eingabe mit den angegebenen Mustern verglichen, und zwar in der Reihenfolge, in der die Muster angegeben sind. Das erste Muster, das auf die Eingabe passt, wird ausgewählt und der Dialog über die dazugehörige Ausgangskante fortgesetzt. Der Dialog verzweigt sich an diesem Knoten also in Abhängigkeit von der Eingabe. Gleichzeitig können Sie durch Variablenbindungen den Wert der Eingabe oder von Eingabeteilen in Variablen speichern, um zu späterem Zeitpunkt darauf zugreifen zu können. Sollte zur Laufzeit keines der angegebenen Muster auf eine Eingabe passen, so wird diese Eingabe ignoriert, und die Ausführung wartet auf die nächste Eingabe. Um dies zu verhindern, können Sie als letztes Muster der Liste das anonyme Variablenmuster _
angeben. Dieses passt immer auf alle Eingaben, so dass Sie eine Ausgangskante für alle Eingaben erhalten, die Sie nicht vorher explizit erkannt haben. Eine detaillierte Beschreibung zu den unterschiedlichen Mustervarianten finden Sie unter Muster.
Die Bearbeitung der Muster funktioniert analog zu den Ausgabeknoten: Mit "Neu" und "Löschen" können Sie Elemente der Liste erzeugen bzw. entfernen. Per Doppelklick können Sie die Muster bearbeiten und per Klicken und Ziehen die Reihenfolge verändern.
Eingabeknoten enthalten die folgenden zusätzlichen Optionen:
Gerät:
Normalerweise werden an Eingabeknoten die Eingaben aller Geräte berücksichtigt. Sie können jedoch auch angeben, dass an diesem Knoten nur die Eingabe eines einzigen Geräts bearbeitet werden soll.
Bisherige Eingaben verwerfen:
Es ist durchaus möglich, dass ein externes Gerät Eingaben an die Dialogsteuerung schickt, während diese sich nicht gerade an einem Eingabeknoten befindet. Diese Eingaben werden in einer Schlange gespeichert, so dass keine Eingabe verloren geht. Bei der Ausführung des nächsten Eingabeknotens wird dann das erste Element dieser Schlange (also die älteste Eingabe) extrahiert und bearbeitet. Dies kann in Einzelfällen nicht erwünscht sein. Aktivieren Sie diese Option, um am Anfang des Eingabeknotens die Eingabeschlange zu leeren und auf eine "neue" Eingabe zu warten.
Zeitbegrenzung:
Mithilfe dieser Option können Sie eine zusätzliche Ausgangskante einfügen, über die der Dialog fortgesetzt wird, wenn für eine bestimmte Zahl von Millisekunden keine Eingabe eintrifft. Dadurch können Sie verhindern, dass der Dialog beliebig lange auf eine Eingabe wartet. Die Länge der Zeitbegrenzung kann durch einen komplexen Ausdruck angegeben werden, der bei jeder Ausführung des Knotens ausgewertet wird. Dadurch können Sie die Zeitbegrenzung in Abhängigkeit vom Dialog variieren.
Barge-In:
Barge-In bezeichnet die Möglichkeit für den Dialogbenutzer, eine Eingabe zu tätigen, noch während die Ausgabe bearbeitet wird, im Sinne von gesprochener Sprache also dem System ins Wort zu fallen. Um dies zu realisieren ist es zum einen notwendig, dass der Spracherkenner bereits aktiviert wird, während die Ausgabe noch läuft, und zum anderen, dass die laufende Ausgabe abgebrochen wird, sobald eine Eingabe erkannt wurde. Zum anderen stellt sich das Problem, dass man dem Benutzer z.B. ein Zeitfenster von einigen Sekunden zum antworten lassen möchte, dass aber nicht klar ist, wie lange es dauert, die Systemausgabe abzuspielen, sprich ab wann dieses Zeitfenster gemessen werden sollte. Dieser komplexen Problematik widmet sich die Option "Barge-In". Eine angegebene Zeitbegrenzung läuft ab dem Moment, wo alle Geräte, für die die Option "Warten" aktiviert wurde, gemeldet haben, dass die Ausgabe komplett abgearbeitet wurde. Sobald eine Eingabe eintrifft, kann dann an ausgewählte Geräte ein Signal geschickt werden, alle laufenden Ausgaben abzubrechen ("Reset").
Spracherkennung
Der Spracherkennungsknoten ist eine Spezialvariante des Eingabeknotens, bei der Eingaben des eingebauten Spracherkenners bearbeitet werden. Die Funktionsweise ist weitestgehend mit der des allgemeinen Eingabeknoten identisch. Als Besonderheit ist zu nennen, dass Sie die Grammatik hier direkt aus einer Auswahlliste wählen und mit der Schaltfläche Ausprobieren testen können. Wählen Sie als Grammatik "<Automatisch aus den Mustern generieren>", so erstellt das Dialogsystem zur Laufzeit automatisch eine Grammatik für den Erkenner, der das Vokabular aus den Eingabemustern enthält. In allen anderen Fällen muss eine Grammatik vorliegen.
Wenn eine automatisch generierte Grammatik - oder eine ohne Sprachinformation - ausgewählt wird, müssen Sie noch eine Sprache aus der Auswahlliste wählen. Die Option "<Standardsprache>" entspricht der unter Dialog-Einstellungen. Enthält die von Ihnen gewählte Grammatik jedoch bereits eine Sprachinformation, so werden die ausgesuchten Optionen ignoriert.
Sowohl beim Durchlaufen als auch beim Ausprobieren des Knotens erscheint ein Pop-up-Fenster, welches den aktuellen Zustand des Erkenners darstellt. Ist die Erkennung abgeschlossen, so wird der erkannte Text im Anzeigefeld dargestellt und der Knoten anschließend über den zur Eingabe passenden Ausgang verlassen.
Globale Einstellungen für den Spracherkenner
Im Menüpunkt Dialog -> Spracherkenner können Sie globale Einstellungen für den Spracherkenner vornehmen, die dann für alle Spracherkenner-Knoten gleichzeitig gelten.
Die folgenden Einstellungen sind möglich:
- Standardsprache: Wählen Sie hier die Sprache aus, die in einem Spracherkenner-Knoten verwendet wird, wenn Sie dort unter "Sprache" die Option "<Standardsprache>" auswählen.
- Stiller Modus: Unter normalen Umständen verwendet jeder Spracherkenner-Knoten das Mikrofon Ihres Computers und verwandelt die gesprochenen Äußerungen des Benutzers in Wörter. Wenn Sie die Option "Stiller Modus" auswählen, öffnet DialogOS stattdessen bei jeder Ausführung eines Spracherkenner-Knotens ein Eingabefenster, in dem der Benutzer seine Äußerung eintippen kann. Dies kann in der Entwicklungsphase eines Dialogs oder bei der Verwendung von DialogOS in einer ruhigen Umgebung nützlich sein.
- Aussprachewörterbuch bearbeiten: Der eingebaute Spracherkenner enthält ein großes Wörterbuch von Wörtern in der jeweiligen Sprache, zusammen mit Informationen, wie man diese Wörter ausspricht. Wenn Sie in Ihrem Dialog Wörter verwenden möchten, die nicht in diesem Wörterbuch enthalten sind, können Sie sie in ein Aussprachewörterbuch eintragen, das Sie durch Klick auf den "Bearbeiten"-Button editieren können. Mehr Informationen über Aussprachewörterbücher finden Sie hier.
NXT-Knoten
Die beiden NXT-Knoten "NXT Programm starten" und "NXT Programm stoppen" ermöglichen die Kommunikation mit einem LEGO-Mindstorms-Roboter. Während ersterer Knoten dafür verwendet werden kann, ein NXT-Programm zu starten, dient der zweite dem Überprüfen, ob ein Programm zum aktuellen Stand läuft und dieses gegebenfalls zu stoppen.
NXT Programm starten
Der Knotentyp "NXT Programm starten" startet ein Programm auf dem LEGO-Mindstorms-Roboter. Als einziger Parameter in diesem Knoten wird der Name des aufzurufenden Programms verwendet. Mit der Schaltfläche "Auswählen" kann man sich alle Programme auf dem angeschlossenen NXT anzeigen lassen und eines auswählen. Wird der Knoten ausgeführt, so wird das Programm auf dem NXT gestartet und der Knoten danach wieder verlassen.
NXT Programm stoppen
Wenn Sie prüfen möchten, ob zur Laufzeit ein Programm auf Ihrem NXT und dieses gegebenfalls stoppen möchten, können Sie den Knotentyp "NXT Programm stoppen" verwenden. Der Knoten hat im Normalfall einen Ausgang, über den er verlassen wird, nachdem ein Stop-Signal an den Roboter geschickt wurde. Wählen Sie die Option "Zuerst prüfen, ob ein Programm läuft", so erhält man einen weiteren Ausgang, über den der Knoten verlassen wird, wenn zur Laufzeit kein Programm auf dem NXT verarbeitet wird.
DialogOS bietet zwei Arten von Variablenknoten: einen zum Setzen einer Variablen und einen zum Testen eines Variablenwerts.
Variable setzen
Die speziellen Parameter dieses Knotentyps sind zum einen die Variable, der ein neuer Wert zugewiesen werden soll, sowie ein Ausdruck, der den neuen Wert bestimmt. Zur Ausführungszeit des Dialogs wird dieser Ausdruck ausgewertet und das Ergebnis in die ausgewählte Variable geschrieben. Ist keine Variable ausgewählt oder wird kein Ausdruck angegeben, so tritt an diesem Knoten ein Laufzeitfehler auf und die Ausführung wird abgebrochen.
Variable testen
Sie können eine ausgewählte Variable auf verschiedene Werte testen. Diese Werte werden durch eine Liste von Mustern beschrieben, wobei der Knoten für jedes Muster genau eine Ausgangskante erhält. Zur Laufzeit wird der aktuelle Wert der ausgewählten Variablen von oben nach unten mit der Liste der angegebenen Muster verglichen. Das erste passende Muster wird ausgewählt und die Ausführung über die dazugehörige Ausgangskante fortgesetzt.
Optional können Sie eine zusätzliche Kante einfügen, über die der Dialog fortgesetzt wird, wenn keines der angegebenen Muster passt. Wenn Sie auf diese Option verzichten und zur Laufzeit keines der Muster auf den aktuellen Wert der Variablen passt, so tritt ein Laufzeitfehler auf und die Ausführung wird abgebrochen.
Skriptknoten
Skripte SkriptknotenKnoten SkriptknotenSkriptknoten erlauben die Ausführung von beliebigem Code, insbesondere um die Variablen des Graphen zu bearbeiten. Skripte können dabei auf die Variablen sowie die Hilfsfunktionen des Graphen zugreifen.
Skriptknoten haben immer genau einen Ausgang über den der Dialog nach Ausführung des Skripts fortgesetzt wird.
Sprungziel
Sprungzielknoten können innerhalb aller (Teil-)Dialoge auftreten. Sie dienen als Ziel von Sprungknoten. Ein Sprungzielknoten hat genau einen Ausgang, über den der Ablauf des Dialogs fortgesetzt wird, wenn ein Sprung auf jenen erfolgt ist. Der Knoten hat keine speziellen Parameter.
Sprung
Sprungknoten bieten die Möglichkeit, rasch von einem Dialogzustand in einen anderen zu springen. Dabei ist es möglich, sowohl in übergeordnete Graphen zu springen, als auch innerhalb des aktiven Graphen. Nicht möglich hingegen sind Sprünge zu untergeordneten oder nebengeordneten Graphen. Bei Sprüngen in übergeordnete Graphen können Variablen (und deren Inhalte) verloren gehen, genau dann nämlich, wenn diese nur im Untergraphen aktiv waren.
Das Sprungziel ist ein spezieller Parameter des Sprungknotens und ist immer der Name eines Sprungzielknotens.
Untergraph
Untergraphknoten repräsentieren Teildialoge, die durch einen eigenen Graphen dargestellt werden. Ein solcher Untergraph kann wiederum eine eigene Menge von privaten Variablen und Hilfsfunktionen enthalten, die nur innerhalb des Untergraphen verfügbar sind (ähnlich dem Konzept lokaler Variablen und Prozeduren in der Programmiersprache Pascal).
Ein Doppelklick auf das Symbol eines Untergraphknoten öffnet ein neues Fenster, in dem Sie den Teildialog modellieren können. Untergraphen können selbst wiederum Untergraphknoten enthalten, so dass eine beliebig tiefe Schachtelung möglich ist.
Den Namen eines Untergraphknotens können Sie ändern, indem Sie den Untergraphen öffnen und darin den Menübefehl "Umbenennen" im Menü "Subdialog" auswählen.
Die Anzahl der Endknoten des Untergraphen bestimmt die Anzahl der Ausgänge des Untergraphknoten: Für jeden Endknoten des Untergraphen erhält der Untergraphknoten genau einen Ausgang.
Die Ausführung eines Untergraphknotens führt zu einem Sprung zum Startknoten des Untergraphen. Je nachdem, in welchem Endknoten die Ausführung des Untergraphen endet, wird die Ausführung des übergeordneten Dialogs über die dazugehörige Ausgangskante des Untergraphknotens fortgesetzt.
Prozedurknoten
Prozedurknoten beschreiben - ähnlich wie Untergraphknoten - Teildialoge. Im Gegensatz zu Untergraphknoten können Prozedurknoten nicht direkt durch Kanten verbunden werden. Prozedurknoten repräsentieren vielmehr Teildialoge, die von mehreren verschiedenen Stellen aus angesprungen werden können, wobei die Ausführung des Dialogs nach Beendigung des Teildialogs wieder an die ursprüngliche Aufrufstelle zurückkehrt. Aus diesem Grund haben Prozedurknoten selbst keine Ausgänge. Es ist auch nicht möglich, eine Ausgangskante eines anderen Knotens mit einem Prozedurknoten zu verbinden. Typische Beispiele für Dialogprozeduren sind wiederkehrende Dialogmuster wie Absicherungs- oder Klärungsdialoge.
Um die Flexibilität von Prozedurknoten zu erhöhen, besteht zusätzlich die Möglichkeit, für eine Prozedur eine Liste von Parametern zu definieren. Diese können dann bei jedem Aufruf der Prozedur mit aktuellen Argumentwerten belegt werden. Innerhalb der Prozedur verhalten sich Parameter genau wie andere Variablen. Die Liste der Parameter können Sie bearbeiten, indem Sie die Prozedur öffnen und dann im Menü "Subdialog" den Befehl "Parameter" wählen. Es erscheint nun ein Fenster mit einer Liste der Parameter wie bei den lokalen Variablen.
Zusätzlich bieten Prozedurknoten die Möglichkeit Werte zurückzgeben. Um dies zu nutzen, wählen Sie im Menü "Subdialog" den Befehl "Rückgabewerte". In der Liste lassen sich lokale Variablen anlegen, die nach dem Durchführen einer Prozedur an den Aufrufknoten übergeben werden, wo sie weiter verarbeitet werden können.
Aufrufknoten
Aufrufknoten dienen zum Aufruf von Prozeduren. Mit ihrer Hilfe kann eine Prozedur von mehreren Stellen im Dialog aus - ggf. mit unterschiedlichen Argumenten - angesprungen werden. Die speziellen Parameter sind zum einen die aufzurufende Prozedur sowie die beim Aufruf an die Prozedur zu übergebenden Argumente und die zu verarbeitenden Rückgabewerte. Jedes Argument und jeder Rückgabewert kann ein komplexer Ausdruck sein. Argumente werden zum Zeitpunkt des Aufrufs ausgewertet und Rückgabewerte nach dem Durchlaufen der Prozedur. Es bietet sich an, für Rückgabewerte nur eine Variable anzugeben, in diese dann der jeweilige Rückgabewert gespeichert wird.
Die Anzahl der Ausgänge eines Aufrufknotens entspricht der Anzahl der Endknoten der aufzurufenden Prozedur. Die Ausführung eines Aufrufknotens führt zu einem Sprung zum Startknoten der Prozedur, wobei die Parameter der Prozedur mit den konkreten Argumenten gefüllt werden. Je nachdem, in welchem Endknoten die Ausführung der Prozedur endet, wird die Ausführung des übergeordneten Dialogs über die entsprechende Ausgangskante des Aufrufknotens fortgesetzt.
Nächste Seite: Einen Dialog ausführen