skip to Main Content

In unserem letzten Tutorial haben wir gelernt, wie ihr Alexa’s Sprachbefehle (Intents) verarbeiten könnt. Nun wollen wir das ganze ergänzen durch variablen oder auch Slots genannt.

Was sind Slots?

Slots sind Werte die in einem Sprachbefehl erkannt und an den Service übergeben werden. Als Beispiel der Sprachbefehl: „Hallo Daniel“. Wenn wir nun gerne den Namen „Daniel“ als Wert übergeben möchten, benötigen wir dazu Slots.

Damit ihr das Rad nicht neu erfinden müsst, bietet Amazon euch sehr viele standardmäßig eingebaute Slots an. Als Beispiel gibt es hier einen DATE-Slot (AMAZON.DATE), einen Vornamen-Slot (AMAZON.DE_FIRST_NAME) und viele mehr.

Vornamen als Variable übergeben

Unser Ziel: Auf die Sprachbefehle „Hallo“ und „Tschüss“ wollen wir die Vornamen übergeben, auswerten und auch wieder zurückgeben. Beispiele:

  • „Hallo, mein Name ist Daniel“ -> „Hallo Daniel“
  • „Tschüss“ -> „Tschüss Daniel“

Mit dem Tschüss Daniel versuchen wir den Namen in einer Session zu speichern.

1. Slot ergänzen

Öffnet das Interaction Model und fügt den folgenden Intent ein:

    {
      "intent": "hallo",
      "slots": [
        {
          "name": "name",
          "type": "AMAZON.DE_FIRST_NAME"
        }
      ]
    },

Wie ihr seht gibt es hier einen Slot mit dem Namen „name“ und den vorgegebenen Slot-Werten von Amazon’s FIRST_NAME.

2. Utterances ergänzen

Damit die variable „name“ auch übergeben wird, müssen wir diese bei den Utterances auch einfügen:

hallo hi mein name ist {name}
hallo hallo mein Name ist {name}
hallo moin mein name ist {name}

Die 3 Sprachbefehle „Hi, hallo, moin“ hören jetzt auch auf einen Namen (falls einer gesagt wurde).

3. Via PHP Alexa’s Variablen auslesen

Zuerst einmal habe ich einen Debugger (Monolog) über composer eingebunden, damit ich die Anfragen auch loggen kann. Denn Amazon’s Test System liefer keine brauchbaren Daten zurück bis auf „The response is invalid“. Nach der Befehls(Intent)-Erkennung speichere ich die Intentdaten in die Variable „IntentData“. Den Namen erhalte ich dann über $intentData[’name‘][‚value‘]:

<?php require_once __DIR__ . '/vendor/autoload.php'; // Autoload files using Composer autoload use Monolog\Logger; use Monolog\Handler\StreamHandler; define('DEBUG', true); define('DEBUG_FILE', __DIR__ . '/logs/log.log'); $logger = new Logger('Alexa'); $logger->pushHandler( new StreamHandler( DEBUG_FILE, Logger::INFO ) );

// Get Alexa Request
$jsonRequest = file_get_contents('php://input');

// Decode the Request
$data        = json_decode($jsonRequest, true);

// Abort when Empty
if( empty($data) || (!isset($data) ) ) {
	die('Bad Request');
}

// Get Intent
$intent = !empty($data['request']['intent']['name']) ? $data['request']['intent']['name'] : 'default';
$intentData = !empty($data['request']['intent']['slots']) ? $data['request']['intent']['slots'] : 'default';

$logger->info( var_export($intentData, true));

switch ($intent) {
	// Hallo Intent für Utterances hi, hallo, moin
	case 'hallo':
		// Hallo Intentdata abfragen
		$name = !empty($intentData['name']['value']) ? $intentData['name']['value'] : '';
		$responseArray = [ 'version' => '1.0',
		    'response' => [
		          'outputSpeech' => [
		                'type' => 'PlainText',
		                'text' => 'Hallo ' . $name,
		                'ssml' => null
		          ],
		          'shouldEndSession' => true
		    ]
		];
		break;
	// Default
	default:
		$responseArray = [ 'version' => '1.0',
		    'response' => [
		          'outputSpeech' => [
		                'type' => 'PlainText',
		                'text' => 'Ich bin die Default Rückgabe! Intent: ' . $intent,
		                'ssml' => null
		          ],
		          'shouldEndSession' => true
		    ]
		];
		break;
}

header ( 'Content-Type: application/json' );
echo json_encode ( $responseArray );
die();

Den default intent behalten wir als debugger.

4. Test

Eben in den Test tab gehen und als Befehl „hallo mein name ist daniel“ eingeben und siehe da, es funktioniert:

Skill testen

Alexa Session speichern und ausgeben

Wir möchten unseren Namen, den wir im Hallo Befehl übergeben, speichern und beim Tschüss auch wieder ausgeben. Leider speichert Amazon die Daten nicht direkt, sodass wir die Daten selber per Session speichern müssen.

Ich habe dazu eine einfache Textdatei „data.json“ benutzt, die pro session den Namen abspeichert. Natürlich sollte man hier besser eine richtige Datenbank einsetzen, aber das ist ja hier nur ein Beispiel.

1. Session ID in Variable speichern

$sessionId =  !empty($data['session']['sessionId']) ? $data['session']['sessionId'] : 'default'; 

