Die Community zu .NET und Classic VB.
Menü

MS Agent 2.0

 von 

Übersicht 

Mit dem Begriff "MS Agents" weiß vielleicht mancher nichts anzufangen. Jedoch schon seit einiger Zeit sind uns die Agenten von Microsoft bekannt: In Office begleitet(e) uns die Klammer und seit Windows XP führt uns neuerdings ein Hund durch die Dateisuche. Bei Manchen sind die Agenten ein wenig verpönt aber für Computerneulinge können sie eine große Hilfe sein: Große, graue Programme mit vielen Buttons wirken abschreckend auf Computerneulinge. Wenn sie aber dagegen von einem kleinen Papageien langsam durch die Programmfunktionen geführt werden, ist das bestimmt eine Erleichterung.

Kommen wir zu dem "conversational interface": Sie werden bestimmt im ersten Moment staunen, wenn der Charakter anfängt zu sprechen. Es mag auch schon ein bisschen nach Sciencefiction klingen, aber die Figuren können sogar auf ihre Stimme reagieren. Vorerst aber leider nur in Englisch, doch in nicht all zu ferner Zukunft wird es sicherlich auch für die Deutsche Sprache eine SR (Speech Recognition = Spracherkennung) für die "MS Agents" geben.

Mit freundlichen Grüßen

Johannes Pfeiffer

Voraussetzungen  

Auf der Webseite http://www.microsoft.com/msagent/downloads.htm können alle benötigten Komponenten heruntergeladen werden. Bei Windows XP wird bereits das meiste mitgeliefert. Achtung: Windows XP hat schon von Haus aus die SAPI 5.0 (Speech Application Programming Interface). Für "MS Agent 2.0" wird aber die SAPI 4.0 benötigt, welche sie deshalb trotzdem herunterladen müssen. Folgend sind die Komponenten aufgelistet die sie benötigen. Falls sie wie oben erwähnt ein neues Betriebsystem oder ME bzw. 2000 verwenden entfällt Möglicherweise der Download einiger Komponenten. Genauere Informationen gibt es auf der oben angegebenen Webseite.

  • Microsoft Agent core components
  • language component (German)
  • Character (Peedy und Merlin)
  • Text-to-speech engines (German)
  • Microsoft SAPI 4.0a runtime binaries
  • Speech Control Panel

Tipp: Um viele neue Charaktere zu erhalten gehen Sie auf http://www.msagentring.org in den Bereich Download Gallery.

Installieren Sie bitte alle Komponenten bevor wir zum nächsten Kapitel übergehen. Beachten Sie auch, dass es sich hierbei um die Installation von Betriebsystem-Komponenten handelt, welche später nicht mehr deinstalliert werden können.

Charaktere laden und anzeigen  

Beginnen Sie ein neues Standard-VB-Projekt. Fügen Sie dem Projekt jetzt die ActiveX-Komponente "Microsoft Agent Control 2.0" hinzu.


Abbildung 1: Visual Basic Komponentenfenster

Erstellen Sie solch ein Steuerelement und einen Button auf Ihrer Form. Zuerst einmal wollen wir unseren Charakter laden lassen und ihn dann anzeigen.

Dim Peedy As IAgentCtlCharacterEx

Private Sub Command1_Click()

  Agent1.Characters.Load "Peedy1", "Peedy.acs"
  Set Peedy = Agent1.Characters("Peedy1")

  'Charakter anzeigen
  Peedy.Show

End Sub

Listing 1: Anzeigen des Agenten

Der aufmerksame Leser fragt sich jetzt wie wir auf die Datei "Peedy.acs" kommen, welche der Methode Load als 2. Parameter dient. Nun, alle neu installieren Charaktere liegen im Verzeichnis "%windir%\msagent\chars" Wenn wir eine Datei aus diesem Verzeichnis verwenden brauchen wir den Pfad nicht anzugeben. Liegt die ACS Datei (der Charakter) an einem anderen Ort, so muss natürlich der komplette Pfad angegeben werden. Will man den Standard-Charakter laden lässt man den letzten Parameter weg.

Um den Charakter zu verstecken benutzen wir übrigens:

Peedy.Hide

Gut, starten wir unser Programm und klicken auf den Button! Mit einer kleinen Animation erscheint "Peedy" Wir wollen uns etwas vertraut mit ihm machen. Beobachten Sie ihn eine Weile. Er steht nicht einfach nur still da. Er bewegt z.B. die Augen und die Federn, ab und zu frisst er einen Keks und reibt sich dann den Bauch. Nach einer Zeit fängt er an zu schlafen oder zieht sich eine Sonnenbrille auf.


Abbildung 2: Agent und Trayicon

