হ্যান্ডস-অন: গুগলে ডায়ালগফ্লো এবং অ্যাকশন সহ Google সহকারীর জন্য একটি টিভি গাইড অ্যাকশন তৈরি করুন

1. ভূমিকা

আপনি টিভি দেখছেন, কিন্তু আপনি রিমোটটি খুঁজে পাচ্ছেন না, বা আপনি টেলিভিশনে সুন্দর কিছু আছে কিনা তা বের করতে প্রতিটি টিভি চ্যানেলে যেতে চান না? আসুন গুগল সহকারীকে জিজ্ঞাসা করি টিভিতে কী আছে! এই ল্যাবে আপনি ডায়ালগফ্লো ব্যবহার করে একটি সাধারণ অ্যাকশন তৈরি করবেন এবং কীভাবে এটিকে Google অ্যাসিস্ট্যান্টের সাথে একীভূত করতে হয় তা শিখবেন।

অনুশীলনগুলি একটি সাধারণ ক্লাউড বিকাশকারীর অভিজ্ঞতা প্রতিফলিত করার জন্য আদেশ দেওয়া হয়েছে:

  1. একটি Dialogflow v2 এজেন্ট তৈরি করুন
  2. একটি কাস্টম সত্তা তৈরি করুন
  3. অভিপ্রায় তৈরি করুন
  4. Firebase ফাংশনগুলির সাথে একটি ওয়েবহুক সেটআপ করুন৷
  5. চ্যাটবট পরীক্ষা করুন
  6. Google সহকারী ইন্টিগ্রেশন সক্ষম করুন

যা আপনি নির্মাণ করবেন

আমরা Google সহকারীর জন্য একটি ইন্টারেক্টিভ টিভি গাইড চ্যাটবট এজেন্ট তৈরি করব। আপনি টিভি গাইডকে জিজ্ঞাসা করতে পারেন, বর্তমানে একটি নির্দিষ্ট চ্যানেলে কী সম্প্রচার হচ্ছে। যেমন; "এমটিভিতে কী আছে?" টিভি গাইড অ্যাকশন আপনাকে বলবে যে বর্তমানে কী চলছে এবং পরবর্তীতে কী হবে৷

আপনি কি শিখবেন

  • ডায়ালগফ্লো v2 দিয়ে কীভাবে একটি চ্যাটবট তৈরি করবেন
  • ডায়ালগফ্লো দিয়ে কীভাবে কাস্টম সত্তা তৈরি করবেন
  • ডায়ালগফ্লো দিয়ে কীভাবে লিনিয়ার কথোপকথন তৈরি করবেন
  • ডায়ালগফ্লো এবং ফায়ারবেস ফাংশনগুলির সাথে কীভাবে ওয়েবহুক পূরণ সেটআপ করবেন
  • Google এ অ্যাকশন সহ Google Assistant-এ কীভাবে আপনার অ্যাপ্লিকেশন আনবেন

পূর্বশর্ত

  • ডায়ালগফ্লো এজেন্ট তৈরি করতে আপনার একটি Google আইডেন্টিটি/জিমেইল ঠিকানা প্রয়োজন।
  • জাভাস্ক্রিপ্টের প্রাথমিক জ্ঞানের প্রয়োজন নেই, তবে আপনি ওয়েবহুক পরিপূর্ণতা কোড পরিবর্তন করতে চাইলে এটি কার্যকর হতে পারে।

2. সেট আপ করা হচ্ছে

আপনার ব্রাউজারে ওয়েব কার্যকলাপ সক্রিয় করুন

  1. ক্লিক করুন: http://myaccount.google.com/activitycontrols

  1. নিশ্চিত করুন যে ওয়েব এবং অ্যাপ অ্যাক্টিভিটি সক্ষম আছে :

bf8d16b828d6f79a.png

একটি ডায়ালগফ্লো এজেন্ট তৈরি করুন

  1. খুলুন: https://console.dialogflow.com

  1. বাম বারে, লোগোর নীচে, " নতুন এজেন্ট তৈরি করুন " নির্বাচন করুন৷ আপনার বিদ্যমান এজেন্ট থাকলে, প্রথমে ড্রপডাউনে ক্লিক করুন।

