Skill: Textfile vorlesen lassen

Hier wird über die Entwicklung von Skills diskutiert.
Benutzeravatar

Themenstarter
WaJoWi
Beiträge: 163
Registriert: Do 26. Jan 2017, 11:52
Vorhandene Echos: 2
Vorhandene Echo Dots: 4

Di 7. Feb 2017, 16:51

Hallo!

Ich möchte gerne einen Skill schreiben um mir ein einfaches Textfile vorlesen zu lassen. Das Textfile liegt auf einen Webspace und wird jeden Tag neu erstellt. Also so etwas wie der Spruch des Tages.

Eigentlich wäre es am einfachsten (und praktischsten), wenn ich das 'Flash Briefing Skill API' vom 'Alexa Skills Kit' verwenden würde. Leider gibt es das aber bisher nur in English (U.S.). Geht also nicht. :(

Also muss es ein 'Custom Interaction Model' werden. Doch dazu fehlt mir einfach der Ansatz für den Code auf AWS Lambda.

Was ich möchte: Bei Aufruf von 'Alexa - lies das Textfile vor' das File von der Adresse 'https://www.beispiel.net/text.txt' laden und von Alexa vorlesen lassen. Das Vorlesen sollte man mit 'Alexa - stopp' abbrechen können. Es werden keine weiteren Variablen (Datum, Name, usw.) übergeben. Einfach nur vorlesen.

Hat jemand einen fertigen Code oder Codeschnippsel die ich verwenden kann?
0 x

gehwissenlos

Di 7. Feb 2017, 19:14

Theoretisch hätte ich einen fertigen Code. Musste nur eine RSS Reader Vorlage etwas anpassen. Nur leider kenne ich mich mit NodeJS auch nicht so gut aus. Folgende Zeilen werden irgendwie nie ausgeführt, also beim Test wird kein Log geschrieben:

Code: Alles auswählen

http.get('https://7oi.de/spruchdestages.txt', function(resp){
  resp.setEncoding('utf8');
  console.log("test");
  resp.on('data', function(chunk){
    console.log("test" + chunk);
  });
}).on("error", function(e){
  console.log("Got error: " + e.message);
});
Sobald ich das zum Laufen bekomme habe, habe ich dir einen Code.
1 x
Benutzeravatar

Themenstarter
WaJoWi
Beiträge: 163
Registriert: Do 26. Jan 2017, 11:52
Vorhandene Echos: 2
Vorhandene Echo Dots: 4

Mi 8. Feb 2017, 08:02

Das wäre super nett...
1 x
Benutzeravatar

Themenstarter
WaJoWi
Beiträge: 163
Registriert: Do 26. Jan 2017, 11:52
Vorhandene Echos: 2
Vorhandene Echo Dots: 4

Fr 10. Feb 2017, 19:18

Also ich bekomme mit deinem Code schon die Consolen-Ausgabe. Lediglich folgendes hat gefehlt:

Code: Alles auswählen

var http = require('http');
Damit liest er den Text auch ein und schreibt ihn in eine Variable. Soweit so gut. Doch wenn man den Code dann in ein Projekt einfügt klappt es nicht mehr. :grimacing:

Ich habe einmal den blueprint 'alexa-skill-kit-sdk-factskill' hergenommen und stark gekürzt. Die Variable FACTS wird vorgelesen. Gut. Dann den Code zum Einlesen einer Datei im WWW hinzugefügt - die Variable FACTS sollte ersetzt werden - tut es aber nicht. Der Code zum Einlesen wird einfach ignoriert!

Ich habe viele verschiedene Varianten getestet und das ganze auch in eine Function gepackt. Hat alles nicht geholfen. Ich steh an. :tired_face:

Unten der Code. Der Inhalt in FACTS ('Test') sollte durch den Inhalt der Datei http://www.beispiel.net/text.txt ersetzt werden. Was es leider nicht tut. Hat da noch jemand eine Idee?

Code: Alles auswählen

'use strict';

const Alexa = require('alexa-sdk');

var FACTS = 'Test';
var SKILL_NAME = 'Zum Ausprobieren';
var GET_FACT_MESSAGE = 'Hier der Inhalt: ';
var HELP_MESSAGE = 'Hilfe für den User';
var HELP_REPROMPT = 'Wie kann ich dir helfen?';
var STOP_MESSAGE = 'Auf Wiedersehen!';

var url= "http://www.beispiel.net/text.txt";
var http = require('http');
http.get(url, function(resp){
  resp.setEncoding('utf8');
  resp.on('data', function(chunk){
    FACTS = chunk;
  });
}).on("error", function(e){
  console.log("Got error: " + e.message);
});



const handlers = {
    'LaunchRequest': function () {
        this.emit('GetFact');
    },
    'GetNewFactIntent': function () {
        this.emit('GetFact');
    },
    'GetFact': function () {
        // Create speech output
        const speechOutput = FACTS;
        this.emit(':tellWithCard', speechOutput, (SKILL_NAME));
    },
    'AMAZON.HelpIntent': function () {
        const speechOutput = HELP_MESSAGE;
        const reprompt = HELP_MESSAGE;
        this.emit(':ask', speechOutput, reprompt);
    },
    'AMAZON.CancelIntent': function () {
        this.emit(':tell', STOP_MESSAGE);
    },
    'AMAZON.StopIntent': function () {
        this.emit(':tell', STOP_MESSAGE);
    },
    'SessionEndedRequest': function () {
        this.emit(':tell', STOP_MESSAGE);
    },
};

exports.handler = (event, context) => {
    const alexa = Alexa.handler(event, context);
    alexa.APP_ID = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};
0 x

gehwissenlos

Sa 11. Feb 2017, 09:10

So, hab nochmal geschaut was das INternet so hergibt:

Code: Alles auswählen

/**
* App ID for the skill
*/
var APP_ID = "amzn1.ask.skill.********************************";

var AlexaSkill = require('./AlexaSkill');
var https = require('https');

var RssReader = function () {
  AlexaSkill.call(this, APP_ID);
};

// Extend AlexaSkill
RssReader.prototype = Object.create(AlexaSkill.prototype);
RssReader.prototype.constructor = RssReader;

RssReader.prototype.eventHandlers.onSessionStarted = function (sessionStartedRequest, session) {
  console.log("RssReader onSessionStarted requestId: " + sessionStartedRequest.requestId
  + ", sessionId: " + session.sessionId);
  // any initialization logic goes here
};

RssReader.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) {
  console.log("RssReader onLaunch requestId: " + launchRequest.requestId + ", sessionId: " + session.sessionId);
  var speechOutput = "Hallo, was soll ich tun?";
  var repromptText = "Gib mir Input.";
  response.ask(speechOutput, repromptText);
};