Machen wir einen Rechtsklick auf ihn, oder das gerade erschienene Symbol in der Taskleiste, so können wir unseren Freund ausblenden. Um ihn wiederherzustellen machen wir einen Doppelklick auf das Symbol in der Taskleiste. Sie können Peedy auch ganz einfach verschieben indem Sie ihn an die gewünschte Position ziehen.

Animationen  

Nachdem wir einige Animationen des Charakters gesehen haben, möchten wir ihn nun gezielt eine Animation abspielen lassen. Jede Figur enthält eine Palette an Standardanimationen und eigenen Animationen. Diese können über die Methode Play abgespielt werden. Erstellen wir einen neuen Button und schreiben folgenden Code:

Private Sub Command2_Click()
  Peedy.Play "Searching"
End Sub

Listing 2: Animation starten

Der Methode Play wird der Name der Animation übergeben. In diesem Fall ist das die Animation "Searching". Diese wird im Normalfall solange abgespielt bis wir die Methode Stop aufrufen. Das machen wir mit folgendem Code:

Private Sub Command3_Click()
  Peedy.Stop
End Sub

Listing 3: Animation stoppen


Abbildung 3

Jede Animation hat einen Namen über den sie abgespielt wird. Um an diese Animationsnamen zu kommen, gibt es mehrere Möglichkeiten.
1. Wir Suchen im Internet oder der SDK nach diversen Animationslisten für jeden Charakter...
2. Mit einem ganz simplen Trick erhalten wir alle Animationsnamen

Dazu fügen wir eine Listbox und einen Button zu unserem Projekt hinzu.

List1.Clear
For Each Animation In Peedy.AnimationNames
  List1.AddItem Animation
Next

Listing 4: Animationsnamen finden

Unser Agent kann den Benutzer auf bestimmte Dinge hinweisen. Dazu zeigt er auf eine bestimmte Position auf dem Bildschirm. Dies wird mit der Methode GestureAt ermöglicht. Als Parameter erwartet diese Methode die Koordinaten. Allerdings in Pixel! Deshalb rechnen wir sie vorher noch von Twips nach Pixel um. Mit folgendem Code zeigt Peedy auf Button5:

Private Sub Command5_Click()
  Peedy.GestureAt (Form1.Left + Command5.Left) / Screen.TwipsPerPixelX, _
      (Form1.Top + Command5.Top) / Screen.TwipsPerPixelY
End Sub

Listing 5

Wenn Peedy zu weit von dem Objekt entfernt ist können wir schlecht sehen wo er hinzeigt. Deshalb soll er zu dem Button hinfliegen anstatt nur darauf zu zeigen. Das erreichen wir mit MoveTo.

Private Sub Command6_Click()
  Peedy.MoveTo (Form1.Left + Command6.Left) / Screen.TwipsPerPixelX, _
      (Form1.Top + Command6.Top) / Screen.TwipsPerPixelY
End Sub

Listing 6

Kommen wir jetzt zum Kapitel, in dem Peedy sprechen lernt.

Sprech- und Denkblasen  

Um Peedy zum Sprechen zu bringen braucht es nur einen simplen Befehl:

Peedy.Speak "Hallo Welt!"

Listing 7

Wir hören jetzt Peedy "Hallo Welt" rufen. Alternativ kann man der Methode Speak als 2. Parameter eine Sounddatei übergeben, welche dann abgespielt wird. Der Ton wird mithilfe einer TTS Engine erzeugt (TTS = "Text to Speech"). "Hallo Welt" zu rufen ist allerdings nicht sehr praxisnah. Vielleicht sollte Peedy lieber "Guten Tag" sagen und damit den Benutzer begrüßen. Bei jedem Programmstart ein monotones "Guten Tag" zu hören, das hält kein Anwender lange aus. Sie müssen für ein wenig Abwechslung sorgen. Hier gibt es einen Kniff: Wir geben dem Agenten verschiedene Texte zu Auswahl, von denen einer per Zufall gesprochen wird. Um die verschiedenen Texte zu trennen setzten wir ein | - Zeichen dazwischen.

Peedy.Speak _
"Guten Tag|Hallo|Willkommen|Ich Grüße sie|Freut mich sie zu sehen"

Listing 8

Durch das Verwenden verschiedener Willkommensgrüße wirkt Peedy natürlicher. Damit Peedy nicht redet, sondern denkt, verwenden wir die Methode Think anstelle von Play. Der Unterschied von Speak und Think besteht darin, dass einmal eine Sprech-, das andere mal eine Denkblase verwendet wird.

Andere Sprachen und Stimmen

Um eine andere Sprache als Deutsch zu wählen setzten sie die Eigenschaft LanguageID auf den gewünschten Landescode. Hier setzten wir die Sprache auf Englisch

Agent1.Characters("Peedy").LanguageID = &H809

Listing 9

Die "Learnout & Hauspie TTS3000" Engine besitzt auch andere Sprachmuster. Das folgende Beispiel setzt eine weibliche Stimme für die obige Sprache (Englisch)

