1. परिचय
मान लें कि आपको टीवी देखना है, लेकिन आपको रिमोट नहीं मिल रहा है. इसके अलावा, ऐसा भी हो सकता है कि आपको हर टीवी चैनल पर जाकर यह न देखना हो कि टीवी पर कोई अच्छा प्रोग्राम चल रहा है या नहीं? आइए, Google Assistant से पूछते हैं कि टीवी पर क्या चल रहा है! इस लैब में, Dialogflow का इस्तेमाल करके एक सामान्य ऐक्शन बनाया जाएगा. साथ ही, इसे Google Assistant के साथ इंटिग्रेट करने का तरीका बताया जाएगा.
एक्सरसाइज़ को इस तरह से क्रम में लगाया गया है कि क्लाउड डेवलपर को सामान्य तौर पर मिलने वाला अनुभव मिल सके:
- Dialogflow v2 एजेंट बनाना
- कस्टम इकाई बनाना
- इंटेंट बनाना
- Firebase फ़ंक्शन की मदद से वेबुक सेट अप करना
- चैटबॉट को आज़माना
- Google Assistant इंटिग्रेशन चालू करना
आपको क्या बनाना है
हम Google Assistant के लिए, इंटरैक्टिव टीवी गाइड चैटबॉट एजेंट बनाएंगे. टीवी गाइड से पूछा जा सकता है कि किसी चैनल पर फ़िलहाल क्या चल रहा है. उदाहरण के लिए; "एमटीवी पर क्या चल रहा है?" टीवी गाइड की सुविधा से आपको पता चलेगा कि फ़िलहाल क्या चल रहा है और आगे क्या चलेगा. |
|
आपको क्या सीखने को मिलेगा
- Dialogflow v2 की मदद से चैटबॉट बनाने का तरीका
- Dialogflow की मदद से कस्टम एंटिटी बनाने का तरीका
- Dialogflow की मदद से लीनियर बातचीत कैसे बनाएं
- Dialogflow और Firebase Functions की मदद से, वेबहुक फ़ुलफ़िलमेंट सेट अप करने का तरीका
- Actions on Google की मदद से, अपने ऐप्लिकेशन को Google Assistant पर उपलब्ध कराने का तरीका
ज़रूरी शर्तें
- Dialogflow एजेंट बनाने के लिए, आपके पास Google Identity / Gmail पता होना चाहिए.
- JavaScript की बुनियादी जानकारी होना ज़रूरी नहीं है. हालांकि, अगर आपको वेबहुक फ़ुलफ़िलमेंट कोड में बदलाव करना है, तो यह जानकारी आपके काम आ सकती है.
2. सेट अप करना
अपने ब्राउज़र में वेब गतिविधि की सेटिंग चालू करना
- इस लिंक पर क्लिक करें: http://myaccount.google.com/activitycontrols
- पक्का करें कि वेब और ऐप्लिकेशन गतिविधि की सेटिंग चालू हो:

Dialogflow एजेंट बनाना
- इसे खोलें: https://console.dialogflow.com
- बाईं ओर मौजूद बार में, लोगो के ठीक नीचे, "नया एजेंट बनाएं" को चुनें. अगर आपके पास पहले से एजेंट हैं, तो पहले ड्रॉपडाउन पर क्लिक करें.

- एजेंट का नाम डालें:
your-name-tvguide(अपना नाम डालें)

- डिफ़ॉल्ट भाषा के तौर पर यह चुनें: अंग्रेज़ी - en
- डिफ़ॉल्ट टाइम ज़ोन के तौर पर, वह टाइम ज़ोन चुनें जो आपके लिए सबसे सही हो.
- बनाएं पर क्लिक करें
Dialogflow को कॉन्फ़िगर करना
- बाईं ओर मौजूद मेन्यू में, अपने प्रोजेक्ट के नाम के बगल में मौजूद गियर आइकॉन पर क्लिक करें.

- एजेंट की यह जानकारी डालें: My TV Guide