1d7c2b56a1ab95b8.png

  1. একটি এজেন্টের নাম উল্লেখ করুন: your-name-tvguide (আপনার নিজের নাম ব্যবহার করুন)

35237b5c5c539ecc.png

  1. ডিফল্ট ভাষা হিসেবে বেছে নিন: ইংরেজি - en
  2. ডিফল্ট টাইম জোন হিসেবে, আপনার সবচেয়ে কাছের টাইম জোন বেছে নিন।
  3. তৈরি করুন ক্লিক করুন

ডায়ালগফ্লো কনফিগার করুন

  1. আপনার প্রকল্পের নামের পাশে, বাম মেনুতে গিয়ার আইকনে ক্লিক করুন।

1d7c2b56a1ab95b8.png

  1. নিম্নলিখিত এজেন্ট বিবরণ লিখুন: আমার টিভি গাইড

26f262d359c49075.png

  1. লগ সেটিংসে নীচে স্ক্রোল করুন এবং ডায়ালগফ্লো-এর ইন্টারঅ্যাকশনগুলি লগ করতে এবং Google ক্লাউড স্ট্যাকড্রাইভারে সমস্ত ইন্টারঅ্যাকশন লগ করতে উভয় সুইচ ফ্লিপ করুন৷ আমরা যদি আমাদের অ্যাকশন ডিবাগ করতে চাই তাহলে আমাদের এটি পরে প্রয়োজন হবে।

e80c17acc3cce993.png

  1. Save এ ক্লিক করুন

Google-এ অ্যাকশন কনফিগার করুন

  1. ডান হাতের প্যানেলে Google অ্যাসিস্ট্যান্ট-এ এটি কীভাবে কাজ করে তা দেখুন Google অ্যাসিস্ট্যান্ট লিঙ্কে ক্লিক করুন।

5a4940338fc351e3.png

এটি খুলবে: http://console.actions.google.com

আপনি যখন অ্যাকশনস অন Google-এ নতুন, আপনাকে প্রথমে এই ফর্মটি দিয়ে যেতে হবে:

3fd4e594fa169072.png

  1. প্রজেক্টের নামের উপর ক্লিক করে ** সিমুলেটরে আপনার অ্যাকশন খোলার চেষ্টা করুন।**
  2. মেনু বারে পরীক্ষা নির্বাচন করুন

6adb83ffb7adeb78.png

  1. নিশ্চিত করুন, সিমুলেটরটি ইংরেজিতে সেট করা আছে এবং Talk to my test-app এ ক্লিক করুন

মৌলিক ডায়ালগফ্লো ডিফল্ট অভিপ্রায় সহ অ্যাকশনটি আপনাকে শুভেচ্ছা জানাবে। তার মানে অ্যাকশন অন গুগলের সাথে ইন্টিগ্রেশন সেট আপ কাজ করেছে!

3. কাস্টম সত্তা

সত্তা হল এমন বস্তু যা আপনার অ্যাপ বা ডিভাইসে কাজ করে। পরামিতি / ভেরিয়েবল হিসাবে এটি সম্পর্কে চিন্তা করুন. আমাদের টিভি গাইডে আমরা জিজ্ঞাসা করব: " এমটিভিতে কী আছে"। MTV হল সত্তা এবং পরিবর্তনশীল। আমি অন্যান্য চ্যানেলের জন্যও চাইতে পারি, যেমন: "ন্যাশনাল জিওগ্রাফিক" বা "কমেডি সেন্ট্রাল"। সংগৃহীত সত্তাটি টিভি গাইড API ওয়েব-পরিষেবার কাছে আমার অনুরোধে একটি প্যারামিটার হিসাবে ব্যবহার করা হবে।

ডায়ালগফ্লো সত্তা সম্পর্কে আরও তথ্য এখানে

