在命令列上運行 Alexa 應用程式。在 Slack 中運行它們。在任何地方運行它們!支持 Amazon Alexa 技能和意圖。
$ npm install chatskills
Chatskills 是在 Amazon 之外運行 Alexa 應用程式的一種快速、簡單的方法。輕鬆創建您的技能和意圖並直接在命令列上運行它們!
Chatskills 不需要伺服器,可以直接在控制台中運作。它還可以在網路、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?
在此範例中,使用者存取三種不同的技能:你好、星座和有趣。
使用聊天技巧很容易。使用 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
...
要使用此技能與聊天機器人交互,請說出任何目標短語。在上面的範例中,我們使用了短語“to say hi”,但您可以與任何產生的短語進行配對。例如:
> 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.
有兩種方法可以開始運行技能。
啟動技能的第一種方法是創建一個意圖,例如「跑」。這會讓你輸入:「chatskills,要求 [skillname] 運行。」。如果意圖的回傳值為 true(以保持會話處於活動狀態),您的技能現在將運行。
「跑」技能的例子可以在猜謎遊戲中找到。
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 ) ;
}
) ;
啟動技能的第二種方法是建立一個啟動方法以在啟動應用程式時自動執行。然後只需呼叫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 ) ;
} ) ;
}
當使用者提供輸入時,輸入會與每項技能及其意圖清單進行配對。找到匹配項後,新會話開始,技能開始執行。
當使用者開始會話時,啟動的技能的意圖可以取得/設定會話內的變數值。這允許您儲存和檢索資料。
當會話對使用者開放時,來自使用者的所有輸入都將定向到啟動的技能。以這種方式,用戶不需要重新請求技能(「chatskills,問好打招呼」)。相反,用戶可以簡單地提供文本,該文本將與當前正在執行的技能的意圖相匹配。
Intent 可以透過傳回true
或呼叫res.shouldEndSession(false)
來保持會話打開,並透過傳回false
或呼叫res.shouldEndSession(true)
來結束會話。 Intent 也可以省略 return 語句,這與傳回 false 相同。
有關使用會話的範例,請參閱星座技能。請注意,意圖詢問使用者一個問題,然後返回 true 以保持會話繼續。只有在給予有效回應後,意圖才會回傳 false,從而結束會話。
總之,當使用者會話開啟時,來自使用者的所有輸入都將定向到技能。當使用者會話結束時,必須以「chatskills,詢問[SKILL]文字」的格式接收來自使用者的輸入,以執行新技能。
預設會話逾時是 1 小時內沒有使用者輸入。若要變更會話逾時,請設定chatskills.timeout = 3600
,其中該值以秒為單位指定。若要停用會話逾時,請將值設為 0。
預設聊天機器人名稱是“chatskills”。所有執行技能的請求都必須以聊天機器人名稱開頭。例如,「chatskills,問好打招呼」。若要自訂聊天機器人名稱,請使用以下命令:
chatskills . name ( 'awesome' ) ;
若要顯示警告和錯誤,請設定chatskills.verbose = true
。
Chatskills 使用 alexa-app 根據您的意圖產生許多範例話語。有關話語的更詳細描述,請參見此處。
傳遞具有兩個屬性的物件:槽和話語。
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 ) { ... }
) ;
slot 物件是一個簡單的名稱:類型映射。此類型必須是 Amazon 支援的插槽類型之一:LITERAL、NUMBER、DATE、TIME、DURATION
作為亞馬遜不再支援的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
請注意,chatskills 和 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"
多個意圖可能使用相同的可能值列表,因此您希望將它們定義在一個位置,而不是在每個意圖模式中。使用應用程式的字典。
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
您可以透過處理回應方法中傳回的卡片物件來顯示 Amazon Alexa Home Cards。使用 Alexa-app 時,主頁卡將顯示在您行動裝置上的 Amazon Alexa 應用程式中。使用 chatskills 時,可以在chatskills.respond()
回呼方法中處理 home 卡,該方法傳回兩個參數: response
和card
。
使用卡片對象,您可以按照您希望的任何方式顯示卡片的文字和圖像。例如,如果在 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