- नीचे की ओर स्क्रोल करके लॉग सेटिंग पर जाएं. इसके बाद, Dialogflow के इंटरैक्शन को लॉग करने और Google Cloud Stackdriver में सभी इंटरैक्शन को लॉग करने के लिए, दोनों स्विच को टॉगल करें. अगर हमें अपनी कार्रवाई को डीबग करना है, तो हमें इसकी ज़रूरत बाद में पड़ेगी.

- सेव करें पर क्लिक करें
Actions on Google को कॉन्फ़िगर करना
- दाईं ओर मौजूद पैनल में, देखें कि यह Google Assistant में कैसे काम करता है में जाकर, Google Assistant लिंक पर क्लिक करें.

इससे यह पेज खुलेगा: http://console.actions.google.com
अगर आपने Actions on Google का इस्तेमाल पहले कभी नहीं किया है, तो आपको यह फ़ॉर्म भरना होगा:

- प्रोजेक्ट के नाम पर क्लिक करके, सिम्युलेटर में अपना ऐक्शन खोलने की कोशिश करें**.**
- मेन्यू बार में जाकर, टेस्ट करें को चुनें

- पक्का करें कि सिम्युलेटर अंग्रेज़ी पर सेट हो. इसके बाद, मेरे टेस्ट-ऐप्लिकेशन से बात करो पर क्लिक करें
इस कार्रवाई में, Dialogflow के डिफ़ॉल्ट इंटेंट का इस्तेमाल करके आपका अभिवादन किया जाएगा. इसका मतलब है कि Action on Google के साथ इंटिग्रेशन सेट अप हो गया है!
3. कस्टम एंटिटी
इकाइयां, वे ऑब्जेक्ट होती हैं जिन पर आपका ऐप्लिकेशन या डिवाइस कार्रवाइयां करता है. इसे पैरामीटर / वैरिएबल के तौर पर समझें. हम अपनी टीवी गाइड में पूछेंगे: "MTV पर क्या चल रहा है". MTV, इकाई और वैरिएबल है. मैं "National Geographic" या "Comedy Central" जैसे अन्य चैनलों के बारे में भी पूछ सकता हूँ. इकट्ठी की गई इकाई का इस्तेमाल, TV Guide API की वेब-सेवा को भेजे जाने वाले मेरे अनुरोध में पैरामीटर के तौर पर किया जाएगा.
Dialogflow की इकाइयों के बारे में यहां ज़्यादा जानकारी दी गई है.
चैनल की इकाई बनाना
- Dialogflow Console में, मेन्यू आइटम इकाई पर क्लिक करें
- इकाई बनाएं पर क्लिक करें
- कंपनी का नाम:
channel(पक्का करें कि यह सभी छोटे अक्षरों में हो) - चैनल का नाम डालें. (अगर Google Assistant को किसी चैनल का नाम समझने में परेशानी हो रही है, तो उसके लिए कोई दूसरा नाम इस्तेमाल करें). टाइप करते समय, टैब और Enter बटन का इस्तेमाल किया जा सकता है. चैनल नंबर को reference वैल्यू के तौर पर डालें. साथ ही, चैनल के नामों को समानार्थी शब्दों के तौर पर इस्तेमाल करें. जैसे:
1 - 1, Net 1, Net Station 1

5**.** नीले रंग के 'सेव करें' बटन के बगल में मौजूद मेन्यू बटन पर क्लिक करके, **रॉ एडिट** मोड पर स्विच करें.

- CSV फ़ॉर्मैट में अन्य इकाइयों को कॉपी करके चिपकाएं:
"2","2","Net 2, Net Station 2"
"3","3","Net 3, Net Station 3"
"4","4","RTL 4"
"5","5","Movie Channel"
"6","6","Sports Channel"
"7","7","Comedy Central"
"8","8","Cartoon Network"
"9","9","National Geographic"
"10","10","MTV"