চ্যানেল সত্তা তৈরি করা হচ্ছে

  1. মেনু আইটেমের ডায়ালগফ্লো কনসোলে ক্লিক করুন: সত্তা
  2. সত্তা তৈরি করুন ক্লিক করুন
  3. সত্তার নাম: channel (নিশ্চিত করুন এটি সব ছোট হাতের)
  4. একটি চ্যানেল নামে পাস. (Google সহকারী অন্য কিছু বুঝতে পারলে কিছু চ্যানেলের একটি প্রতিশব্দ প্রয়োজন হবে)। আপনি ট্যাব ব্যবহার করতে পারেন এবং টাইপ করার সময় কী লিখতে পারেন। একটি রেফারেন্স মান হিসাবে চ্যানেল নম্বর লিখুন. এবং চ্যানেলের নামগুলি প্রতিশব্দ হিসাবে, যেমন:
  • 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. অভিপ্রায়

ডায়ালগফ্লো একজন ব্যবহারকারীর অভিপ্রায় শ্রেণীবদ্ধ করতে ইন্টেন্ট ব্যবহার করে। ইন্টেন্টে প্রশিক্ষণের বাক্যাংশ রয়েছে, যা একজন ব্যবহারকারী আপনার এজেন্টকে কী বলতে পারে তার উদাহরণ। উদাহরণস্বরূপ, একজন ব্যবহারকারী যিনি টিভিতে কী আছে তা জানতে চান তিনি জিজ্ঞাসা করতে পারেন, "আজ টিভিতে কী চলছে?", "বর্তমানে কী চলছে?", বা কেবল "tvguide" বলুন৷

যখন একজন ব্যবহারকারী কিছু লেখে বা বলে, যাকে ব্যবহারকারীর অভিব্যক্তি হিসাবে উল্লেখ করা হয়, ডায়ালগফ্লো ব্যবহারকারীর অভিব্যক্তিকে আপনার এজেন্টের সেরা অভিপ্রায়ের সাথে মেলে। একটি অভিপ্রায় মিলে যাওয়াকে অভিপ্রায় শ্রেণীবিভাগও বলা হয়।

ডায়ালগফ্লো ইন্টেন্টস সম্পর্কে এখানে আরও তথ্য রয়েছে

ডিফল্ট স্বাগত অভিপ্রায় পরিবর্তন করা হচ্ছে

আপনি যখন একটি নতুন ডায়ালগফ্লো এজেন্ট তৈরি করেন, তখন দুটি ডিফল্ট উদ্দেশ্য স্বয়ংক্রিয়ভাবে তৈরি হবে। ডিফল্ট ওয়েলকাম ইনটেন্ট হল প্রথম প্রবাহ যা আপনি এজেন্টের সাথে কথোপকথন শুরু করার সময় পান। ডিফল্ট ফলব্যাক ইন্টেন্ট হল ফ্লো যা আপনি পাবেন একবার এজেন্ট আপনাকে বুঝতে পারবে না বা আপনি যা বলেছেন তার সাথে কোনো অভিপ্রায় মেলে না।

  1. ডিফল্ট স্বাগতম অভিপ্রায় ক্লিক করুন

গুগল অ্যাসিস্ট্যান্টের ক্ষেত্রে, এটি ডিফল্ট ওয়েলকাম ইন্টেন্ট দিয়ে স্বয়ংক্রিয়ভাবে শুরু হবে। কারণ ডায়ালগফ্লো ওয়েলকাম ইভেন্ট শুনছে। যাইহোক, আপনি প্রবেশ করা প্রশিক্ষণ বাক্যাংশগুলির মধ্যে একটি বলে অভিপ্রায় আহ্বান করতে পারেন।

6beee64e8910b85d.png

এখানে ডিফল্ট স্বাগত অভিপ্রায়ের জন্য স্বাগত বার্তা রয়েছে:

ব্যবহারকারী

এজেন্ট

"ওকে গুগল, আপনার-নাম-টিভিগাইডের সাথে কথা বলুন।"

"স্বাগত, আমি টিভি গাইড এজেন্ট। আমি আপনাকে বলতে পারি বর্তমানে একটি টিভি চ্যানেলে কী চলছে। উদাহরণস্বরূপ, আপনি আমাকে জিজ্ঞাসা করতে পারেন: 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. Save এ ক্লিক করুন

একটি অস্থায়ী পরীক্ষার অভিপ্রায় তৈরি করুন

