1. ভূমিকা
তুমি টিভি দেখছো, কিন্তু রিমোট খুঁজে পাচ্ছো না, অথবা হয়তো তুমি প্রতিটি টিভি চ্যানেল ঘুরে দেখতে চাও না যে টেলিভিশনে ভালো কিছু আছে কিনা? চলুন গুগল অ্যাসিস্ট্যান্টকে জিজ্ঞাসা করি টিভিতে কী আছে! এই ল্যাবে তুমি ডায়ালগফ্লো ব্যবহার করে একটি সহজ অ্যাকশন তৈরি করবে এবং শিখবে কিভাবে এটি গুগল অ্যাসিস্ট্যান্টের সাথে ইন্টিগ্রেট করতে হয়।
অনুশীলনগুলি একটি সাধারণ ক্লাউড ডেভেলপার অভিজ্ঞতা প্রতিফলিত করার জন্য সাজানো হয়েছে:
- একটি Dialogflow v2 এজেন্ট তৈরি করুন
- একটি কাস্টম এন্টিটি তৈরি করুন
- ইন্টেন্ট তৈরি করুন
- Firebase ফাংশন সহ একটি ওয়েবহুক সেটআপ করুন
- চ্যাটবট পরীক্ষা করুন
- গুগল অ্যাসিস্ট্যান্ট ইন্টিগ্রেশন সক্ষম করুন
তুমি কী তৈরি করবে
আমরা গুগল অ্যাসিস্ট্যান্টের জন্য একটি ইন্টারেক্টিভ টিভি গাইড চ্যাটবট এজেন্ট তৈরি করব। আপনি টিভি গাইডকে জিজ্ঞাসা করতে পারেন, বর্তমানে কোন নির্দিষ্ট চ্যানেলে কী সম্প্রচারিত হচ্ছে। উদাহরণস্বরূপ; "এমটিভিতে কী চলছে?" টিভি গাইড অ্যাকশন আপনাকে বলবে যে বর্তমানে কী চলছে এবং পরবর্তীতে কী দেখানো হবে। |
|
তুমি কি শিখবে
- Dialogflow v2 দিয়ে কীভাবে একটি চ্যাটবট তৈরি করবেন
- ডায়ালগফ্লো ব্যবহার করে কীভাবে কাস্টম এন্টিটি তৈরি করবেন
- ডায়ালগফ্লো ব্যবহার করে কীভাবে রৈখিক কথোপকথন তৈরি করবেন
- ডায়ালগফ্লো এবং ফায়ারবেস ফাংশন ব্যবহার করে ওয়েবহুক পরিপূর্ণতা কীভাবে সেটআপ করবেন
- গুগল অ্যাকশনস অন গুগলের মাধ্যমে গুগল অ্যাসিস্ট্যান্টে আপনার অ্যাপ্লিকেশনটি কীভাবে আনবেন
পূর্বশর্ত
- একটি Dialogflow এজেন্ট তৈরি করতে আপনার একটি Google পরিচয় / gmail ঠিকানা প্রয়োজন হবে।
- জাভাস্ক্রিপ্টের প্রাথমিক জ্ঞানের প্রয়োজন নেই, তবে আপনি যদি ওয়েবহুক পূরণ কোড পরিবর্তন করতে চান তবে এটি কাজে লাগতে পারে।
2. সেট আপ করা
আপনার ব্রাউজারে ওয়েব অ্যাক্টিভিটি সক্ষম করুন
- ক্লিক করুন: http://myaccount.google.com/activitycontrols
- নিশ্চিত করুন যে ওয়েব এবং অ্যাপ কার্যকলাপ সক্ষম আছে:

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

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

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

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

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

- সংরক্ষণ করুন ক্লিক করুন
গুগলে অ্যাকশন কনফিগার করুন
- ডান দিকের প্যানেলে "Google Assistant- এ এটি কীভাবে কাজ করে" বিভাগে "Google Assistant" লিঙ্কে ক্লিক করুন।

এটি খুলবে: http://console.actions.google.com
যখন আপনি Google-এ Actions-এ নতুন হবেন, তখন আপনাকে প্রথমে এই ফর্মটি দেখতে হবে:

- প্রকল্পের নামের উপর ক্লিক করে সিমুলেটর** তে আপনার অ্যাকশনটি খোলার চেষ্টা করুন।**
- মেনু বারে টেস্ট নির্বাচন করুন।

