बोलकर इस्तेमाल करना: Dialogflow और Actions on Google के साथ, Google Assistant के लिए टीवी गाइड के लिए कार्रवाई बनाएं

1. परिचय

आप टीवी देख रहे हैं, लेकिन आपको रिमोट नहीं मिल रहा है या हो सकता है कि आप हर टीवी चैनल पर जाकर यह पता न लगाना चाहें कि टेलीविज़न पर कुछ अच्छा चल रहा है या नहीं? Google Assistant से पूछें कि टीवी पर क्या चल रहा है! इस लैब में, आप Dialogflow का इस्तेमाल करके एक आसान कार्रवाई बनाएंगे और सीखेंगे कि उसे Google Assistant के साथ कैसे इंटिग्रेट किया जाता है.

इन अभ्यासों को इस तरह से व्यवस्थित किया जाता है कि वे क्लाउड डेवलपर के एक जैसे अनुभव को दिखा सकें:

  1. Dialogflow v2 एजेंट बनाएं
  2. कस्टम इकाई बनाएं
  3. इंटेंट बनाएं
  4. Firebase फ़ंक्शन की मदद से वेबहुक सेट अप करना
  5. चैटबॉट की जांच करें
  6. Google Assistant इंटिग्रेशन चालू करना

आपको क्या बनाना होगा

हम Google Assistant के लिए, टीवी गाइड के लिए एक इंटरैक्टिव चैटबॉट एजेंट बनाएंगे. आप टीवी गाइड से पूछ सकते हैं कि किसी चैनल पर फ़िलहाल क्या ब्रॉडकास्ट हो रहा है. उदाहरण के लिए; "MTV पर क्या चल रहा है?" टीवी गाइड की कार्रवाई से आपको पता चलेगा कि अभी कौनसा शो चल रहा है और आगे क्या होगा.

आपको इनके बारे में जानकारी मिलेगी

  • Dialogflow v2 की मदद से चैटबॉट बनाने का तरीका
  • Dialogflow की मदद से पसंद के मुताबिक इकाइयां बनाने का तरीका
  • Dialogflow के साथ लीनियर बातचीत बनाने का तरीका
  • Dialogflow और Firebase फ़ंक्शन की मदद से, वेबहुक फ़ुलफ़िलमेंट को सेट अप करने का तरीका
  • Actions on Google की मदद से, अपने ऐप्लिकेशन को Google Assistant पर लाने का तरीका

ज़रूरी शर्तें

  • Dialogflow एजेंट बनाने के लिए, आपको Google Identity / Gmail पते की ज़रूरत होगी.
  • यह ज़रूरी नहीं है कि आपको JavaScript की बुनियादी जानकारी हो. हालांकि, अगर आपको वेबहुक फ़ुलफ़िलमेंट कोड बदलना हो, तो यह आपके काम आ सकता है.

2. सेट अप किया जा रहा है

अपने ब्राउज़र में वेब गतिविधि चालू करना

  1. क्लिक करें: http://myaccount.google.com/activitycontrols

  1. पक्का करें कि वेब और ऐप्लिकेशन गतिविधि की सेटिंग चालू हो:

bf8d16b828d6f79a.png

Dialogflow एजेंट बनाना

  1. खोलें: https://console.dialogflow.com

  1. बाईं ओर मौजूद बार में, लोगो के नीचे मौजूद, "नया एजेंट बनाएं" को चुनें. अगर आपके पास मौजूदा एजेंट हैं, तो सबसे पहले ड्रॉपडाउन पर क्लिक करें.

1d7c2b56a1ab95b8.png

  1. एजेंट का नाम बताएं: your-name-tvguide (अपने नाम का इस्तेमाल करें)

35237b5c5c539ecc.png

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

डायलॉग को कॉन्फ़िगर करना

  1. प्रोजेक्ट के नाम के बगल में मौजूद, बाएं मेन्यू में मौजूद गियर आइकॉन पर क्लिक करें.