পরীক্ষার উদ্দেশ্যে, আমরা অস্থায়ী পরীক্ষার উদ্দেশ্য তৈরি করব, যাতে আমরা পরে ওয়েবহুক পরীক্ষা করতে পারি।

  1. Intents মেনু আইটেম আবার ক্লিক করুন.
  2. ইন্টেন্ট তৈরি করুন ক্লিক করুন
  3. অভিপ্রায়ের নাম লিখুন: Test Intent (নিশ্চিত করুন যে আপনি একটি মূলধন T এবং একটি মূলধন I ব্যবহার করছেন। - যদি আপনি অভিপ্রায়টি ভিন্নভাবে বানান করেন তবে ব্যাক-এন্ড পরিষেবা কাজ করবে না!)

925e02caa4de6b99.png

  1. প্রশিক্ষণ বাক্যাংশ যোগ করুন ক্লিক করুন
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. পূর্ণতা ক্লিক করুন > পূর্ণতা সক্ষম করুন

7eb73ba04d76140e.png

এই সময় আমরা একটি প্রতিক্রিয়া হার্ডকোডিং না. একটি ক্লাউড ফাংশন থেকে প্রতিক্রিয়া আসবে!

  1. এই অভিপ্রায় সুইচের জন্য ওয়েবহুক সক্ষম করুন কলটি ফ্লিপ করুন৷

748a82d9b4d7d253.png

  1. সংরক্ষণ করুন

চ্যানেলের উদ্দেশ্য তৈরি করুন

চ্যানেলের অভিপ্রায়ে কথোপকথনের এই অংশটি থাকবে:

ব্যবহারকারী

এজেন্ট

"কমেডি সেন্ট্রালে কী আছে?"

""বর্তমানে সন্ধ্যা ৬টা থেকে কমেডি সেন্ট্রালে, দ্য সিম্পসন বাজছে। এরপর সন্ধ্যা ৭টায় ফ্যামিলি গাই শুরু হবে।"

  1. Intents মেনু আইটেম আবার ক্লিক করুন.
  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

6ee02db02831397.png

  1. অ্যাকশন এবং প্যারামিটারে নিচে স্ক্রোল করুন

b7e917026760218a.png

ডায়ালগফ্লোতে পরিচিত @channel এবং @sys.time সত্তাগুলি লক্ষ্য করুন। পরে আপনার ওয়েবহুকে, প্যারামিটারের নাম এবং প্যারামিটার মান আপনার ওয়েব পরিষেবাতে পাঠানো হবে। যেমন:

channel=8

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

  1. প্রয়োজন হিসাবে channe l চিহ্নিত করুন

আপনি যখন টিভি গাইড এজেন্টের সাথে কথোপকথন করছেন, তখন আপনাকে সর্বদা স্লট প্যারামিটার নামের চ্যানেলটি পূরণ করতে হবে। কথোপকথনের শুরুতে চ্যানেলের নাম উল্লেখ না থাকলে, ডায়ালগফ্লো আরও জিজ্ঞাসা করবে, যতক্ষণ না এটি সমস্ত প্যারামিটার স্লট পূরণ করে। 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. ওয়েবহুক পূরণ

যদি আপনার এজেন্টের স্ট্যাটিক উদ্দেশ্য প্রতিক্রিয়ার চেয়ে বেশি প্রয়োজন হয়, তাহলে আপনার এজেন্টের সাথে আপনার ওয়েব পরিষেবা সংযোগ করতে আপনাকে পরিপূর্ণতা ব্যবহার করতে হবে। আপনার ওয়েব পরিষেবা সংযুক্ত করা আপনাকে ব্যবহারকারীর অভিব্যক্তির উপর ভিত্তি করে পদক্ষেপ নিতে এবং ব্যবহারকারীর কাছে গতিশীল প্রতিক্রিয়া ফেরত পাঠাতে দেয়। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী MTV-এর জন্য টিভি সময়সূচী পেতে চান, আপনার ওয়েব পরিষেবা আপনার ডাটাবেসে চেক করতে পারে এবং ব্যবহারকারীকে প্রতিক্রিয়া জানাতে পারে, MTV-এর সময়সূচী।

  1. প্রধান মেনুতে পূর্ণতা ক্লিক করুন
  2. ইনলাইন এডিটর সুইচ সক্রিয় করুন