- নিশ্চিত করুন যে সিমুলেটরটি ইংরেজিতে সেট করা আছে এবং Talk to my test-app এ ক্লিক করুন।
অ্যাকশনটি আপনাকে স্বাগত জানাবে, মৌলিক ডায়ালগফ্লো ডিফল্ট ইন্টেন্ট সহ। এর মানে হল যে অ্যাকশন অন গুগলের সাথে ইন্টিগ্রেশন সেট আপ করা কাজ করেছে!
৩. কাস্টম সত্তা
সত্তা হলো এমন বস্তু যার উপর আপনার অ্যাপ বা ডিভাইস পদক্ষেপ নেয়। এটিকে প্যারামিটার / ভেরিয়েবল হিসেবে ভাবুন। আমাদের টিভি গাইডে আমরা জিজ্ঞাসা করব: "What's on MTV "। MTV হল সত্তা এবং পরিবর্তনশীল। আমি অন্যান্য চ্যানেলের জন্যও জিজ্ঞাসা করতে পারি, যেমন: "ন্যাশনাল জিওগ্রাফিক" বা "কমেডি সেন্ট্রাল"। টিভি গাইড API ওয়েব-সার্ভিসে আমার অনুরোধে সংগৃহীত সত্তাটি একটি প্যারামিটার হিসেবে ব্যবহার করা হবে।
এখানে Dialogflow Entities সম্পর্কে আরও তথ্য রয়েছে ।
চ্যানেল সত্তা তৈরি করা
- মেনু আইটেমে Dialogflow Console-এ ক্লিক করুন: Entities
- সত্তা তৈরি করুন ক্লিক করুন
- সত্তার নাম:
channel(নিশ্চিত করুন যে এটি সম্পূর্ণ ছোট হাতের অক্ষরে লেখা) - একটি চ্যানেলের নাম দিন। (গুগল অ্যাসিস্ট্যান্ট যদি অন্য কিছু বুঝতে পারে তবে কিছু চ্যানেলের জন্য একটি সমার্থক শব্দের প্রয়োজন হবে)। টাইপ করার সময় আপনি ট্যাব এবং এন্টার কী ব্যবহার করতে পারেন। রেফারেন্স মান হিসাবে চ্যানেল নম্বরটি লিখুন। এবং সমার্থক শব্দ হিসাবে চ্যানেলের নামগুলি লিখুন, যেমন:
-
1 - 1, Net 1, Net Station 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"

- সংরক্ষণ করুন টিপুন
৪. উদ্দেশ্য
Dialogflow ব্যবহারকারীর উদ্দেশ্য শ্রেণীবদ্ধ করার জন্য ইন্টেন্ট ব্যবহার করে। ইন্টেন্টগুলিতে প্রশিক্ষণ বাক্যাংশ থাকে, যা একজন ব্যবহারকারী আপনার এজেন্টকে কী বলতে পারে তার উদাহরণ। উদাহরণস্বরূপ, একজন ব্যবহারকারী যিনি টিভিতে কী আছে তা জানতে চান তিনি জিজ্ঞাসা করতে পারেন, "আজ টিভিতে কী চলছে?", "বর্তমানে কী চলছে?", অথবা কেবল "tvguide" বলুন।
যখন একজন ব্যবহারকারী কিছু লেখেন বা বলেন, যাকে ব্যবহারকারীর অভিব্যক্তি বলা হয়, তখন Dialogflow আপনার এজেন্টের সেরা অভিব্যক্তির সাথে ব্যবহারকারীর অভিব্যক্তিটি মেলায়। একটি অভিব্যক্তির সাথে মেলানোকে উদ্দেশ্য শ্রেণীবিভাগও বলা হয়।
এখানে Dialogflow Intents সম্পর্কে আরও তথ্য রয়েছে ।
ডিফল্ট স্বাগতম অভিপ্রায় পরিবর্তন করা
যখন আপনি একটি নতুন Dialogflow এজেন্ট তৈরি করবেন, তখন দুটি ডিফল্ট ইন্টেন্ট স্বয়ংক্রিয়ভাবে তৈরি হবে। এজেন্টের সাথে কথোপকথন শুরু করার সময় আপনি প্রথম যে ফ্লোতে পাবেন, সেটি হল Default Welcome Intent । এজেন্ট আপনাকে বুঝতে না পারলে বা আপনি যা বলেছেন তার সাথে কোনও ইন্টেন্ট মেলাতে না পারলে, Default Fallback Intent হল সেই ফ্লো যা আপনি পাবেন।
- ডিফল্ট ওয়েলকাম ইন্টেন্টে ক্লিক করুন
গুগল অ্যাসিস্ট্যান্টের ক্ষেত্রে, এটি ডিফল্ট ওয়েলকাম ইন্টেন্ট দিয়ে স্বয়ংক্রিয়ভাবে শুরু হবে। কারণ ডায়ালগফ্লো ওয়েলকাম ইভেন্টটি শুনছে। তবে, আপনি প্রবেশ করানো প্রশিক্ষণ বাক্যাংশগুলির একটি বলেও ইন্টেন্টটি আহ্বান করতে পারেন।

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