1d7c2b56a1ab95b8.png

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

26f262d359c49075.png

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

e80c17acc3cce993.png

  1. सेव करें पर क्लिक करें

Actions on Google को कॉन्फ़िगर करना

  1. दाईं ओर दिए गए पैनल में, Google Assistant में यह सुविधा कैसे काम करती है सेक्शन में जाकर, Google Assistant लिंक पर क्लिक करें.

5a4940338fc351e3.png

इससे यह खुल जाएगा: http://console.actions.google.com

अगर आपने Actions on Google का इस्तेमाल पहले कभी नहीं किया है, तो आपको सबसे पहले यह फ़ॉर्म भरना होगा:

3fd4e594fa169072.png

  1. प्रोजेक्ट के नाम पर क्लिक करके, सिम्युलेटर** में अपनी कार्रवाई शुरू करें.**
  2. मेन्यू बार में जांच करें को चुनें

6adb83ffb7adeb78.png

  1. पक्का करें कि सिम्युलेटर अंग्रेज़ी पर सेट हो और मेरे टेस्ट ऐप्लिकेशन से बात करें पर क्लिक करें

इस कार्रवाई में आपका स्वागत है. साथ ही, डायलॉग बॉक्स के डिफ़ॉल्ट इंटेंट के साथ आपका स्वागत है. इसका मतलब है कि Action on Google के साथ इंटिग्रेशन सेट अप करने से फ़ायदा हुआ!

3. कस्टम इकाइयां

इकाइयां ऐसी चीज़ें होती हैं जिन पर आपका ऐप्लिकेशन या डिवाइस कार्रवाइयां करता है. इसे पैरामीटर / वैरिएबल के तौर पर देखें. अपनी टीवी गाइड में हम पूछेंगे: "MTV पर क्या चल रहा है". MTV, इकाई और वैरिएबल है. मैं दूसरे चैनलों से भी पूछ सकता हूं, जैसे कि: "National Geographic" या "कॉमेडी सेंट्रल" हो. इकट्ठा की गई इकाई का इस्तेमाल, TV Guide API की वेब-सेवा से जुड़े मेरे अनुरोध में पैरामीटर के तौर पर किया जाएगा.

Dialogflow इकाइयों के बारे में ज़्यादा जानकारी.

चैनल की इकाई बनाना

  1. मेन्यू आइटम पर Dialogflow कंसोल में क्लिक करें: इकाइयां
  2. इकाई बनाएं पर क्लिक करें
  3. इकाई का नाम: channel (पक्का करें कि यह अंग्रेज़ी के छोटे अक्षरों में हो)
  4. चैनल का नाम पास करें. (अगर Google Assistant कुछ और समझ लेती है, तो कुछ चैनलों को एक समानार्थी शब्द की ज़रूरत होगी). टाइप करते समय, Tab और Enter बटन का इस्तेमाल किया जा सकता है. पहचान फ़ाइल की वैल्यू के तौर पर चैनल का नंबर डालें. चैनल के नाम, उनके समानार्थी शब्दों के रूप में, जैसे:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

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

e294b49b123e034f.png

  1. कॉपी करें और अन्य इकाइयों को 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"

ed78514afd5badef.png

  1. सेव करें पर क्लिक करें

4. मूड

Dialogflow टूल, उपयोगकर्ता के इंटेंट को कैटगरी में बांटने के लिए इंटेंट का इस्तेमाल करता है. इंटेंट में ट्रेनिंग वाले वाक्यांश होते हैं. ये इस बात के उदाहरण हैं कि कोई उपयोगकर्ता आपके एजेंट से क्या कह सकता है. उदाहरण के लिए, कोई उपयोगकर्ता यह जानने के लिए पूछ सकता है कि टीवी पर क्या चल रहा है. वह पूछ सकता है, "आज टीवी पर क्या चल रहा है?", "अभी क्या चल रहा है?", या बस "tvguide" बोलें.

