コマンドラインで Alexa アプリを実行します。 Slack で実行します。どこでも実行できます! Amazon Alexa のスキルとインテントをサポートします。
$ npm install chatskills
Chatskills は、Amazon の外で Alexa アプリを実行するための迅速かつ簡単な方法です。スキルとインテントを簡単に作成し、コマンドラインで直接実行できます。
Chatskills はサーバーを必要とせず、コンソールで直接実行できます。また、Web、Slack、またはどこでも実行できます。複数のユーザーからのリクエストを処理し、セッション メモリを維持します。ユーザーがいずれかのスキルを使用して会話を開始すると、スキルは終了するまでセッション コンテキスト内で実行され続けます。
コマンドラインで実行される Amazon Alexa アプリは次のようになります。
> chatskills, ask hello to say hi.
Hello, World!
> chatskills, ask horoscope for Scorpio.
Things are looking up today for Scorpio.
> chatskills, ask funny to tell me a joke
Knock knock.
> who's there?
Banana.
> banana who
Knock knock.
> whos there
Orange.
> orange who?
Orange you glad I didn't say banana?
この例では、ユーザーは、こんにちは、星占い、面白いという 3 つの異なるスキルにアクセスします。
チャットスキルの使い方は簡単です。 Alexa 構文を使用して新しいスキルを追加し、いくつかのインテントを作成します。以下に簡単な例を示します。
var chatskills = require ( 'chatskills' ) ;
// Create a skill.
var hello = chatskills . app ( 'hello' ) ;
// Create an intent.
hello . intent ( 'helloWorld' , {
'slots' : { } ,
'utterances' : [ '{to |}{say|speak|tell me} {hi|hello|howdy|hi there|hiya|hi ya|hey|hay|heya}' ]
} ,
function ( req , res ) {
res . say ( 'Hello, World!' ) ;
}
) ;
// Respond to input.
chatskills . respond ( 'chatskills, ask hello to say hi' , function ( response ) {
console . log ( response ) ;
} ) ;
上の例では、発話文法は次のフレーズに一致するように自動的に拡張されます。
helloWorld to say hi
helloWorld say hi
helloWorld to speak hi
helloWorld speak hi
helloWorld to tell me hi
helloWorld tell me hi
helloWorld to say hello
helloWorld say hello
helloWorld to speak hello
helloWorld speak hello
helloWorld to tell me hello
helloWorld tell me hello
helloWorld to say howdy
...
このスキルを使用してチャットボットと対話するには、ターゲット フレーズのいずれかを発話します。上の例では、「挨拶する」というフレーズを使用しましたが、生成されたどのフレーズとも一致させることができます。例えば:
> chatskills, ask hello to tell me hi
Hello, World!
> chatskills, ask hello to say hello
Hello, World!
> chatskills, ask hello to say howdy
Hello, World!
コンソール上でローカルに実行されるチャットボットを作成するには、入力を読み取るループを含めるだけです。
var readlineSync = require ( 'readline-sync' ) ;
// Console client.
var text = ' ' ;
while ( text . length > 0 && text != 'quit' ) {
text = readlineSync . question ( '> ' ) ;
// Respond to input.
chatskills . respond ( text , function ( response ) {
console . log ( response ) ;
} ) ;
}
スキルで非同期呼び出し (リクエストなど) を使用している場合は、上記の while ループの代わりに非同期ループを使用する必要があります。ここに例を示します。
コンソールだけを使用する必要はありません。 Slack など、どこでもチャットボットを実行できます。完全な例については、ここを参照してください。
var SlackBot = require ( 'slackbots' ) ;
var bot = new SlackBot ( { token : token , name : 'awesome' } ) ;
// Listen to slack messages.
bot . on ( 'message' , function ( message ) {
// Reply to humans.
if ( message . type == 'message' && message . text && message . subtype != 'bot_message' ) {
var author = getUserById ( message . user ) ;
var channel = getChannelById ( message . channel ) ;
// Respond to input, use author.name as the session id.
chatskills . respond ( message . text , author . name , function ( response ) {
if ( channel ) {
// Public channel message.
bot . postMessageToChannel ( channel . name , response ) ;
}
else {
// Private message.
bot . postMessageToUser ( author . name , response ) ;
}
} ) ;
}
} ) ;
スキルは、チャットボットが実行できるプログラムです。これらは、発話 (ユーザー入力から一致するフレーズ)、応答、およびセッション メモリで構成されるインテントで構成されます。各スキルはセッション メモリにアクセスできるため、ユーザーにインテリジェントに応答するために役立つ変数を保存および取得できます。
ここでは、「ホロスコープ」という名前の新しいスキルを作成する例を示します。
var horoscope = chatskills . app ( 'horoscope' ) ;
スキルはインテントで構成されます。ここで、ユーザーからの入力が一連の発話と照合されます。一致するものが見つかると、そのインテントが実行されます。インテントは、 req.get('variable')
およびreq.set('variable', value)
呼び出すことで、ユーザー セッション内の変数を取得/設定できます。インテントはres.say('hello')
を呼び出すことで応答を出力できます。
以下は、スキル「ホロスコープ」の新しいインテントを作成する例です。
horoscope . intent ( 'predict' , {
'slots' : { 'SIGN' : 'LITERAL' } ,
'utterances' : [ 'for {signs|SIGN}' ]
} ,
function ( req , res ) {
res . say ( 'Things are looking up today for ' + req . get ( 'SIGN' ) + '.' ) ;
}
) ;
このインテントは次のように操作できます。
> chatskills, ask horoscope for Scorpio
Things are looking up today for Scorpio.
スキルの実行を開始するには 2 つの方法があります。
スキルを起動する最初の方法は、「実行」などのインテントを作成することです。これにより、「chatskills, ask [skillname] to run.」と入力できるようになります。インテントの戻り値が true (セッションを維持するため) であれば、スキルが実行されます。
「実行」スキルの例は、guessinggame にあります。
app . intent ( 'run' , {
"slots" : { } ,
"utterances" : [ "{to|} {run|start|go|launch}" ]
} , function ( req , res ) {
var prompt = "Guess a number between 1 and 100!" ;
res . say ( prompt ) . reprompt ( prompt ) . shouldEndSession ( false ) ;
}
) ;
スキルを起動する 2 番目の方法は、アプリの起動時に自動的に実行される起動メソッドを作成することです。次に、 chatskills.launch(app)
を呼び出してスキルを開始します。スキルまたはスキルの名前を渡すことができます。オプションで一意の sessionId を指定することもできます。
例: chatskills.launch(app)
またはchatskills.launch('horoscope')
またはchatskills.launch('horoscope', 'some-unique-id')
。
完全な例を次に示します。
var chatskills = require ( './lib/chatskills' ) ;
var readlineSync = require ( 'readline-sync' ) ;
// Create a skill.
var hello = chatskills . app ( 'hello' ) ;
// Launch method to run at startup.
hello . launch ( function ( req , res ) {
res . say ( "Ask me to say hi!" ) ;
// Keep session open.
res . shouldEndSession ( false ) ;
} ) ;
// Create an intent.
hello . intent ( 'helloWorld' , {
'slots' : { } ,
'utterances' : [ '{to |}{say|speak|tell me} {hi|hello|howdy|hi there|hiya|hi ya|hey|hay|heya}' ]
} ,
function ( req , res ) {
res . say ( 'Hello, World!' ) ;
}
) ;
// Start running our skill.
chatskills . launch ( hello ) ;
// Console client.
var text = ' ' ;
while ( text . length > 0 && text != 'quit' ) {
text = readlineSync . question ( '> ' ) ;
// Respond to input.
chatskills . respond ( text , function ( response ) {
console . log ( response ) ;
} ) ;
}
ユーザーが入力を提供すると、その入力は各スキルおよびそのインテントのリストと照合されます。一致するものが見つかると、新しいセッションが開始され、スキルの実行が開始されます。
ユーザーのセッションが開始されると、アクティブ化されたスキルのインテントはセッション内の変数値を取得/設定できます。これにより、データの保存と取得が可能になります。
ユーザーに対してセッションが開かれている間、ユーザーからのすべての入力はアクティブ化されたスキルに送られます。このようにして、ユーザーはスキルを再リクエストする必要がありません (「チャットスキル、こんにちはと言うように頼む」)。代わりに、ユーザーはテキストを入力するだけで、現在実行中のスキルのインテントと照合されます。
インテントは、 true
を返すかres.shouldEndSession(false)
を呼び出すことによってセッションを開いたままにし、 false
返すかres.shouldEndSession(true)
を呼び出すことによってセッションを終了できます。インテントでは return ステートメントを省略することもできます。これは false を返すのと同じです。
セッションを使用した例については、ホロスコープ スキルを参照してください。インテントはユーザーに質問をし、セッションを継続するために true を返します。このインテントは、有効な応答が得られた場合にのみ false を返し、セッションを終了します。
要約すると、ユーザーセッションが開いているとき、ユーザーからのすべての入力はスキルに送られます。ユーザーセッションが終了すると、新しいスキルを実行するには、ユーザーからの入力を「chatskills, ask [SKILL] text」の形式で受信する必要があります。
デフォルトのセッション タイムアウトは、ユーザーからの入力がない場合の 1 時間です。セッションのタイムアウトを変更するには、 chatskills.timeout = 3600
を設定します。値は秒単位で指定します。セッション タイムアウトを無効にするには、値を 0 に設定します。
デフォルトのチャットボット名は「chatskills」です。スキルを実行するすべてのリクエストはチャットボット名で始まる必要があります。たとえば、「チャットスキル、こんにちはと言ってください」。チャットボット名をカスタマイズするには、次を使用します。
chatskills . name ( 'awesome' ) ;
警告とエラーを表示するには、 chatskills.verbose = true
を設定します。
Chatskills は alexa-app を使用して、インテントから多くのサンプル発話を生成します。発話の詳細については、ここを参照してください。
スロットと発話という 2 つのプロパティを持つオブジェクトを渡します。
app . intent ( 'sampleIntent' ,
{
"slots" : { "NAME" : "LITERAL" , "AGE" : "NUMBER" } ,
"utterances" : [ "my {name is|name's} {names|NAME} and {I am|I'm} {1-100|AGE}{ years old|}" ]
} ,
function ( request , response ) { ... }
) ;
スロット オブジェクトは、単純な Name:Type マッピングです。タイプは、Amazon がサポートするスロット タイプの 1 つである必要があります: LITERAL、NUMBER、DATE、TIME、DURATION
Amazon でのサポートが終了したLITERAL
スロット タイプの代替として、代わりにカスタム スロット タイプを使用することをお勧めします。以下は、 DragonType
のカスタム スロット タイプを定義する例です。
app . intent ( 'attack' ,
{
'slots' : { 'DragonType' : 'DRAGONTYPE' } ,
'utterances' : [ '{attack|fight|hit|use} {sword|dagger|wand} on {-|DragonType} dragon' ]
} , function ( request , response ) {
response . say ( 'You are attacking the ' + request . slot ( 'DragonType' ) + ' dragon!' ) ;
}
) ;
構文{-|CustomTypeName}
を使用して、発話内にカスタム スロット タイプを含めることができます。これは、用語がカスタム スロット タイプの値のリストから取得される必要があることを示します。上記の例では、発話で用語{-|DragonType}
が使用されており、用語が値のリスト (以下に示す) から取得される必要があることを示しています。チャットスキルの場合、値のリストを指定する必要はありません。任意の単語がカスタム スロット タイプとして受け入れられ、その値として使用されます。
Amazon Alexa サービスに公開する場合は、タイプ名と値のリストを指定して、 DragonType
のカスタム スロット タイプを提供します。例えば:
タイプ: DRAGONTYPE
値:
golden
fire
ice
water
snow
実際には、チャットスキルと Amazon Alexa はカスタム スロット値として任意の単語を受け入れることに注意してください。値のリストの単語と一致する必要はありません。このように、カスタム スロット タイプはLITERAL
に似ています。
発話構文を使用すると、自動展開される少数のサンプルを使用して、多数 (数百、場合によっては数千) のサンプル発話を生成できます。任意の数のサンプル発話を発話配列に渡すことができます。以下に、いくつかの発話マクロのサンプルと、それらが拡張される内容を示します。
"my favorite color is {red|green|blue|NAME}"
=>
"my favorite color is {red|NAME}"
"my favorite color is {green|NAME}"
"my favorite color is {blue|NAME}"
これにより、フレーズを複数の言い方で定義し、単一のサンプル発話に組み合わせることができます。
"{what is the|what's the|check the} status"
=>
"what is the status"
"what's the status"
"check the status"
スロットの数値を取得する場合、さまざまな数値を使用して多数のサンプル発話を生成すると便利です。
"buy {2-5|NUMBER} items"
=>
"buy {two|NUMBER} items"
"buy {three|NUMBER} items"
"buy {four|NUMBER} items"
"buy {five|NUMBER} items"
数値範囲は段階的に増加することもできます
"buy {5-20 by 5|NUMBER} items"
=>
"buy {five|NUMBER} items"
"buy {ten|NUMBER} items"
"buy {fifteen|NUMBER} items"
"buy {twenty|NUMBER} items"
"what is your {favorite |}color"
=>
"what is your color"
"what is your favorite color"
複数のインテントが同じ可能な値のリストを使用する可能性があるため、各インテント スキーマではなく 1 か所で定義する必要があります。アプリの辞書を使用します。
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
応答メソッドで返されたカード オブジェクトを処理することで、Amazon Alexa ホーム カードを表示できます。 Alexaアプリを使用すると、モバイルデバイスのAmazon Alexaアプリにホームカードが表示されます。 chatskills を使用する場合、ホーム カードはchatskills.respond()
コールバック メソッドで処理できます。このコールバック メソッドは、 response
とcard
2 つの引数を返します。
カード オブジェクトを使用すると、カードのテキストと画像を任意の方法で表示できます。たとえば、Slack でチャットスキル アプリをホストしている場合、画像を埋め込みメディアとして表示することができます。同様に、コンソール上でテキスト チャットボットとしてホストしている場合は、単にカードをテキストとして出力することもできます。
以下に例を示します。
app . intent ( 'example' , {
"slots" : { } ,
"utterances" : [ "show a card" ]
} , function ( req , res ) {
// Show home card in Alexa app.
res . card ( {
type : 'Standard' ,
title : 'My Awesome Card' , // this is not required for type Simple or Standard
text : 'This is an example of an Alexa home card.' ,
image : { // image is optional
smallImageUrl : 'http://www.yoursite.com/image.jpg' , // required
largeImageUrl : null
}
} ) ;
} ) ;
// Respond to input.
chatskills . respond ( text , function ( response , card ) {
if ( ! card ) {
// Text response from res.say() method.
console . log ( response ) ;
}
else {
// Home card response from res.card() method.
console . log ( '[DISPLAYING CARD: Title=' + card . title + ', Text=' + card . text + ']' ) ;
}
} ) ;
マサチューセッツ工科大学
コリー・ベッカー http://www.primaryobjects.com/kory-becker