Agent1.Characters("Peedy").TTSModeID = _
"{227A0E40-A92A-11D1-B17B-0020AFED142E}"

Listing 10

Um andere Sprachen (hier Englisch) benutzen zu können muss natürlich die entsprechende TTS Engine installiert sein.

Speech Output Tags  

Die TTS-Engine bietet noch einige interessante Features. Der Text kann z.B. betont, oder geflüstert gesprochen werden. Dazu müssen einfach nur die folgenden Werte mitten in den zu sprechenden Text eingefügt werden. Die Parameter müssen bei VB in doppelten Anführungszeichen stehen. Hier sind nur die wichtigsten Tags aufgelistet. Eine vollständige Liste finden sie in der Agent-SDK.

Charakter

\Chr =""Parameter""\

  • wisper
    Unser Charakter flüstert
    Peedy.Speak _
    "\Chr=""Whisper""\Hey, kleine Information. Aber nicht weitersagen."
  • monotone
    Der Text wird monoton gesprochen
    Peedy.Speak _
    "\chr=""monotone""\Hallo Freunde. Habt ihr ein Problem?" 'monoton
    
  • Normal (Standard)
    Peedy.Speak _
    "Hallo Freunde. Habt ihr ein Problem?" 'normal
    

Kontext, Zusammenhang

\Ctx="" Parameter""\

  • Address
  • E-mail
  • Unknown (Standard)

Betonung

Soll ein Wort betont werden, setzten wir einfach ein "\emp\" davor.

Peedy.Speak "Du bist \emp\immer zu spät!"

Listing 11: Betonung

Testen sie es ohne \emp\ und dann mit \emp\ um den Unterschied zu hören.

Wiederholen

Mit \Lst\ können Sie den letzten Satz des Charakters wiederholen

Lautsprache verwenden

Es kommt des Öfteren vor, dass die Engine einige Wörter nicht korrekt ausspricht. Als Beispiel sei hier "Visual Basic" genannt. Dazu könnten wir das Wort einfach so schreiben wie man es spricht. "Wischuell Bäisik" Das Problem wäre aber dass der Text in der Sprechblase auch "falsch" aussehen würde. Hier verwenden wir wieder einen Kniff. Man kann einen anderen Text sprechen und gleichzeitig anzeigen lassen.

Peedy.Speak _
"\Map=""Wischuell Bäisik""=""Visual Basic""\ ist mein Zuhause."

Listing 12: Lautsprache

Dies setzt sich folgendermaßen zusammen: "\Map ""Gesprochener Text""= ""Angezeigter Text""\"

Pausen

Für kleine Pausen setzten wir "\Pau=300\" in den String. Die Zeitspanne wird in Millisekunden angegeben.

Standard wiederherstellen

Mit "\Rst\" (Reset) stellen wir alle Standards, welche wir vorher verändert haben, wieder her.

Geschwindigkeit

Mit \Spd=Anzahl\ (Speed) gibt man die Wörter pro Minute an

Lautstärke

Die Lautstärke gibt man mit \Vol=Anzahl\ (Volume) an, wobei 0 leise und 65535 laut ist.

Eingabefelder in Balloons  

Klickt man auf die Charaktere in Office, so erscheint ein Balloon mit einem Textfeld. Leider kann man dies nicht so einfach auf die Charaktere in unserem Programm übertragen. Es existiert aber ein kostenloses Steuerelement, welches auf http://www.textildoss.com.ar/msgballoon/MsgBalloon.htm heruntergeladen werden kann. Mit dessen Hilfe ist es möglich solche Balloons mit Textfeldern zu erstellen.


Abbildung 4: MS Office Agent

Das Request-Object  

Sämtliche Aktionen und Befehle, welche wir aus VB heraus an den Agenten geben, werden an den Agent Server geschickt. (Der Agent Server ist ein Programm auf unserem Computer.) Infolgedessen läuft alles asynchron ab. Das bedeutet, dass wir im Programm weiterarbeiten können, obwohl eine Aktion des Charakters (z.B. Animation) noch nicht abgeschlossen ist. Nehmen wir aber jetzt an, wir wollen, dass sich zwei Figuren unterhalten. Folgender Code würde nicht funktionieren, da die zweite Figur Merlin1 bereits mit dem Sprechen anfängt obwohl die erste Figur Peedy1 noch nicht fertig ist. Sie werden sich gegenseitig ins Wort fallen.

' Fallen sich ins Wort
Peedy1.Speak "Wie geht es? "
Merlin1.speak "Mir geht's gut."

Listing 13

Besser ist da folgender Code, bei dem jeweils gewartet wird bis der Partner fertig ist.