जब कोई उपयोगकर्ता कुछ लिखता या बोलता है, जिसे यूज़र एक्सप्रेशन कहा जाता है, तो Dialogflow, उपयोगकर्ता के एक्सप्रेशन का मिलान आपके एजेंट के सबसे सही इंटेंट से करता है. इंटेंट मैच करने को इंटेंट क्लासिफ़िकेशन भी कहा जाता है.

यहां Dialogflow के इंटेंट के बारे में ज़्यादा जानकारी दी गई है.

डिफ़ॉल्ट वेलकम इंटेंट में बदलाव करना

नया Dialogflow एजेंट बनाने पर, दो डिफ़ॉल्ट इंटेंट अपने-आप बन जाएंगे. एजेंट के साथ बातचीत शुरू करने पर, सबसे पहले डिफ़ॉल्ट वेलकम इंटेंट मैसेज भेजा जाता है. डिफ़ॉल्ट फ़ॉलबैक इंटेंट, वह फ़्लो होता है जो आपको तब मिलेगा, जब एजेंट आपकी बात नहीं समझ पाएगा या वह इंटेंट, जो आपने अभी-अभी कहा है उससे मैच नहीं कर पाएगा.

  1. डिफ़ॉल्ट वेलकम इंटेंट पर क्लिक करें

Google Assistant के मामले में, यह डिफ़ॉल्ट वेलकम इंटेंट के साथ अपने-आप शुरू होगी. ऐसा इसलिए है, क्योंकि Dialogflow वेलकम इवेंट को सुन रहा है. हालांकि, डाले गए ट्रेनिंग के वाक्यांशों में से किसी एक को बोलकर भी इंटेंट का इस्तेमाल किया जा सकता है.

6beee64e8910b85d.png

डिफ़ॉल्ट तौर पर वेलकम इंटेंट के लिए, वेलकम मैसेज यहां दिया गया है:

उपयोगकर्ता

एजेंट

"Ok Google, अपने नाम वाले टीवी गाइड से बात करो."

"आपका स्वागत है, मैं टीवी गाइड एजेंट हूं. मैं आपको बता सकती हूँ कि टीवी चैनल पर अभी क्या चल रहा है. उदाहरण के लिए, आप मुझसे पूछ सकते हैं: MTV पर क्या है."

  1. नीचे की ओर स्क्रोल करके, जवाब पर जाएं.
  2. सभी मैसेज से दिए गए जवाब मिटाएं.
  3. एक नया मैसेज लिखें, जिसमें यह ग्रीटिंग शामिल हो:

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?

84a1110a7f7edba2.png

  1. सेव करें पर क्लिक करें

कुछ समय के लिए टेस्ट इंटेंट बनाना