- सेव करें पर क्लिक करें
4. मूड
Dialogflow, उपयोगकर्ता के इरादों को कैटगरी में बांटने के लिए इंटेंट का इस्तेमाल करता है. इंटेंट में ट्रेनिंग के लिए वाक्यांश होते हैं. ये ऐसे उदाहरण होते हैं कि कोई उपयोगकर्ता आपके एजेंट से क्या कह सकता है. उदाहरण के लिए, अगर किसी व्यक्ति को यह जानना है कि टीवी पर क्या चल रहा है, तो वह पूछ सकता है, "आज टीवी पर क्या चल रहा है?", "अभी कौनसी फ़िल्म चल रही है?" या सिर्फ़ "टीवी गाइड" कहें.
जब कोई उपयोगकर्ता कुछ लिखता है या बोलता है, तो उसे उपयोगकर्ता का एक्सप्रेशन कहा जाता है. Dialogflow, उपयोगकर्ता के एक्सप्रेशन को आपके एजेंट के सबसे सही इंटेंट से मैच करता है. किसी इंटेंट से मैच करने को इंटेंट क्लासिफ़िकेशन भी कहा जाता है.
Dialogflow इंटेंट के बारे में ज़्यादा जानकारी यहां दी गई है.
डिफ़ॉल्ट वेलकम इंटेंट में बदलाव करना
नया Dialogflow एजेंट बनाने पर, दो डिफ़ॉल्ट इंटेंट अपने-आप बन जाएंगे. डिफ़ॉल्ट वेलकम इंटेंट, वह पहला फ़्लो होता है जो एजेंट से बातचीत शुरू करने पर दिखता है. डिफ़ॉल्ट फ़ॉलबैक इंटेंट, वह फ़्लो है जो आपको तब मिलेगा, जब एजेंट आपकी बात नहीं समझ पाएगा या आपके कहे गए शब्दों से किसी इंटेंट का मिलान नहीं कर पाएगा.
- डिफ़ॉल्ट वेलकम इंटेंट पर क्लिक करें
Google Assistant के मामले में, यह डिफ़ॉल्ट वेलकम इंटेंट के साथ अपने-आप शुरू हो जाएगा. ऐसा इसलिए है, क्योंकि Dialogflow, Welcome event को सुन रहा है. हालांकि, ट्रेनिंग के लिए जोड़े गए किसी वाक्यांश को बोलकर भी इंटेंट को चालू किया जा सकता है.

डिफ़ॉल्ट वेलकम इंटेंट के लिए वेलकम मैसेज यहां दिया गया है:
उपयोगकर्ता | Agent |
"Ok Google, talk to your-name-tvguide." | "नमस्ते, मैं टीवी गाइड एजेंट हूँ. मैं आपको बता सकती हूँ कि फ़िलहाल किसी टीवी चैनल पर क्या चल रहा है. उदाहरण के लिए, मुझसे यह पूछा जा सकता है: MTV पर क्या चल रहा है." |
- नीचे की ओर स्क्रोल करके, जवाब पर जाएं.
- टेक्स्ट के सभी जवाब मिटाएं.
- एक नया टेक्स्ट जवाब बनाओ, जिसमें यह अभिवादन शामिल हो:
Welcome, I am the TV Guide agent. I can tell you what's currently playing on a TV channel. For example, you can ask me: What's on MTV?

- सेव करें पर क्लिक करें
टेस्ट के लिए कुछ समय के लिए इंटेंट बनाना
जांच के लिए, हम कुछ समय के लिए टेस्ट इंटेंट बनाएंगे, ताकि बाद में वेबुक की जांच की जा सके.
- इंटेंट मेन्यू आइटम पर फिर से क्लिक करें.
- इंटेंट बनाएं पर क्लिक करें
- इरादे का नाम डालें:
Test Intent(पक्का करें कि आपने कैपिटल टी और कैपिटल आई का इस्तेमाल किया हो. - अगर आपने इंटेंट की स्पेलिंग अलग-अलग तरीके से लिखी है, तो बैक-एंड सेवा काम नहीं करेगी!)