' Merlin erstellen
Dim Merlin1 As IAgentCtlCharacterEx
Agent1.Characters.Load "Merlin1", "merlin.acs"
Set Merlin1 = Agent1.Characters("Merlin1")

' Request Objekte erstellen
Dim Peedy1Reg As IAgentCtlRequest
Dim Merlin1Reg As IAgentCtlRequest

Merlin1.Show

Set Peedy1Reg = Peedy.Speak("Wie geht es dir?")
Merlin1.Wait Peedy1Reg
Set Merlin1Reg = Merlin1.Speak("Mir geht's gut. Danke und dir?")
Peedy.Wait Merlin1Reg
Set Peedy1Reg = Peedy.Speak("Mir auch")

Listing 14

Wir erstellen jeweils ein Request Objekt für Peedy und eines für Merlin. Sobald Peedy mit dem Sprechen fertig ist, beginnt Merlin zu sprechen. Mit Merlin1.Wait Peedy1Reg wird das Programm also solange angehalten, bis Peedy fertig mit der momentanen Aktion ist.


Abbildung 5: Peedy und Merlin

Probleme

  • Probleme kann es geben wenn der zu sprechende Text zu lang ist.
  • Wenn sie als TTS Sprache Englisch gewählt haben und versuchen Wörter mit "ß" oder "äüö" zu sprechen. Genauso bei einigen anderen Sonderzeichen.
  • Ein anderes häufiges Problem ist, dass versucht wird eine nicht vorhandene Animation abzuspielen. Jede Figur hat einen Standardsatz an Animationen und einen erweiterten, eigenständigen Satz zusätzlicher Animationen.
  • Es kann maximal eine Figur eines Charakters aktiv sein.

Eigene Charaktere  

Es ist auch möglich eigene Charaktere zu entwickeln. So wie dies z.B. www.cantoche.com tut. Dazu gibt es von Microsoft einige, kostenlose Programme, die Sie unter http://www.microsoft.com/msagent/devdownloads.htm finden. Eine Anleitung um Charaktere zu entwickeln, würde die Größe dieses Tutorials sprengen, deshalb soll es hier vorerst nicht weiter behandelt werden. Falls jedoch großes Interesse besteht, werde ich ein Tutorial zum Entwickeln eigener Charaktere schreiben.

Mögliche Einsatzgebiete  

  • Ein Charakter kann dem Benutzer eine kurze Einführung in das Programm geben, wenn es das erste Mal gestartet wird. Der Charakter erklärt dem Anwender so alle Funktionen, die das Programm zu bieten hat.
  • Bestimmte, schwierige Aufgaben könnten mithilfe des Assistenten Schritt für Schritt ausgeführt werden. Etwa ein Setupprogramm oder das Einrichten eines Programms. Man könnte einen Messenger schreiben welcher nachsieht ob neue E-Mails vorhanden sind. Der Agent könnte die E-Mail auf Wunsch vorlesen. Natürlich kann man die Agenten, wie in Office, als Hilfesystem einbauen.
  • Ein Suchassistent für das Internet wäre ebenso eine Möglichkeit die "MS Agent Technologie" zu verwenden. Die Ergebnisse könnte der Agent jeweils vorlesen.
  • Wie es bereits von Steffen Krieger mit dem "MS Agent Powertoy" verwirklicht wurde, kann man ein Programm schreiben, welches komplette Webseiten bzw. markierten Text vorliest.

Zusammenfassung  

Die Microsoft Agent 2.0 Technologie hat in Verknüpfung mit einer TTS und SR Engine sicherlich eine Zukunft. Meiner Meinung nach muss jedoch noch an einigen Dingen gearbeitet werden: Als Beispiel möchte ich hier die TTS und SR Engines nennen. Auch andere zur Verfügung stehende, kommerzielle Produkte sind nicht viel besser. Außerdem sollten die Charaktere im Jahre 2002 einen Alpha-Kanal, für Transparents, Schatten und Kantenglättung, besitzen. Obwohl die Agent SDK von MS schon vor langer Zeit herausgegeben wurde, hat sich die Technik noch kaum verbreitet. Man findet kaum Webseiten oder Programme, welche diese Technologie verwenden. Das liegt wohl daran, dass die Core Komponenten noch nicht in jedem Betriebsystem integriert sind. Ich hoffe, dass sich das zumindest für den VB Bereich nach diesem Tutorial ändern wird ;-)

Hier einige in diesem Tutorial erwähnte oder interessante Links zu diesem Thema.
http://msdn.microsoft.com/msagent
http://www.microsoft.com/msagent
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvbdev00/html/vb00f7.asp
http://www.msagentring.org/
http://www.cantoche.com
http://www.textildoss.com.ar/msgballoon/MsgBalloon.htm
http://www.agentdownload.de/ (Installationsanleitung und Charaktere)

Tutorial (Word-Dokument) als Download [109000 Bytes]

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.