टेस्ट करने के लिए, हम कुछ समय के लिए टेस्ट इंटेंट बनाएंगे, ताकि हम बाद में वेबहुक की जांच कर सकें.

  1. इंटेंट मेन्यू आइटम पर फिर से क्लिक करें.
  2. इंटेंट बनाएं पर क्लिक करें
  3. इंटेंट का नाम डालें: Test Intent (यह पक्का करें कि आपने कैपिटल T और कैपिटल I का इस्तेमाल किया हो. - अगर इंटेंट की स्पेलिंग अलग-अलग है, तो बैक-एंड सेवा काम नहीं करेगी!

925e02caa4de6b99.png

  1. ट्रेनिंग के लिए वाक्यांश जोड़ें पर क्लिक करें
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. ग्राहक को आइटम भेजना > ऑर्डर पूरा करने की सुविधा चालू करें

7eb73ba04d76140e.png

फ़िलहाल, हम जवाब की हार्डकोडिंग नहीं कर रहे हैं. जवाब, क्लाउड फ़ंक्शन से मिलेगा!

  1. इस इंटेंट के लिए वेबहुक कॉल चालू करें स्विच को फ़्लिप करें.

748a82d9b4d7d253.png

  1. सेव करें पर क्लिक करें

चैनल इंटेंट बनाना

चैनल इंटेंट में बातचीत का यह हिस्सा शामिल होगा:

उपयोगकर्ता

एजेंट

"कॉमेडी सेंट्रल पर क्या चल रहा है?"

""फ़िलहाल, कॉमेडी सेंट्रल पर शाम 6 बजे से 'द सिंपसंस' चल रहा है. उसके बाद शाम 7 बजे, Family Guy गेम शुरू हो जाएगा."

  1. इंटेंट मेन्यू आइटम पर फिर से क्लिक करें.
  2. इंटेंट बनाएं पर क्लिक करें
  3. इंटेंट का नाम डालें: Channel Intent (पक्का करें कि आपने कैपिटल T और कैपिटल I का इस्तेमाल किया हो. - अगर इंटेंट की स्पेलिंग अलग-अलग है, तो बैक-एंड सेवा काम नहीं करेगी!
  4. ट्रेनिंग के लिए वाक्यांश जोड़ें पर क्लिक करें और इन्हें जोड़ें:
  • 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

6eee02db02831397.png

  1. नीचे स्क्रोल करते हुए कार्रवाई और पैरामीटर पर जाएं

b7e917026760218a.png

@channel और @sys.time ऐसी इकाइयां जिन्हें Dialogflow के बारे में पता है. आपके वेबहुक में बाद में, पैरामीटर का नाम और पैरामीटर की वैल्यू आपकी वेब सेवा को भेजी जाएगी. उदाहरण के लिए:

channel=8

time=2020-01-29T19:00:00+01:00

  1. चैनल को 'rकी' के तौर पर मार्क करें

टीवी गाइड के एजेंट से बातचीत करते समय, आपको हमेशा स्लॉट पैरामीटर का नाम चैनल भरना होगा. अगर बातचीत की शुरुआत में चैनल का नाम नहीं बताया गया था, तो Dialogflow आपसे और जानकारी मांगेगा. हालांकि, ऐसा तब तक होगा, जब तक इसमें सभी पैरामीटर के स्लॉट नहीं भर जाते. 6f36973fd789c182.png अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

प्रॉम्प्ट के तौर पर:

  • For which TV channel do you want to hear the tv guide information?
  • In which TV channel are you interested?

cdb5601ead9423f8.png

  1. समय पैरामीटर को ज़रूरत के मुताबिक सेट करें.

समय देना ज़रूरी नहीं है. जब कोई समय तय नहीं किया गया हो, तो वेब सेवा मौजूदा समय दिखाएगी.

  1. ग्राहक को आइटम भेजना पर क्लिक करें

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

  1. सेव करें पर क्लिक करें

5. वेबहुक फ़ुलफ़िलमेंट

अगर आपके एजेंट को स्टैटिक इंटेंट रिस्पॉन्स से ज़्यादा की ज़रूरत है, तो अपनी वेब सेवा को अपने एजेंट से कनेक्ट करने के लिए, आपको fulfillment का इस्तेमाल करना होगा. अपनी वेब सेवा को कनेक्ट करके आप उपयोगकर्ता के एक्सप्रेशन के आधार पर कार्रवाइयां कर सकते हैं और उपयोगकर्ता को डायनैमिक जवाब वापस भेज सकते हैं. उदाहरण के लिए, अगर कोई उपयोगकर्ता MTV के लिए टीवी शेड्यूल की जानकारी पाना चाहता है, तो आपकी वेब सेवा आपके डेटाबेस की जांच कर सकती है और उपयोगकर्ता को MTV के शेड्यूल का जवाब दे सकती है.

  1. मुख्य मेन्यू में ग्राहक को आइटम भेजना पर क्लिक करें
  2. इनलाइन एडिटर स्विच को चालू करें

cc84351f0d03ab6f.png

वेबहुक की आसानी से जांच करने और उसे लागू करने के लिए, इनलाइन एडिटर का इस्तेमाल किया जा सकता है. यह बिना सर्वर वाले Cloud Functions for Firebase का इस्तेमाल करता है.

  1. एडिटर में index.js टैब पर क्लिक करें और JavaScript के इस हिस्से को Node.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 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);
});