- ट्रेनिंग के लिए वाक्यांश जोड़ें पर क्लिक करें
Test my agentTest intent

- Fulfillment > Enable Fulfillment पर क्लिक करें

इस बार, हम जवाब को हार्डकोड नहीं कर रहे हैं. जवाब, क्लाउड फ़ंक्शन से मिलेगा!
- इस इंटेंट के लिए वेबुक कॉल चालू करें स्विच को टॉगल करें.

- सेव करें पर क्लिक करें
चैनल इंटेंट बनाना
चैनल के इंटेंट में बातचीत का यह हिस्सा शामिल होगा:
उपयोगकर्ता | Agent |
"Comedy Central पर क्या-क्या उपलब्ध है?" | ""फ़िलहाल, Comedy Central पर शाम 6 बजे से, The Simpsons चल रहा है. इसके बाद, शाम 7 बजे फ़ैमिली गाइ शुरू होगा."" |
- इंटेंट मेन्यू आइटम पर फिर से क्लिक करें.
- इंटेंट बनाएं पर क्लिक करें
- इरादे का नाम डालें:
Channel Intent(पक्का करें कि आपने कैपिटल T और कैपिटल I का इस्तेमाल किया हो. - अगर आपने इंटेंट की स्पेलिंग अलग-अलग तरीके से लिखी है, तो बैक-एंड सेवा काम नहीं करेगी!) - ट्रेनिंग वाक्यांश जोड़ें पर क्लिक करें और ये वाक्यांश जोड़ें:
What's on MTV?What's playing on Comedy Central?What show will start at 8 PM on National Geographic?What is currently on TV?What is airing now.Anything airing on Net Station 1 right now?What can I watch at 7 PM?What's on channel MTV?What's on TV?Please give me the tv guide.Tell me what is on television.What's on Comedy Central from 10 AM?What will be on tv at noon?Anything on National Geographic?TV Guide

- नीचे की ओर स्क्रोल करके, कार्रवाई और पैरामीटर पर जाएं

Dialogflow को @channel और @sys.time इकाइयों के बारे में पता है. बाद में, आपके वेबहुक में पैरामीटर का नाम और पैरामीटर की वैल्यू, आपकी वेब सेवा को भेजी जाएगी. उदाहरण के लिए:
channel=8
time=2020-01-29T19:00:00+01:00
- channel को required के तौर पर मार्क करें
टीवी गाइड एजेंट से बातचीत करते समय, आपको हमेशा स्लॉट पैरामीटर का नाम channel भरना होगा. अगर बातचीत की शुरुआत में चैनल का नाम नहीं बताया गया है, तो Dialogflow आपसे और सवाल पूछेगा. ऐसा तब तक होगा, जब तक सभी पैरामीटर स्लॉट भर नहीं जाते. 
प्रॉम्प्ट के तौर पर यह डालें:
For which TV channel do you want to hear the tv guide information?In which TV channel are you interested?

- टाइम पैरामीटर को ज़रूरी के तौर पर सेट नहीं किया गया है.
समय की जानकारी देना ज़रूरी नहीं होगा. समय न बताने पर, वेब सेवा मौजूदा समय दिखाएगी.
- खरीदार के लिए शिपिंग की सुविधा पर क्लिक करें
इस बार, हम जवाब को हार्डकोड नहीं कर रहे हैं. जवाब, क्लाउड फ़ंक्शन से मिलेगा! इसलिए, इस इंटेंट के लिए वेबुक कॉल चालू करें स्विच को टॉगल करें.
- सेव करें पर क्लिक करें
5. वेबबुक फ़ुलफ़िलमेंट
अगर आपके एजेंट को स्टैटिक इंटेंट रिस्पॉन्स के अलावा और भी जवाबों की ज़रूरत है, तो आपको फ़ुलफ़िलमेंट का इस्तेमाल करके, अपनी वेब सर्विस को एजेंट से कनेक्ट करना होगा. अपनी वेब सेवा को कनेक्ट करने से, उपयोगकर्ता के एक्सप्रेशन के आधार पर कार्रवाइयां की जा सकती हैं. साथ ही, उपयोगकर्ता को डाइनैमिक जवाब भेजे जा सकते हैं. उदाहरण के लिए, अगर किसी उपयोगकर्ता को MTV का टीवी शेड्यूल चाहिए, तो आपकी वेब सेवा आपके डेटाबेस में इसकी जांच कर सकती है. इसके बाद, वह उपयोगकर्ता को MTV का शेड्यूल दिखा सकती है.
- मुख्य मेन्यू में Fulfillment पर क्लिक करें
- इनलाइन एडिटर स्विच को चालू करें

