Auf der AWS re:Invent 2016 waren Alexa und virtuelle Assistenten ein Highlight, das viel Aufmerksamkeit auf sich zog. Alexa ist der Sprachdienst für Amazon Echo, Echo Dot, Echo Tap und Fire TV, der Fertigkeiten und Skills für Kunden bereitstellt, um über Sprache intuitiver mit Geräten zu interagieren. Als frühzeitiger Anwender besitze ich die erste Generation von Echo und Echo Dot, und habe 3 von diesen Geräten in meiner kleinen Wohnung. Ich muss sagen, ich bin ziemlich begeistert.
Ich glaube, Alexa wird schon bald Teil unserer Zukunft sein - es wird bereits von Ford und Volkswagen in ihre Autos integriert und wir werden zweifellos weitere Integrationen wie diese sehen. Bei Nuxeo versuchen wir, mit den neuesten Technologien Schritt zu halten. Es macht uns Spaß, coole neue Funktionen und Integrationen zu entwickeln, die der Plattform neue Möglichkeiten eröffnen. Deshalb habe ich mich dazu entschlossen, ein Nuxeo Skill zu entwickeln, mit dem wir über Alexa Dokumente auf der Nuxeo Content Services Platform suchen können.
Wie das Skill funktioniert, sehen Sie in diesem kurzen Clip:
Alle notwendigen Quellen finden Sie in meinem GitHub Repository. Sehen wir uns nun die Implementierung genauer an.
Skill-Informationen
Zunächst müssen Sie allgemeine Informationen wie Sprache, Name und Symbol Ihres Skills festlegen.
Integrationsmodell
Im nächsten Schritt legen Sie die Art der Interaktion mit Ihrem Skill, die verschiedenen ‚Intents’ und deren Inhalte fest.
{ "intents": [ { "intent": "GetMyLast" }, { "intent": "GetMyTasks" }, { "intent": "Search", "slots": [ { "name": "Criteria", "type": "Value" } ] }, { "intent": "AMAZON.RepeatIntent" }, { "intent": "AMAZON.HelpIntent" }, { "intent": "AMAZON.StopIntent" }, { "intent": "AMAZON.CancelIntent" } ] }
AMAZON.* ist das vordefinierte ‚Intent’, das für die Navigation verwendet wird. Dann haben Sie ‚GetMyLast’ und ‚GetMyTasks’, die ohne Parameter auskommen, und zuletzt das Intent ‚Search’, das einen ‚Kriterien’ Parameter nutzt.
Konfiguration
Verknüpfung von Konten
Um eine Abfrage auf dem Nuxeo Server durchführen zu können, müssen wir einen Token erstellen, auf dem wir Anmeldeinformationen speichern und dynamische Abfragen auf dem Server durchführen können.
Die UI-Authentifizierung erfordert SSL und eine eindeutige URL. Deshalb musste ich eine UI erstellen, in der Sie die URL Ihres Servers eingeben können, um nur ein Alexa Skill zu erhalten. Sie können gerne selbst Ihr Glück versuchen und Ihre eigenes erstellen und für andere bereitstellen.
Sobald Ihr Konto durch die UI bestätigt wurde, wird eine Token-Authentifizierung auf Nuxeo generiert, die mit dem Benutzer und der Server-URL zur neuen Alexa Token-Authentifizierung kombiniert wird.
Da mein Hosting PHP nativ unterstützt, konnte ich diesen Teil mit dem Nuxeo PHP Client und Polymer für die UI erstellen, da wir bei Nuxeo sehr gerne mit Polymer arbeiten.
Die Quellen hierzu finden Sie in diesem GitHub Repository
Jetzt müssen wir nur noch unser Skill für diese Authentifizierungs-UI einrichten.
Lambda
Nun müssen Sie den Dienstendpunkt definieren. Lambda ist relativ einfach einzurichten, deshalb haben wir uns dafür entschieden.
Ich habe mich für die Verwendung von NodeJS und den Nuxeo JavaScript Client entscheiden, da es schnell und einfach ist.
Die Abhängigkeiten des Projekts lauten:
- alexa-sdk: Für Alexa primitiv - alexa-app: Ein kleines Framework, um die Alexa App-Entwicklung zu vereinfachen - nuxeo: Um auf den Nuxeo Server zuzugreifen - striptags: Um sämtliche HTML-Tags aus der Antwort zu entfernen, da Alexa keine Tags mag
Für jedes ‚Intents’ muss eine Methode festgelegt werden:
app.intent('Search', function(request, response) { // Retrieve the criteria var criteria = request.slot("Criteria"); // Load the token from the request return loadToken(request) .then(function(nuxeo) { // Search Nuxeo return nuxeo.repository().query({...}); }) .then(function(doc) { // List the results ... for (let id in doc.entries) { ... docs += res; response.say(res); } // Add a result card for the Alexa UI response.card({type: 'Standard', ...}}); }).catch ( function(err) { // Handle Error handleError(err, request, response); }); });
Die Quellen finden Sie im GitHub Repository
Vielen Dank!
Ein großes Dankeschön an alle API-Clients, PHP und NodeJS, die diese Integration für mich so einfach gemacht haben. Ich hoffe, Ihnen gefällt dieses Skill genauso gut wie mir!