cc84351f0d03ab6f.png

  1. एडिटर में package.json टैब पर क्लिक करें और JSON कोड के इस हिस्से को कॉपी करके चिपकाएं. यह कोड सभी Node.js पैकेज मैनेजर (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"
  }
}

af01460c2a023e68.png

  1. डिप्लॉय करें बटन पर क्लिक करें. इसमें कुछ समय लगेगा, क्योंकि यह आपका बिना सर्वर वाला फ़ंक्शन डिप्लॉय कर रहा है. स्क्रीन के नीचे, आपकी स्थिति बताने वाला एक पॉप-अप दिखेगा.
  2. वेबहुक को टेस्ट करके देखें कि कोड काम कर रहा है या नहीं. दाईं ओर मौजूद सिम्युलेटर में, यह लिखें:

Test my agent.

जब सब कुछ सही हो, तो आपको यह दिखेगा: "यह एक टेस्ट मैसेज है".

  1. चलिए, चैनल इंटेंट की जांच करते हैं. अब सवाल पूछें:

What's on MTV?

जब सब कुछ सही हो, तो आपको यह दिखाई देना चाहिए:

"MTV पर शाम 4 बजे 30 बजे से MTV अनप्लग्ड चल रहा है. इसके बाद, शाम 5 बजकर 30 मिनट पर, रूपॉल्स ड्रैग रेस शुरू हो जाएगी."

वैकल्पिक तरीका - Firebase

इसे किसी दूसरे चैनल पर आज़माने पर, आपको दिखेगा कि टीवी के नतीजे एक जैसे हैं. इसकी वजह यह है कि क्लाउड फ़ंक्शन को अभी तक किसी असली वेब सर्वर से फ़ेच नहीं किया जा रहा है.

ऐसा करने के लिए, हमें एक आउटबाउंड नेटवर्क कनेक्शन बनाना होगा.

अगर आप किसी वेब सेवा के साथ इस ऐप्लिकेशन को टेस्ट करना चाहते हैं, तो अपने Firebase प्लान को Blaze पर अपग्रेड करें. ध्यान दें: यह तरीका ज़रूरी नहीं है. कार्रवाइयां on Google में अपने ऐप्लिकेशन की जांच जारी रखने के लिए, आप इस लैब के अगले चरणों पर भी जा सकते हैं.

  1. Firebase कंसोल पर जाएं: https://console.firebase.google.com

  1. स्क्रीन में सबसे नीचे, अपग्रेड करें बटन दबाएं

ad38bc6d07462abf.png

पॉप-अप में ब्लेज़ प्लान चुनें.

  1. अब जब हमें पता चल गया है कि वेबहुक काम कर रहा है, तो हम प्रोसेस जारी रख सकते हैं और 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

कार्रवाइयां on Google, Google Assistant के लिए डेवलपमेंट प्लैटफ़ॉर्म है. इससे Google Assistant के लिए, तीसरे पक्ष के "कार्रवाइयों" वाले ऐप्लेट को डेवलप करने की अनुमति मिलती है, जो ज़्यादा सुविधाएं देते हैं.

आपको Google को कोई ऐप्लिकेशन खोलने या उससे बात करने के लिए कहना होगा.