2. Variable „name“ der Session als JSON speichern

		$name = !empty($intentData['name']['value']) ? $intentData['name']['value'] : '';
		if(!empty($name)) {
			$dataToSave = array($sessionId => array(
				'name' => $name
			));
			$fp = fopen('data.json', 'w');
			fwrite($fp, json_encode($dataToSave));
			fclose($fp);
		}

3. Variable „name“ der Session (falls vorhanden) ausgeben

	// Hallo Intent für Utterances hi, hallo, moin
	case 'tschuss':
		$savedData = json_decode( file_get_contents('data.json'), true );
		if(isset($savedData[$sessionId]['name']) && !empty($savedData[$sessionId]['name'])) {
			$name = $savedData[$sessionId]['name'];
		} else {
			$name = ' Mr. Namenlos';
		}
		$responseArray = [ 'version' => '1.0',
		    'response' => [
                  'outputSpeech' => [
                        'type' => 'SSML',
                        'text' => 'Bye Bye ' . $name,
                        'ssml' => 'Bye Bye ' . $name . ''
                  ],
		          'shouldEndSession' => false
		    ]
		];
		break;
Slot Speichern
Slot ausgeben

Und hier nochmal das ganze Skript:

<?php require_once __DIR__ . '/vendor/autoload.php'; // Autoload files using Composer autoload use Monolog\Logger; use Monolog\Handler\StreamHandler; define('DEBUG', true); define('DEBUG_FILE', __DIR__ . '/logs/log.log'); $logger = new Logger('Alexa'); $logger->pushHandler( new StreamHandler( DEBUG_FILE, Logger::INFO ) );

// Get Alexa Request
$jsonRequest = file_get_contents('php://input');

// Decode the Request
$data        = json_decode($jsonRequest, true);

// Abort when Empty
if( empty($data) || (!isset($data) ) ) {
	die('Bad Request');
}



$intent = !empty($data['request']['intent']['name']) ? $data['request']['intent']['name'] : 'default';
$intentData = !empty($data['request']['intent']['slots']) ? $data['request']['intent']['slots'] : 'default';
$sessionId =  !empty($data['session']['sessionId']) ? $data['session']['sessionId'] : 'default'; 

// $logger->info( var_export($data, true));
$logger->info( $sessionId);


switch ($intent) {

	// Hallo Intent für Utterances hi, hallo, moin
	case 'hallo':
		// Hallo Intentdata abfragen
		$name = !empty($intentData['name']['value']) ? $intentData['name']['value'] : '';
		if(!empty($name)) {
			$dataToSave = array($sessionId => array(
				'name' => $name
			));
			$fp = fopen('data.json', 'w');
			fwrite($fp, json_encode($dataToSave));
			fclose($fp);
		}

		$responseArray = [ 'version' => '1.0',
		    'response' => [
		          'outputSpeech' => [
		                'type' => 'PlainText',
		                'text' => 'Hallo ' . $name,
		                'ssml' => null
		          ],
		          'shouldEndSession' => false
		    ]
		];
		break;

	// Hallo Intent für Utterances hi, hallo, moin
	case 'tschuss':
		$savedData = json_decode( file_get_contents('data.json'), true );
		if(isset($savedData[$sessionId]['name']) && !empty($savedData[$sessionId]['name'])) {
			$name = $savedData[$sessionId]['name'];
		} else {
			$name = ' Mr. Namenlos';
		}
		$responseArray = [ 'version' => '1.0',
		    'response' => [
                  'outputSpeech' => [
                        'type' => 'SSML',
                        'text' => 'Bye Bye ' . $name,
                        'ssml' => 'Bye Bye ' . $name . ''
                  ],
		          'shouldEndSession' => false
		    ]
		];
		break;

	// Default
	default:
		$responseArray = [ 'version' => '1.0',
		    'response' => [
		          'outputSpeech' => [
		                'type' => 'PlainText',
		                'text' => 'Ich bin die Default Rückgabe! Intent: ' . $intent,
		                'ssml' => null
		          ],
		          'shouldEndSession' => true
		    ]
		];
		break;
}

header ( 'Content-Type: application/json' );
echo json_encode ( $responseArray );
die();

Daniel Barenkamp

Founder and Creator of WeLaunch (formerly DB-Dzine).

Dieser Beitrag hat einen Kommentar
  1. Hallo Daniel,

    erstmal danke für dieses tolle Tutorial. Die ersten beiden Tutorials haben bei mir sofort funktioniert, jedoch dieses nicht mehr. Wie du möglicherweise weißt, gibt es zum testen der Skills ein neues Interface. Nun weiß ich nicht genau, wie ich den skill aufrufe bzw. den Parameter Daniel übergeben muss. Wenn ich „testeins“ (der name meines Skills) bekomme ich folgende Fehlermeldung : Ich bin die Default Rückgabe! intent:default. Das ist ja korrekt.

    Wie kann ich jetzt den Skill aufrufen sodass ich Hallo ich bin Daniel übergeben kann?

    Des weiteren : für was ist dieser Abschnitt des codes?

    require_once __DIR__ . ‚/vendor/autoload.php‘; // Autoload files using Composer autoload use Monolog\Logger; use Monolog\Handler\StreamHandler; define(‚DEBUG‘, true); define(‚DEBUG_FILE‘, __DIR__ . ‚/logs/log.log‘); $logger = new Logger(‚Alexa‘); $logger->pushHandler( new StreamHandler( DEBUG_FILE, Logger::INFO ) );

    Wäre sehr nett wenn du mir helfen könntest. Danke im voraus für die Hilfe und das tolle Turorial 🙂

    Grüße Stefan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

×Close search
Suche