cc84351f0d03ab6f.png

সহজ ওয়েবহুক পরীক্ষা এবং বাস্তবায়নের জন্য, আপনি ইনলাইন সম্পাদক ব্যবহার করতে পারেন। এটি ফায়ারবেসের জন্য সার্ভারহীন ক্লাউড ফাংশন ব্যবহার করে।

  1. সম্পাদকের index.js ট্যাবে ক্লিক করুন এবং 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. Deploy বাটনে ক্লিক করুন। এটি একটি মুহূর্ত লাগবে, কারণ এটি আপনার সার্ভারহীন ফাংশন স্থাপন করছে। স্ক্রিনের নীচে, আপনার স্ট্যাটাস বলার একটি পপআপ থাকবে।
  2. কোড কাজ করে কিনা তা দেখতে ওয়েবহুক পরীক্ষা করা যাক। ডান দিকের সিমুলেটরে, টাইপ করুন:

Test my agent.

যখন সবকিছু সঠিক হয়, তখন আপনার দেখতে হবে: "এটি একটি পরীক্ষার বার্তা"।

  1. চ্যানেলের উদ্দেশ্য পরীক্ষা করা যাক, এখন প্রশ্ন জিজ্ঞাসা করুন:

What's on MTV?

যখন সবকিছু সঠিক হয়, আপনার দেখতে হবে:

"এমটিভিতে বিকাল 430 টা থেকে, MTV আনপ্লাগড বাজছে। তারপর 530 টায়, রূপালস ড্র্যাগ রেস শুরু হবে।"

ঐচ্ছিক পদক্ষেপ - ফায়ারবেস

আপনি যখন এটি একটি ভিন্ন চ্যানেলের সাথে পরীক্ষা করবেন, আপনি লক্ষ্য করবেন যে টিভি ফলাফল একই। এর কারণ হল ক্লাউড ফাংশন এখনও একটি বাস্তব ওয়েব সার্ভার থেকে আনা হচ্ছে না।

এটি করার জন্য, আমাদের একটি আউটবাউন্ড নেটওয়ার্ক সংযোগ করতে হবে৷

আপনি যদি একটি ওয়েব পরিষেবার মাধ্যমে এই অ্যাপ্লিকেশনটি পরীক্ষা করতে চান, তাহলে আপনার Firebase পরিকল্পনাকে Blaze- এ আপগ্রেড করুন। দ্রষ্টব্য: এই পদক্ষেপগুলি ঐচ্ছিক। অ্যাকশন অন 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. Google-এ অ্যাকশন

অ্যাকশন অন গুগল হল গুগল অ্যাসিস্ট্যান্টের জন্য একটি ডেভেলপমেন্ট প্ল্যাটফর্ম। এটি "অ্যাকশন"-এর তৃতীয় পক্ষের বিকাশের অনুমতি দেয়—Google অ্যাসিস্ট্যান্টের জন্য অ্যাপলেট যা বর্ধিত কার্যকারিতা প্রদান করে।

গুগলকে একটি অ্যাপ খুলতে বা কথা বলতে বলে আপনাকে একটি Google অ্যাকশন আহ্বান করতে হবে।

এটি আপনার অ্যাকশন খুলবে, এটি ভয়েস পরিবর্তন করবে এবং আপনি 'নেটিভ' Google অ্যাসিস্ট্যান্ট স্কোপ ছেড়ে যাবেন। যার অর্থ, আপনি এই বিন্দু থেকে আপনার এজেন্টকে যা কিছু বলবেন তা আপনার দ্বারা তৈরি করা দরকার। আপনি হঠাৎ করে Google আবহাওয়ার তথ্যের জন্য Google সহকারীকে জিজ্ঞাসা করতে পারবেন না, যদি আপনি এটি চান; আপনাকে প্রথমে আপনার কর্মের (আপনার অ্যাপ) সুযোগ (বন্ধ) ছেড়ে দেওয়া উচিত।