इससे आपकी कार्रवाई खुल जाएगी, आवाज़ बदल जाएगी, और 'नेटिव' को छोड़ दिया जाएगा Google Assistant का दायरा. इसका मतलब है कि अब तक, आप अपने एजेंट से जो कुछ भी मांगते हैं उसे आपको खुद तैयार करना होगा. अगर आपको Google Assistant से मौसम की जानकारी चाहिए, तो ऐसा अचानक नहीं होगा; आपको सबसे पहले अपनी कार्रवाई के दायरे (ऐप्लिकेशन) को छोड़ देना चाहिए.

Google Assistant सिम्युलेटर में अपनी कार्रवाई की जांच करना

आइए, इस बातचीत की जांच करते हैं:

उपयोगकर्ता

Google Assistant

"Ok Google, your-name-tv-guide से बात करें."

"बिलकुल. मुझे your-name-tv-guide जाने दें."

उपयोगकर्ता

आपका-नाम-टीवी-गाइड एजेंट

-

"आपका स्वागत है, मैं टीवी गाइड हूं...."

मेरे एजेंट की जांच करें

"यह एक टेस्ट मैसेज है. जब आपको यह मैसेज दिखेगा, तो इसका मतलब है कि आपका वेबहुक फ़ुलफ़िलमेंट काम कर रहा है!"

MTV पर क्या आ रहा है?

MTV पर शाम 4 बजकर 30 मिनट से MTV टचपॉइंट चल रहा है. इसके बाद, शाम 5 बजकर 30 मिनट पर, रूपॉल्स ड्रैग रेस शुरू हो जाएगी.

  1. Google Assistant सिम्युलेटर पर वापस स्विच करें

खोलें: https://console.action.google.com

  1. माइक्रोफ़ोन आइकॉन पर क्लिक करें और ये सवाल पूछें:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Google Assistant को इन चीज़ों के साथ जवाब देना चाहिए:

5d93c6d037c8c8eb.png

  1. चलिए, अब सवाल पूछते हैं:
  • What's on Comedy Central?

इससे यह जानकारी मिलेगी:

फ़िलहाल, कॉमेडी सेंट्रल पर शाम 6 बजे से 'द सिंप्संस' चल रहा है. उसके बाद शाम 7 बजे, Family Guy चैनल शुरू होगा.

7. बधाई हो

आपने Dialogflow के साथ Google Assistant पर अपनी पहली कार्रवाई पूरी कर ली है. बहुत खूब!

आपने देखा होगा कि आपकी कार्रवाई test-mode में चल रही थी जो आपके Google खाते से जुड़ी है. अगर आपने iOS या Android फ़ोन पर, Nest डिवाइस या Google Assistant ऐप्लिकेशन में एक ही खाते से लॉगिन किया है. आपके पास इस गतिविधि की जांच करने का भी विकल्प है.

अब यह वर्कशॉप का डेमो है. हालांकि, जब आप Google Assistant के लिए असल में ऐप्लिकेशन बना रहे हों, तो आप अपनी सेट की गई कार्रवाई को मंज़ूरी के लिए सबमिट कर सकते हैं. ज़्यादा जानकारी के लिए यह गाइड पढ़ें.

इसमें हमने इन विषयों के बारे में बताया

  • Dialogflow v2 की मदद से चैटबॉट बनाने का तरीका
  • Dialogflow की मदद से पसंद के मुताबिक इकाइयां बनाने का तरीका
  • Dialogflow के साथ लीनियर बातचीत बनाने का तरीका
  • Dialogflow और Firebase फ़ंक्शन की मदद से, वेबहुक फ़ुलफ़िलमेंट को सेट अप करने का तरीका
  • Actions on Google की मदद से, अपने ऐप्लिकेशन को Google Assistant पर लाने का तरीका

आगे क्या होगा?

क्या आपको यह कोड लैब पसंद आया? ये बेहतरीन लैब देखें!

इस कोड लैब को Google Chat में इंटिग्रेट करके, इसे जारी रखें:

G Suite और Dialogflow की मदद से टीवी गाइड बनाना