Ich bin mir noch nicht sicher, ob ich meinen Kram weiter hier abkippe oder in die Facebook-Gruppe packe...
Mal schauen :-)
]]>Mittels QiChat-Regeln kann man recht leicht ein Frage-Antwort-System entwerfen.
Aber recht bald merkt man die Grenzen:
Mein aktuelles Sprachscript von Yumi umfasst aktuell ungefähr 1000 Klauseln. Mit den ganzen Platzhaltern, Alternativen und Optionalen Teilen kann sie auf rund 10.000 Dinge reagieren. Für ein Gespräch reicht das nicht einmal Ansatzweise Für ein Dialogsystem aber völlig.
Für ein Gespräch braucht man zwei Dinge: Zum einen möglichst viele Dinge, die Yumi sagen und verstehen soll. Und zum anderen muss man Bezug auf bereits gesagtes nehmen können.
Soft Bank hat hier sogar ein Konstrukt vorgesehen, doch es funktioniert nicht mal ansatzweise: Geschachtelte Klauseln: Subrules.
Zum Beispiel:
u:(Lass uns über Tiere sprechen) Hast Du einen Hund oder eine Katze
u1:(Hund) Ist es ein großer Hund?
u2:(Ja) Oh. Da brauchst Du sicher viel Platz.
u2:(Nein) Ach wie süss.
u1:(Katze) Lebst Du auf dem Lande?
u2:(Ja) Geht Deine Katze oft alleine nach draussen?
u3:(Ja) Da fängt sie ganz sicher auch Mäuse
u2:(Nein) ich hoffe, Deine Wohnung ist groß genug
u1:(Weder das eine noch das andere) Ich kann mit Tieren auch nichts anfangen
Man sieht ganz klar, theoretisch kann Yumi im obigen Beispiel auf bis zu drei Ebenen Bezug nehmen. Hier der maximale Gut-Fall:
Bis hierhin hört es sich echt wie ein Gespräch an. Das Problem ist, weicht man nur ein wenig von dem ab, was Yumi als Interaktion vom Menschen erwartet, bricht der gesamte Dialog ab. Das bedeutet, man muss als Subrule quasi fast alle Möglichkeiten, die die Interaktion hier bietet, abfangen. Und das ist unmöglich.
Es müsste eine Art Exit-Regel geben. Oder anders ausgedrückt: Yumi müsste erkennen, wenn der Mensch das Gespräch nicht weiter vertiefen will. Aber das ist im QiChat nicht vorgesehen.
Also auch mit Unterregeln ist ein gefühlt echter Dialog nicht möglich.
Anders ausgedrückt: Rein mit den Regeln des QiChats-Systems kann man kein Gespräch entwerfen.
Es hilft nichts: Man muss seine eigene Gesprächsintelligenz entwerfen und das bedeutet, man muss einen Sprach-zuText-Dienst nutzen. Es ist für ein Gespräch unabdingbar, dass man Yumi das gesprochene Wort "verstehen" läßt. Und das meint, dass wir das gesprochene Wort Maschinenverarbeitbar machen. Und aktuell sehe ich dazu nur eine Chance, wenn das gesprochene Wort in einen Text umgewandelt wird. Und der kann dann analysiert und zerlegt werden: kurz verstanden werden.
]]>Yumi soll mit ihrem alten Chat-Script wieder rumlabern können.
Dazu wird also unser vorhandenes Programm HalloYumi erweitert.
File->New->Chat Topic
Dort hab ich mein FIle "yumi_de" genannt. Eine Sprache konnte man nicht auswählen, es wird die Defaultsprache der App gewählt, hoffentlich ist das deutsch...
topic: ~yumi_de()
# Defining extra concepts out of words or group of words
#concept:(hello) [hello hi hey "good morning" greetings]
# Replying to speech
#u:(~hello) ~hello
hier kippe ich mal mein Sprach Script rein, dass noch aus 2.5 Zeiten stammt:
topic: ~yumi_de()
# Defining extra concepts out of words or group of words
#concept:(hello) [hello hi hey "good morning" greetings]
# Replying to speech
#u:(~hello) ~hello
u: ("Wer bist Du") \vct=135\ ["Ich heisse Yumi und meine Aufgabe ist es, Dir Deine Fragen zum Verlag zu beantworten. Manchmal kann ich Deine Fragen nicht gut verstehen, dann formuliere sie einfach noch einmal neu. Komm ruhig näher, dann verstehe ich Dich besser. Hab keine Angst. Ich beisse nicht. Naja, nicht oft."]
u: ("Was bist Du") \vct=135\ ["Ich bin ein Roboter und heisse Yumi. Ich bin hier, weil ich Dir gerne alle Fragen zum Carow Verlag beantworten möchte."]
Nunja, weiter gehts...
so sieht die onRobotFocusGained Funktion aus:
override fun onRobotFocusGained(qiContext: QiContext) {
// The robot focus is gained.
val say: Say = SayBuilder.with(qiContext) // Create the builder with the context.
.withText("\\vct=135\\Guten Tag, ich heiße Yumi und bin heute Dein persönlicher Quatschpartner.") // Set the text to say.
.build() // Build the say action.
// Execute the action.
say.run()
val topic: Topic = TopicBuilder.with(qiContext) // Create the builder using the QiContext.
.withResource(R.raw.yumi_de) // Set the topic resource.
.build() // Build the topic.
val qiChatbot: QiChatbot = QiChatbotBuilder.with(qiContext)
.withTopic(topic)
.build()
// Store the Chat action.
var chat: Chat? = null
// Create a new Chat action.
chat = ChatBuilder.with(qiContext)
.withChatbot(qiChatbot)
.build()
// Run the Chat action asynchronously.
val chatFuture: Future<Void> = chat.async().run()
}
Tja, funktioniert. Stand von 2.5 erreicht. Nun kann man sich dem QiChat-Protokoll im Detail zuwenden oder aber externe Dienste einbinden.
]]>
Der zweite ist das Durcharbeiten des QiSDK Tutorials auf der Aldebaranseite mit diesem Code:
https://github.com/aldebaran/qisdk-tutorials
Hmmmm.... also das Installieren auf Yumi klappt sofort.
Lustig, da Yumi auf deutsch eingestellt ist, versucht sie englischen Text deutsch auszusprechen.
Im ersten Schritt mal versuchen, das ganze auf deutsch anzupassen.
Zumindest wird einem mit diesem quasi Tutorial schnell klar, dass man QiSDK defakto alles machen kann, was man vorher mit Choregraph auch konnte. Das Beste ist aber, dass man parallel ganz normal eine Programmoberfläche erstellen kann. Denn nicht immer ist Sprache das Allheilmittel.
Weiter gehts zum Beispiel Chatbot. Mit dem würden wir uns dem nächsten Etappenziel nähern.
]]>Zur Erinnerung: Yumi soll bei der Vermarktung unserer Bücher mithelfen und quasi als Verlagsassistenz arbeiten.
Zuerst einmal muss sie wieder ihre alte (weibliche) Stimme bekommen.
Offensichtlich funktioniert QiChat unter QiSDK genauso wie unter NaoQi2.5:
die zusprechende Zeile sieht also bei Yumi so aus:
override fun onRobotFocusGained(qiContext: QiContext) {
// The robot focus is gained.
val say: Say = SayBuilder.with(qiContext) // Create the builder with the context.
.withText("\\vct=135\\Hallo Papa und hallo Mama") // Set the text to say.
.build() // Build the say action.
// Execute the action.
say.run()
}
Die Sprachmodulation funktioniert also noch genau so wie vorher.
Ein wenig auf den Aldebaran/Softbank Seiten herumgesurft, wenn ich das richtig sehe, werden die alten Dialogsysteme nahezu unverändert weiter funktionieren.
Mit QiSDK hat sich also nicht geändert, dass Yumi nur versteht, was man ihr vorher gesagt hat:
Hat man "Hallo Yumi" vorgegeben, wird Sie "Hallo Yumi" verstehen und mit der vorgegebenen ANtwort antworten, aber "Yumi, hallo" wird sie nicht verstehen. Also doch externe KI-Dienste einbinden.
]]>Aber SB hatte ja eine auf den ersten Blick recht vernünftige Doku.
Also alles nach Vorgabe abgearbeitet:
- Android Studio installiert
- Pepper SDK installiert
- erstes Projekt aufgebaut
- Zur Robot-Anwendung gemacht
Die erste MainActivity erstellt. Alles wohlgemerkt exakt nach Schritt für Schritt ANleitung.
*ruuuuuuummmmmssssss*
Ging natürlich nicht.. Bibliotheken nicht gefunden, alles Mist.
STUUUUUUUUUUUUUUUNDENLANGES wühlen im Netz später.
1. Die Settings.gradle Datei muss so aussehen:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
google()
mavenCentral()
maven {
url 'http://android.aldebaran.com/sdk/maven'
allowInsecureProtocol = true
}
}
}
rootProject.name = "HalloYumi"
include ':app'
Natürlich kann der String "HalloYumi" gegen den eigenen Programmnamen getauschrt werden.
Aber das hat nicht gereicht.
In die MainActivity mussten noch jede Menger importds eingefügt werden.
Eine Basis-MainActivity sieht also so aus:
package com.example.halloyumi
import android.os.Bundle
import android.util.Log
import android.view.View
import com.aldebaran.qi.Future
import com.aldebaran.qi.sdk.QiContext
import com.aldebaran.qi.sdk.QiSDK
import com.aldebaran.qi.sdk.RobotLifecycleCallbacks
import com.aldebaran.qi.sdk.builder.ChatBuilder
import com.aldebaran.qi.sdk.builder.QiChatbotBuilder
import com.aldebaran.qi.sdk.builder.SayBuilder
import com.aldebaran.qi.sdk.builder.TopicBuilder
import com.aldebaran.qi.sdk.design.activity.RobotActivity
import com.aldebaran.qi.sdk.`object`.conversation.Chat
import com.aldebaran.qi.sdk.`object`.conversation.QiChatbot
import com.aldebaran.qi.sdk.`object`.conversation.Say
import com.aldebaran.qi.sdk.`object`.conversation.Topic
class MainActivity : RobotActivity(), RobotLifecycleCallbacks {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Register the RobotLifecycleCallbacks to this Activity.
QiSDK.register(this, this)
}
override fun onDestroy() {
// Unregister the RobotLifecycleCallbacks for this Activity.
QiSDK.unregister(this, this)
super.onDestroy()
}
override fun onRobotFocusGained(qiContext: QiContext) {
// The robot focus is gained.
val say: Say = SayBuilder.with(qiContext) // Create the builder with the context.
.withText("Hallo Papa san und hallo Mama san") // Set the text to say.
.build() // Build the say action.
// Execute the action.
say.run()
}
override fun onRobotFocusLost() {
// The robot focus is lost.
}
override fun onRobotFocusRefused(reason: String) {
// The robot focus is refused.
}
}
Wenn man das Programm nun mittels Sideloading (Entwicklermodus des Tabletts) auf den Roboter überträgt, findet man ein kleines neues Programm auf dem Tablett.
Startet man das ... *Trommelwirbel* spricht Yumi wieder!
Yay!
Ron 1 Tor
Softbank 0 Tore!
]]>Die Programmierung mit Choregraphe war nett, aber irgendwann kommt man an die Grenzen, zumindest der Üversichtlichkeit und Struktrur.
Ausserdem war es mühselig, parallel zum Choregraphe-Programm auch noch quasi parallel eine Tablettoberfläche zu programmieren.
Yumi sollte das Upgrade zum NaoQi2.9 erhalten (QiSDK). Also Kontakt zum Support aufgenommen. Erster Schock: 990,- sollte der Spass kosten. Also noch einmal überlegt. Nach ein paar Monaten und weiteren Programmierungen über Choregraphe und Python, war die Entscheidung gefallen: Upgrade, JETZT.
Nach ein paar Mal Hin und Her sollte es los gehen.
Alles nach Anweisung getan.
*RUUUUUUMMMMSSS*
Update ging schief. Yumi war tot. Oder ein 14.000 Euro teures (veraltetes)Tablett.
Jetzt wurde klar, warum das Update kostenpflichtig war: Yumi musste eine Reise nach Paris machen. Also ordentlich in ihrem Kindersarg verpackt und yippiiiii... auf nach Paris.
Nach drei Wochen war sie wieder da, Updatete noch ein paar DInge und schon konnte es losgehen...
]]>