वेबहुक की सामान्य टेस्टिंग और उसे लागू करने के लिए, इनलाइन एडिटर का इस्तेमाल किया जा सकता है. यह सर्वर का इस्तेमाल किए बिना, Firebase के लिए Cloud Functions का इस्तेमाल करता है.
- एडिटर में index.js टैब पर क्लिक करें और Node.js कोड के लिए, JavaScript के इस हिस्से को कॉपी करके चिपकाएं:
'use strict';
process.env.DEBUG = 'dialogflow:debug';
const {
dialogflow,
BasicCard,
Button,
Image,
List
} = require('actions-on-google');
const functions = require('firebase-functions');
const moment = require('moment');
const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
const { WebhookClient } = require('dialogflow-fulfillment');
var spokenText = '';
var results = null;
/* When the Test Intent gets invoked. */
function testHandler(agent) {
let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new BasicCard({
title: `Test Message`,
subTitle: `Dialogflow Test`,
image: new Image({
url: 'https://dummyimage.com/600x400/000/fff',
alt: 'Image alternate text',
}),
text: spokenText,
buttons: new Button({
title: 'This is a button',
url: 'https://assistant.google.com/',
}),
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
var jsonResponse = `{"ID":10,"Listings":[{"Title":"Catfish Marathon","Date":"2018-07-13","Time":"11:00:00"},{"Title":"Videoclips","Date":"2018-07-13","Time":"12:00:00"},{"Title":"Pimp my ride","Date":"2018-07-13","Time":"12:30:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:30:00"},{"Title":"Daria","Date":"2018-07-13","Time":"13:45:00"},{"Title":"The Real World","Date":"2018-07-13","Time":"14:00:00"},{"Title":"The Osbournes","Date":"2018-07-13","Time":"15:00:00"},{"Title":"Teenwolf","Date":"2018-07-13","Time":"16:00:00"},{"Title":"MTV Unplugged","Date":"2018-07-13","Time":"16:30:00"},{"Title":"Rupauls Drag Race","Date":"2018-07-13","Time":"17:30:00"},{"Title":"Ridiculousness","Date":"2018-07-13","Time":"18:00:00"},{"Title":"Punk'd","Date":"2018-07-13","Time":"19:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"20:00:00"},{"Title":"MTV Awards","Date":"2018-07-13","Time":"20:30:00"},{"Title":"Beavis & Butthead","Date":"2018-07-13","Time":"22:00:00"}],"Name":"MTV"}`;
var results = JSON.parse(jsonResponse);
var listItems = {};
spokenText = getSpeech(results);
for (var i = 0; i < results['Listings'].length; i++) {
listItems[`SELECT_${i}`] = {
title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
description: `Channel: ${results['Name']}`
}
}
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new List({
title: 'TV Guide',
items: listItems
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/**
* Return a text string to be spoken out by the Google Assistant
* @param {object} JSON tv results
*/
var getSpeech = function(tvresults) {
let s = "";
if(tvresults['Listings'][0]) {
let channelName = tvresults['Name'];
let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
}
return s;
}
/**
* Return a natural spoken time
* @param {string} time in 'HH:mm:ss' format
* @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
*/
var getSpokenTime = function(time){
let datetime = moment(time, 'HH:mm:ss');
let min = moment(datetime).format('m');
let hour = moment(datetime).format('h');
let partOfTheDay = moment(datetime).format('a');
if (min == '0') {
min = '';
}
return `${hour} ${min} ${partOfTheDay}`;
};
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
var agent = new WebhookClient({ request, response });
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
let channelInput = request.body.queryResult.parameters.channel;
let requestedTime = request.body.queryResult.parameters.time;
let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;
var intentMap = new Map();
intentMap.set('Test Intent', testHandler);
intentMap.set('Channel Intent', channelHandler);
agent.handleRequest(intentMap);
});

- एडिटर में package.json टैब पर क्लिक करें और JSON कोड के इस हिस्से को कॉपी करके चिपकाएं. इससे Node.js Package Manager (NPM) की सभी लाइब्रेरी इंपोर्ट हो जाती हैं:
{
"name": "tvGuideFulfillment",
"description": "Requesting TV Guide information from a web service.",
"version": "1.0.0",
"private": true,
"license": "Apache Version 2.0",
"author": "Google Inc.",
"engines": {
"node": "8"
},
"scripts": {
"start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
"deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
},
"dependencies": {
"actions-on-google": "^2.2.0",
"firebase-admin": "^5.13.1",
"firebase-functions": "^2.0.2",
"request": "^2.85.0",
"request-promise": "^4.2.5",
"moment" : "^2.24.0",
"dialogflow-fulfillment": "^0.6.1"
}
}

- लागू करें बटन पर क्लिक करें. इसमें थोड़ा समय लगेगा, क्योंकि यह आपके सर्वरलेस फ़ंक्शन को डिप्लॉय कर रहा है. स्क्रीन पर सबसे नीचे, आपको एक पॉप-अप दिखेगा. इसमें आपको अपने स्टेटस के बारे में जानकारी मिलेगी.
- आइए, वेबुक की जांच करें, ताकि यह पता चल सके कि कोड काम करता है या नहीं. दाईं ओर मौजूद सिम्युलेटर में, यह टाइप करें:
Test my agent.
अगर सब कुछ सही है, तो आपको यह मैसेज दिखेगा: "यह एक टेस्ट मैसेज है".
- चलिए, अब चैनल के इंटेंट की जांच करते हैं. इसके लिए, यह सवाल पूछें:
What's on MTV?
अगर सब कुछ सही है, तो आपको यह दिखेगा:
"MTV पर शाम 4:30 बजे से, MTV Unplugged चल रहा है. इसके बाद, शाम 5:30 बजे, Rupauls Drag Race शुरू होगा."
ज़रूरी लगे, तो ये काम भी किए जा सकते हैं - Firebase
इसे किसी दूसरे चैनल पर आज़माने पर, आपको पता चलेगा कि टीवी पर दिखने वाले नतीजे एक जैसे हैं. ऐसा इसलिए है, क्योंकि क्लाउड फ़ंक्शन अभी तक किसी असली वेब सर्वर से डेटा नहीं ले रहा है.
इसके लिए, हमें आउटबाउंड नेटवर्क कनेक्शन बनाना होगा.
अगर आपको इस ऐप्लिकेशन को वेब सेवा के साथ टेस्ट करना है, तो Firebase प्लान को Blaze में अपग्रेड करें. ध्यान दें: इन चरणों को पूरा करना ज़रूरी नहीं है. Actions on Google में अपने ऐप्लिकेशन की टेस्टिंग जारी रखने के लिए, इस लैब के अगले चरणों पर जाएं.
- Firebase कंसोल पर जाएं: https://console.firebase.google.com
- स्क्रीन पर सबसे नीचे मौजूद, अपग्रेड करें बटन दबाएं

पॉप-अप में Blaze प्लान चुनें.
- अब हमें पता चल गया है कि वेबुक काम करता है. इसलिए, हम आगे बढ़ सकते हैं और
index.jsके कोड को यहां दिए गए कोड से बदल सकते हैं. इससे यह पक्का किया जा सकेगा कि वेब सेवा से टीवी गाइड की जानकारी का अनुरोध किया जा सकता है:
'use strict';
process.env.DEBUG = 'dialogflow:debug';
const {
dialogflow,
BasicCard,
Button,
Image,
List
} = require('actions-on-google');
const functions = require('firebase-functions');
const moment = require('moment');
const { WebhookClient } = require('dialogflow-fulfillment');
const rp = require('request-promise');
const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
var spokenText = '';
var results = null;
/* When the Test Intent gets invoked. */
function testHandler(agent) {
let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new BasicCard({
title: `Test Message`,
subTitle: `Dialogflow Test`,
image: new Image({
url: 'https://dummyimage.com/600x400/000/fff',
alt: 'Image alternate text',
}),
text: spokenText,
buttons: new Button({
title: 'This is a button',
url: 'https://assistant.google.com/',
}),
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
var listItems = {};
spokenText = getSpeech(results);
for (var i = 0; i < results['Listings'].length; i++) {
listItems[`SELECT_${i}`] = {
title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
description: `Channel: ${results['Name']}`
}
}
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new List({
title: 'TV Guide',
items: listItems
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/**
* Return a text string to be spoken out by the Google Assistant
* @param {object} JSON tv results
*/
var getSpeech = function(tvresults) {
let s = "";
if(tvresults && tvresults['Listings'][0]) {
let channelName = tvresults['Name'];
let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
}
return s;
}
/**
* Return a natural spoken time
* @param {string} time in 'HH:mm:ss' format
* @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
*/
var getSpokenTime = function(time){
let datetime = moment(time, 'HH:mm:ss');
let min = moment(datetime).format('m');
let hour = moment(datetime).format('h');
let partOfTheDay = moment(datetime).format('a');
if (min == '0') {
min = '';
}
return `${hour} ${min} ${partOfTheDay}`;
};
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
var agent = new WebhookClient({ request, response });
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
let channelInput = request.body.queryResult.parameters.channel;
let requestedTime = request.body.queryResult.parameters.time;
let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;
if (requestedTime) {
console.log(requestedTime);
let offsetMin = moment().utcOffset(requestedTime)._offset;
console.log(offsetMin);
let time = moment(requestedTime).utc().add(offsetMin,'m').format('HH:mm:ss');
url = `${TVGUIDE_WEBSERVICE}/${channelInput}/${time}`;
}
console.log(url);
var options = {
uri: encodeURI(url),
json: true
};
// request promise calls an URL and returns the JSON response.
rp(options)
.then(function(tvresults) {
console.log(tvresults);
// the JSON response, will need to be formatted in 'spoken' text strings.
spokenText = getSpeech(tvresults);
results = tvresults;
})
.catch(function (err) {
console.error(err);
})
.finally(function(){
// kick start the Dialogflow app
// based on an intent match, execute
var intentMap = new Map();
intentMap.set('Test Intent', testHandler);
intentMap.set('Channel Intent', channelHandler);
agent.handleRequest(intentMap);
});
});
6. Actions on Google
Actions on Google, Google Assistant के लिए एक डेवलपमेंट प्लैटफ़ॉर्म है. इसकी मदद से, तीसरे पक्ष के डेवलपर "कार्रवाइयाँ" बना सकते हैं. ये Google Assistant के लिए ऐप्लेट होते हैं, जो ज़्यादा सुविधाएँ देते हैं.
आपको Google ऐक्शन को चालू करना होगा. इसके लिए, Google से किसी ऐप्लिकेशन को खोलने या उससे बात करने के लिए कहें.
इससे आपकी कार्रवाई खुल जाएगी, आवाज़ बदल जाएगी, और आप Google Assistant के ‘नेटिव' स्कोप से बाहर निकल जाएंगे. इसका मतलब है कि इस पॉइंट से, आपको अपने एजेंट से जो भी काम करवाना है उसे आपको ही बनाना होगा. अगर आपको Google से मौसम की जानकारी चाहिए, तो Google Assistant से अचानक यह जानकारी नहीं मांगी जा सकती. इसके लिए, आपको पहले अपने ऐप्लिकेशन को बंद करना होगा.
Google Assistant सिम्युलेटर में कार्रवाई की जांच करना
आइए, इस बातचीत को टेस्ट करें:
उपयोगकर्ता | Google Assistant |
"Ok Google, your-name-tv-guide से बात करो." | "ज़रूर. मुझे your-name-tv-guide दिखाओ." |
उपयोगकर्ता | Your-Name-TV-Guide Agent |
- | "आपका स्वागत है, मैं टीवी गाइड हूं...." |
मेरे एजेंट की जांच करो | "यह एक टेस्ट मैसेज है. अगर आपको यह मैसेज दिखता है, तो इसका मतलब है कि वेबुक फ़ुलफ़िलमेंट काम कर रहा है!" |
MTV पर क्या चल रहा है? | MTV पर शाम 4:30 बजे से, MTV Unplugged चल रहा है. इसके बाद, शाम 5:30 बजे RuPaul's Drag Race शुरू होगा. |
- Google Assistant सिम्युलेटर पर वापस स्विच करना
https://console.actions.google.com खोलें
- माइक्रोफ़ोन आइकॉन पर क्लिक करें और ये सवाल पूछें:

Talk to my test agentTest my agent
Google Assistant को यह जवाब देना चाहिए:

- अब हम पूछते हैं:
What's on Comedy Central?
इससे यह जवाब मिलना चाहिए:
फ़िलहाल, Comedy Central पर शाम 6 बजे से The Simpsons चल रहा है. इसके बाद, शाम 7 बजे फ़ैमिली गाइ शुरू होगा.
7. बधाई हो
आपने Dialogflow की मदद से, Google Assistant के लिए पहला ऐक्शन बना लिया है. बधाई हो!
आपने शायद ध्यान दिया हो कि आपकी कार्रवाई टेस्ट मोड में चल रही थी. यह आपके Google खाते से जुड़ी है. अगर आपको अपने Nest डिवाइस या iOS या Android फ़ोन पर Google Assistant ऐप्लिकेशन में, उसी खाते से लॉग इन करना है. कार्रवाई को भी आज़माया जा सकता है.
अब यह वर्कशॉप का डेमो है. हालांकि, Google Assistant के लिए ऐप्लिकेशन बनाने के बाद, अपने ऐक्शन को मंज़ूरी के लिए सबमिट किया जा सकता है. ज़्यादा जानकारी के लिए यह गाइड पढ़ें.
हमने क्या-क्या बताया
- Dialogflow v2 की मदद से चैटबॉट बनाने का तरीका
- Dialogflow की मदद से कस्टम एंटिटी बनाने का तरीका
- Dialogflow की मदद से लीनियर बातचीत कैसे बनाएं
- Dialogflow और Firebase Functions की मदद से, वेबहुक फ़ुलफ़िलमेंट सेट अप करने का तरीका
- Actions on Google की मदद से, अपने ऐप्लिकेशन को Google Assistant पर उपलब्ध कराने का तरीका
आगे क्या करना है?
क्या आपको यह कोड लैब पसंद आया? इन बेहतरीन लैब को देखें!
Google Chat के लिए इसे इंटिग्रेट करके, इस कोड लैब को जारी रखें:
G Suite और Dialogflow की मदद से, टीवी गाइड के लिए Google Chat बॉट बनाना
- Dialogflow की मदद से, Google Assistant के लिए ऐक्शन बनाना (लेवल 1)
- Dialogflow की मदद से, Google Assistant के लिए ऐक्शन बनाना (लेवल 2)
- Dialogflow की मदद से, Google Assistant के लिए ऐक्शन बनाना (लेवल 3)
- Dialogflow को Google Calendar के साथ इंटिग्रेट करके, अनुरोध पूरा करने की सुविधा को समझना
- Dialogflow के साथ Google Cloud Vision API को इंटिग्रेट करना