RssReader.prototype.eventHandlers.onSessionEnded = function (sessionEndedRequest, session) {
  console.log("RssReader onSessionEnded requestId: " + sessionEndedRequest.requestId
  + ", sessionId: " + session.sessionId);
  // any cleanup logic goes here
};

RssReader.prototype.intentHandlers = {
  // register custom intent handlers
  "GetText": function (intent, session, response) {
      
        var output = '';
        
        requestFunction(function requestCallback(err) {

            // If error occurs during http.get request - respond with console.log
            if (err) {
                console.log('HTTP Error: request not sent');
            }

            var ssmlOutput = {
                speech: '<speak>' + output + '</speak>',
                type: AlexaSkill.speechOutputType.SSML
            };
    
            response.tellWithCard(ssmlOutput, "Spruch des Tages", "Lese Spruch des Tages vor");
        });
        
        function requestFunction(requestCallback){

            var url = "https://7oi.de/spruchdestages.txt";

            https.get(url, function(res) {
                console.log("Got response: " + res.statusCode);
                res.setEncoding('utf8');
                res.on('data', function(chunk){
                    console.log("test" + chunk);
                    output = chunk;
                    requestCallback(null);
                });
            
            }).on('error', function (e) {
                console.log("Got error: ", e);
            });
        }

  },
  "AMAZON.HelpIntent": function (intent, session, response) {
    response.ask("Frage mich: was ist der Spruch des Tages.");
  },
  "AMAZON.StopIntent": function (intent, session, response) {
      var speechOutput = {
                speech: "Bis bald!",
                type: AlexaSkill.speechOutputType.PLAIN_TEXT
        };
    response.tell(speechOutput);
  },
  "AMAZON.CancelIntent": function (intent, session, response) {
      var speechOutput = {
                speech: "Bis bald!",
                type: AlexaSkill.speechOutputType.PLAIN_TEXT
        };
    response.tell(speechOutput);
  }
};