- সংরক্ষণ করুন ক্লিক করুন
একটি অস্থায়ী পরীক্ষার উদ্দেশ্য তৈরি করুন
পরীক্ষার উদ্দেশ্যে, আমরা অস্থায়ী পরীক্ষার উদ্দেশ্য তৈরি করব, যাতে আমরা পরে ওয়েবহুকটি পরীক্ষা করতে পারি।
- আবার Intents মেনু আইটেমে ক্লিক করুন।
- "ইন্টেন্ট তৈরি করুন" এ ক্লিক করুন
- ইন্টেন্টের নাম লিখুন:
Test Intent(নিশ্চিত করুন যে আপনি বড় হাতের T এবং বড় হাতের I ব্যবহার করছেন। - যদি আপনি ভিন্নভাবে ইন্টেন্ট বানান করেন, তাহলে ব্যাক-এন্ড পরিষেবা কাজ করবে না!)

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

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

এবার আমরা কোনও প্রতিক্রিয়া হার্ডকোড করছি না। প্রতিক্রিয়াটি একটি ক্লাউড ফাংশন থেকে আসবে!
- এই ইন্টেন্ট সুইচের জন্য Enable Webhook কলটি উল্টে দিন।

- সংরক্ষণ করুন টিপুন
চ্যানেলের উদ্দেশ্য তৈরি করুন
চ্যানেল ইন্টেন্টে কথোপকথনের এই অংশটি থাকবে:
ব্যবহারকারী | এজেন্ট |
"কমেডি সেন্ট্রালে কী আছে?" | ""বর্তমানে কমেডি সেন্ট্রালে সন্ধ্যা ৬টা থেকে দ্য সিম্পসনস নাটকটি প্রচারিত হচ্ছে। এরপর সন্ধ্যা ৭টায় ফ্যামিলি গাই নাটকটি শুরু হবে।"" |
- আবার Intents মেনু আইটেমে ক্লিক করুন।
- "ইন্টেন্ট তৈরি করুন" এ ক্লিক করুন
- ইন্টেন্টের নাম লিখুন:
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 পূরণ করতে হবে। যদি কথোপকথনের শুরুতে চ্যানেলের নাম উল্লেখ না করা থাকে, তাহলে Dialogflow আরও জিজ্ঞাসা করবে, যতক্ষণ না এটি সমস্ত প্যারামিটার স্লট পূরণ করে। 
প্রম্পট হিসেবে লিখুন:
-
For which TV channel do you want to hear the tv guide information? -
In which TV channel are you interested?

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

সহজ ওয়েবহুক পরীক্ষা এবং বাস্তবায়নের জন্য, আপনি ইনলাইন এডিটর ব্যবহার করতে পারেন। এটি Firebase এর জন্য সার্ভারলেস ক্লাউড ফাংশন ব্যবহার করে।
- এডিটরে 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);
});

- এডিটরে 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"
}
}