Google অ্যাসিস্ট্যান্ট সিমুলেটরে আপনার অ্যাকশন পরীক্ষা করা হচ্ছে

আসুন নিম্নলিখিত কথোপকথন পরীক্ষা করা যাক:

ব্যবহারকারী

গুগল সহকারী

"ওহে গুগল, আপনার-নাম-টিভি-গাইডের সাথে কথা বলুন।"

"অবশ্যই। আমাকে আপনার-নাম-টিভি-গাইড পেতে দিন।"

ব্যবহারকারী

আপনার-নাম-টিভি-গাইড এজেন্ট

-

"স্বাগত, আমি টিভি গাইড...।"

আমার এজেন্ট পরীক্ষা

"এটি একটি পরীক্ষামূলক বার্তা, যখন আপনি এটি দেখেন, এর মানে আপনার ওয়েবহুক পরিপূর্ণতা কাজ করেছে!"

এমটিভিতে কী আছে?

বিকাল ৪টা থেকে MTV-তে MTV Unplugged চলছে। এরপর বিকাল ৫টা ৩০ মিনিটে শুরু হবে রূপলস ড্র্যাগ রেস।

  1. Google অ্যাসিস্ট্যান্ট সিমুলেটরে ফিরে যান

খুলুন: https://console.actions.google.com

  1. মাইক্রোফোন আইকনে ক্লিক করুন এবং নিম্নলিখিত জিজ্ঞাসা করুন:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Google সহকারীকে এর সাথে প্রতিক্রিয়া জানাতে হবে:

5d93c6d037c8c8eb.png

  1. এখন জিজ্ঞাসা করা যাক:
  • What's on Comedy Central?

এটি ফিরে আসা উচিত:

বর্তমানে সন্ধ্যা ৬টা থেকে কমেডি সেন্ট্রালে দ্য সিম্পসন বাজছে। এরপর সন্ধ্যা ৭টায় ফ্যামিলি গাই শুরু হবে।

7. অভিনন্দন

আপনি ডায়ালগফ্লো দিয়ে আপনার প্রথম Google অ্যাসিস্ট্যান্ট অ্যাকশন তৈরি করেছেন, খুব ভালো হয়েছে!

আপনি হয়তো লক্ষ্য করেছেন, আপনার ক্রিয়া পরীক্ষা-মোডে চলছিল যা আপনার Google অ্যাকাউন্টের সাথে সংযুক্ত। আপনি যদি একই অ্যাকাউন্ট দিয়ে আপনার iOS বা Android ফোনে আপনার Nest ডিভাইস বা Google Assistant অ্যাপে লগইন করেন। আপনি পাশাপাশি আপনার কর্ম পরীক্ষা করতে পারে.

এখন এটি একটি কর্মশালার ডেমো। কিন্তু আপনি যখন বাস্তবে Google সহকারীর জন্য অ্যাপ্লিকেশন তৈরি করছেন, তখন আপনি অনুমোদনের জন্য আপনার অ্যাকশন জমা দিতে পারেন। আরো তথ্যের জন্য এই নির্দেশিকা পড়ুন.

আমরা কভার করেছি কি

  • ডায়ালগফ্লো v2 দিয়ে কীভাবে একটি চ্যাটবট তৈরি করবেন
  • ডায়ালগফ্লো দিয়ে কীভাবে কাস্টম সত্তা তৈরি করবেন
  • ডায়ালগফ্লো দিয়ে কীভাবে লিনিয়ার কথোপকথন তৈরি করবেন
  • ডায়ালগফ্লো এবং ফায়ারবেস ফাংশনগুলির সাথে কীভাবে ওয়েবহুক পূরণ সেটআপ করবেন
  • Google এ অ্যাকশন সহ Google Assistant-এ কীভাবে আপনার অ্যাপ্লিকেশন আনবেন

এরপর কি?

এই কোড ল্যাব উপভোগ করেছেন? এই মহান ল্যাব মধ্যে একটি কটাক্ষপাত আছে!

এই কোড ল্যাবটিকে Google চ্যাটের জন্য একীভূত করে চালিয়ে যান:

G Suite এবং Dialogflow এর সাথে একটি TV গাইড Google Chat তৈরি করুন