// Create the handler that responds to the Alexa Request.
exports.handler = function (event, context) {
  // Create an instance of the RssReader skill.
  var rssReader = new RssReader();
  rssReader.execute(event, context);
};
(Basiert auf https://github.com/alirawashdeh/rss-reader-alexa)

Ist jetzt vielleicht nicht ganz so hochwertig programmiert, aber es läuft.
0 x
Benutzeravatar

Themenstarter
WaJoWi
Beiträge: 163
Registriert: Do 26. Jan 2017, 11:52
Vorhandene Echos: 2
Vorhandene Echo Dots: 4

Sa 11. Feb 2017, 15:19

He super! Damit habe ich es endlich auch hinbekommen. Vielen Dank!
0 x
Benutzeravatar

tschnurr
Beiträge: 22
Registriert: Mo 6. Feb 2017, 16:12
Vorhandene Echo Dots: 1

Mi 15. Feb 2017, 11:30

würde mir auch gerne eine Webseite/Info vorlesen lassen mit einem einfachen Kommando. Bei dem versuch den code zu kopieren und in Lambda einzugeben bzw. "Edit code inline" erfolgt der Hinweis:
Execution result: failed(logs)
{
"errorMessage": "Cannot find module './AlexaSkill'",
"errorType": "Error",
"stackTrace": [
"Object.<anonymous> (/var/task/index.js:6:18)",
"Module._compile (module.js:409:26)",
"Object.Module._extensions..js (module.js:416:10)",
"Module.load (module.js:343:32)",
"Function.Module._load (module.js:300:12)",
"Module.require (module.js:353:17)"
]
}
gibt es eine einfache Anleitung wie vorzugehen ist. User Interaktionen bis auf den Aufruf "Alexa, xyz" sowie "Stop" sind nicht erforderlich.
0 x
Benutzeravatar

Themenstarter
WaJoWi
Beiträge: 163
Registriert: Do 26. Jan 2017, 11:52
Vorhandene Echos: 2
Vorhandene Echo Dots: 4

Mi 15. Feb 2017, 11:44

Das ist alles unter dem Link https://github.com/alirawashdeh/rss-reader-alexa beschrieben. Du musst eine ZIP-Datei erstellen die alle benötigten Dateien enthält und diese hochladen. Andernfalls fehlt natürlich zumindest die Datei AlexaSkill.js.
0 x
Benutzeravatar

tschnurr
Beiträge: 22
Registriert: Mo 6. Feb 2017, 16:12
Vorhandene Echo Dots: 1

Mi 15. Feb 2017, 13:20

ahh okay danke. gemacht aber irgendwie läuft das nicht
{
"errorMessage": "Cannot find module '/var/task/index'",
"errorType": "Error",
"stackTrace": [
"Function.Module._load (module.js:276:25)",
"Module.require (module.js:353:17)",
"require (internal/module.js:12:17)"
]
}

vermute mal das hängt irgendwie damit zusammen weil ich nicht wusste was mit "In your command prompt, navigate to the repository folder " Repository folder gemeint sein sollte. Einen Folder mit "Node_Modules" wurde angelegt mit Unterordnern und files,,,,"

"iMac:~ tschnurr1$ npm install rss-parser
/Users/tschnurr1
└─┬ rss-parser@2.5.2
├── entities@1.1.1
└─┬ xml2js@0.4.17
├── sax@1.2.2
└─┬ xmlbuilder@4.2.1
└── lodash@4.17.4

npm WARN enoent ENOENT: no such file or directory, open '/Users/tschnurr1/package.json'
npm WARN tschnurr1 No description
npm WARN tschnurr1 No repository field.
npm WARN tschnurr1 No README data
npm WARN tschnurr1 No license field.
iMac:~ tschnurr1$ npm"
0 x
Benutzeravatar

Themenstarter
WaJoWi
Beiträge: 163
Registriert: Do 26. Jan 2017, 11:52
Vorhandene Echos: 2
Vorhandene Echo Dots: 4

Mi 15. Feb 2017, 17:36

In dem ZIP-File sollte sich der Ordner rss-parser und die Dateien AlexaSkill.js sowie index.js befinden.

In dem Ordner rss-parser befinden sich die Ordner dist und test sowie die Dateien .npmignore, bower.json, Gruntfile.js, index.js, package.json und README.md.

So hat es bei mir auf jeden Fall funktioniert. Viel Glück!
0 x
Antworten

Zurück zu „Fähigkeiten (Skills) entwickeln“

  • Information