- Deploy বোতামে ক্লিক করুন। এতে কিছুটা সময় লাগবে, কারণ এটি আপনার সার্ভারলেস ফাংশনটি স্থাপন করছে। স্ক্রিনের নীচে, আপনার অবস্থা সম্পর্কে একটি পপআপ আসবে।
- কোডটি কাজ করে কিনা তা দেখার জন্য ওয়েবহুকটি পরীক্ষা করা যাক। ডান দিকের সিমুলেটরে, টাইপ করুন:
Test my agent.
সবকিছু ঠিকঠাক হলে, আপনার দেখা উচিত: "এটি একটি পরীক্ষামূলক বার্তা"।
- চ্যানেল ইন্টেন্ট পরীক্ষা করা যাক, এখন প্রশ্নটি জিজ্ঞাসা করুন:
What's on MTV?
সবকিছু ঠিকঠাক হয়ে গেলে, আপনার দেখা উচিত:
"এমটিভিতে বিকাল ৪টা ৩০ মিনিট থেকে, এমটিভি আনপ্লাগড প্রচারিত হচ্ছে। এরপর বিকাল ৫টা ৩০ মিনিটে, রুপালের ড্র্যাগ রেস শুরু হবে।"
ঐচ্ছিক পদক্ষেপ - ফায়ারবেস
যখন আপনি এটি অন্য কোন চ্যানেল দিয়ে পরীক্ষা করবেন, তখন আপনি লক্ষ্য করবেন যে টিভির ফলাফল একই রকম। এর কারণ হল ক্লাউড ফাংশনটি এখনও একটি আসল ওয়েব সার্ভার থেকে আনা হচ্ছে না।
এটি করার জন্য, আমাদের একটি আউটবাউন্ড নেটওয়ার্ক সংযোগ তৈরি করতে হবে।
যদি আপনি এই অ্যাপ্লিকেশনটি কোনও ওয়েব পরিষেবা দিয়ে পরীক্ষা করতে চান, তাহলে আপনার Firebase প্ল্যানটি Blaze এ আপগ্রেড করুন। দ্রষ্টব্য: এই পদক্ষেপগুলি ঐচ্ছিক। আপনি Actions on Google এ আপনার অ্যাপ্লিকেশনটি পরীক্ষা চালিয়ে যেতে এই ল্যাবের পরবর্তী পদক্ষেপগুলিতেও যেতে পারেন।
- Firebase কনসোলে নেভিগেট করুন: https://console.firebase.google.com
- স্ক্রিনের নীচে, আপগ্রেড বোতাম টিপুন

পপআপে ব্লেজ প্ল্যানটি নির্বাচন করুন।
- এখন যেহেতু আমরা জানি যে ওয়েবহুক কাজ করছে, আমরা
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);
});
});
৬. গুগলে অ্যাকশন
অ্যাকশনস অন গুগল হল গুগল অ্যাসিস্ট্যান্টের জন্য একটি ডেভেলপমেন্ট প্ল্যাটফর্ম। এটি তৃতীয় পক্ষকে "অ্যাকশন" - গুগল অ্যাসিস্ট্যান্টের জন্য অ্যাপলেট তৈরি করতে দেয় যা বর্ধিত কার্যকারিতা প্রদান করে।
আপনাকে একটি গুগল অ্যাকশন চালু করতে হবে, গুগলকে একটি অ্যাপ খুলতে বা কথা বলতে বলার মাধ্যমে।
এটি আপনার অ্যাকশন খুলবে, ভয়েস পরিবর্তন করবে এবং আপনি 'নেটিভ' গুগল অ্যাসিস্ট্যান্ট স্কোপ ছেড়ে যাবেন। এর অর্থ, এখন থেকে আপনি আপনার এজেন্টকে যা কিছু জিজ্ঞাসা করবেন তা আপনার নিজের তৈরি করা উচিত। আপনি যদি চান তবে হঠাৎ করে গুগল অ্যাসিস্ট্যান্টের কাছে গুগল আবহাওয়ার তথ্য চাইতে পারবেন না; আপনার প্রথমে আপনার অ্যাকশনের স্কোপ (আপনার অ্যাপ) ছেড়ে দেওয়া উচিত (বন্ধ করা উচিত)।
গুগল অ্যাসিস্ট্যান্ট সিমুলেটরে আপনার অ্যাকশন পরীক্ষা করা হচ্ছে
আসুন নিম্নলিখিত কথোপকথনটি পরীক্ষা করি:
ব্যবহারকারী | গুগল সহকারী |
"হে গুগল, তোমার-নাম-টিভি-গাইডের সাথে কথা বলো।" | "অবশ্যই। আমাকে তোমার নাম-টিভি-গাইড আনতে দাও।" |
ব্যবহারকারী | আপনার নাম-টিভি-গাইড এজেন্ট |
- | "স্বাগতম, আমি টিভি গাইড......" |
আমার এজেন্ট পরীক্ষা করো | "এটি একটি পরীক্ষামূলক বার্তা, যখন আপনি এটি দেখবেন, তার মানে আপনার ওয়েবহুক পরিপূর্ণতা কাজ করেছে!" |
এমটিভিতে কী আছে? | এমটিভিতে বিকাল ৪টা ৩০ মিনিট থেকে, এমটিভি আনপ্লাগড প্রচারিত হবে। এরপর বিকাল ৫টা ৩০ মিনিটে, রুপালের ড্র্যাগ রেস শুরু হবে। |
- গুগল অ্যাসিস্ট্যান্ট সিমুলেটরে ফিরে যান
খুলুন: https://console.actions.google.com
- মাইক্রোফোন আইকনে ক্লিক করুন এবং নিম্নলিখিত প্রশ্নগুলি জিজ্ঞাসা করুন:

-
Talk to my test agent -
Test my agent
গুগল অ্যাসিস্ট্যান্টের উত্তর দেওয়া উচিত:

- এবার জিজ্ঞাসা করা যাক:
-
What's on Comedy Central?
এটি ফিরে আসা উচিত:
বর্তমানে কমেডি সেন্ট্রালে সন্ধ্যা ৬টা থেকে দ্য সিম্পসনস প্রচারিত হচ্ছে। এরপর সন্ধ্যা ৭টায় ফ্যামিলি গাই শুরু হবে।
৭. অভিনন্দন
তুমি Dialogflow ব্যবহার করে তোমার প্রথম Google Assistant অ্যাকশন তৈরি করেছো, দারুন!
আপনি হয়তো লক্ষ্য করেছেন, আপনার অ্যাকশনটি টেস্ট-মোডে চলছে যা আপনার গুগল অ্যাকাউন্টের সাথে সংযুক্ত। আপনি যদি আপনার নেস্ট ডিভাইসে অথবা আপনার iOS বা অ্যান্ড্রয়েড ফোনে গুগল অ্যাসিস্ট্যান্ট অ্যাপে একই অ্যাকাউন্ট দিয়ে লগইন করেন, তাহলে আপনি আপনার অ্যাকশনটিও পরীক্ষা করতে পারেন।
এখন এটি একটি কর্মশালার ডেমো। কিন্তু যখন আপনি গুগল অ্যাসিস্ট্যান্টের জন্য অ্যাপ্লিকেশন তৈরি করছেন, তখন আপনি অনুমোদনের জন্য আপনার অ্যাকশন জমা দিতে পারেন। আরও তথ্যের জন্য এই নির্দেশিকাটি পড়ুন।
আমরা যা কভার করেছি
- Dialogflow v2 দিয়ে কীভাবে একটি চ্যাটবট তৈরি করবেন
- ডায়ালগফ্লো ব্যবহার করে কীভাবে কাস্টম এন্টিটি তৈরি করবেন
- ডায়ালগফ্লো ব্যবহার করে কীভাবে রৈখিক কথোপকথন তৈরি করবেন
- ডায়ালগফ্লো এবং ফায়ারবেস ফাংশন ব্যবহার করে ওয়েবহুক পরিপূর্ণতা কীভাবে সেটআপ করবেন
- গুগল অ্যাকশনস অন গুগলের মাধ্যমে গুগল অ্যাসিস্ট্যান্টে আপনার অ্যাপ্লিকেশনটি কীভাবে আনবেন
এরপর কী?
এই কোড ল্যাবটি উপভোগ করেছেন? এই দুর্দান্ত ল্যাবগুলি একবার দেখে নিন!
গুগল চ্যাটের জন্য এই কোড ল্যাবটি একীভূত করে চালিয়ে যান:
G Suite এবং Dialogflow ব্যবহার করে Google Chat-এ একটি টিভি গাইড তৈরি করুন
- Dialogflow (লেভেল ১) ব্যবহার করে Google Assistant-এর জন্য অ্যাকশন তৈরি করুন
- Dialogflow (লেভেল ২) ব্যবহার করে Google Assistant-এর জন্য অ্যাকশন তৈরি করুন
- Dialogflow (লেভেল ৩) ব্যবহার করে Google Assistant-এর জন্য অ্যাকশন তৈরি করুন
- গুগল ক্যালেন্ডারের সাথে ডায়ালগফ্লো একীভূত করে পরিপূর্ণতা বোঝা
- Dialogflow-এর সাথে Google Cloud Vision API ইন্টিগ্রেট করুন
