1. शुरू करने से पहले
इस कोडलैब में, आपको Dialogflow Essentials (ES) के टेक्स्ट और वॉइस बॉट को Flutter ऐप्लिकेशन में इंटिग्रेट करने का तरीका बताया जाएगा. Dialogflow ES, बातचीत वाले यूज़र इंटरफ़ेस (यूआई) बनाने के लिए एक डेवलपमेंट सुइट है. इसलिए, चैटबॉट, वॉइस बॉट, फ़ोन गेटवे. आप सभी एक ही टूल का इस्तेमाल करके इसे बना सकते हैं. साथ ही, 20 से ज़्यादा भाषाओं में कई चैनलों के लिए भी इसका इस्तेमाल किया जा सकता है. Dialogflow को Google Assistant, Slack, और Facebook Messenger जैसे कई लोकप्रिय बातचीत वाले प्लैटफ़ॉर्म के साथ इंटिग्रेट किया जा सकता है. अगर आपको इनमें से किसी प्लैटफ़ॉर्म के लिए एजेंट बनाना है, तो आपको इंटिग्रेशन के कई विकल्पों में से किसी एक का इस्तेमाल करना चाहिए. हालांकि, मोबाइल डिवाइसों के लिए चैटबॉट बनाने के लिए, आपको कस्टम इंटिग्रेशन बनाना होगा. आपको इंटेंट बनाने होंगे. इसके लिए, आपको मशीन लर्निंग मॉडल को ट्रेन करने के लिए ट्रेनिंग फ़्रेज़ तय करने होंगे.
इस लैब को इस तरह से व्यवस्थित किया गया है कि क्लाउड डेवलपर को आम तौर पर ऐसा अनुभव मिलता है:
- एनवायरमेंट सेटअप करना
- Dialogflow: नया Dialogflow ES एजेंट बनाना
- Dialogflow: Dialogflow को कॉन्फ़िगर करना
- Google Cloud: सेवा खाता बनाना
- Flutter: चैट ऐप्लिकेशन बनाना
- Flutter प्रोजेक्ट बनाना
- सेटिंग और अनुमतियां कॉन्फ़िगर करना
- डिपेंडेंसी जोड़ना
- सेवा खाते से लिंक किया जा रहा है.
- ऐप्लिकेशन को वर्चुअल डिवाइस या फ़िज़िकल डिवाइस पर चलाना
- Flutter: Building the chat interface with Speech to Text support
- चैट इंटरफ़ेस बनाया जा रहा है
- चैट इंटरफ़ेस को लिंक करना
- Dialogflow gRPC पैकेज को ऐप्लिकेशन में इंटिग्रेट करना
- Dialogflow: Dialogflow एजेंट को मॉडल करना
- वेलकम और फ़ॉलबैक इंटेंट कॉन्फ़िगर करना
- अक्सर पूछे जाने वाले सवालों के नॉलेज बेस का इस्तेमाल करना
पूर्वापेक्षा
- Dart/Flutter का बुनियादी अनुभव
- Google Cloud Platform का बुनियादी अनुभव
- Dialogflow ES का बुनियादी अनुभव
आपको क्या बनाना है
इस कोडलैब में, आपको मोबाइल पर काम करने वाला ऐसा बॉट बनाने का तरीका बताया जाएगा जो Dialogflow टूल के बारे में अक्सर पूछे जाने वाले सवालों के जवाब दे सकता है. असली उपयोगकर्ता, जवाब पाने के लिए टेक्स्ट इंटरफ़ेस से इंटरैक्ट कर सकते हैं. इसके अलावा, वे मोबाइल डिवाइस के बिल्ट-इन माइक्रोफ़ोन के ज़रिए बोलकर भी सवाल पूछ सकते हैं. |
|
आपको क्या सीखने को मिलेगा
- Dialogflow Essentials का इस्तेमाल करके चैटबॉट बनाने का तरीका
- Dialogflow gRPC पैकेज की मदद से, Dialogflow को Flutter ऐप्लिकेशन में इंटिग्रेट करने का तरीका
- Dialogflow की मदद से टेक्स्ट इंटेंट का पता कैसे लगाया जाता है
- माइक्रोफ़ोन से Dialogflow पर आवाज़ को स्ट्रीम करने का तरीका
- सार्वजनिक तौर पर उपलब्ध अक्सर पूछे जाने वाले सवालों को इंपोर्ट करने के लिए, नॉलेज बेस कनेक्टर का इस्तेमाल कैसे करें
- वर्चुअल या फ़िज़िकल डिवाइस में, टेक्स्ट और आवाज़ वाले इंटरफ़ेस के ज़रिए चैटबॉट को टेस्ट करना
आपको किन चीज़ों की ज़रूरत होगी
- Dialogflow एजेंट बनाने के लिए, आपको Google Identity / Gmail पते की ज़रूरत होगी.
- सेवा खाता डाउनलोड करने के लिए, आपके पास Google Cloud Platform का ऐक्सेस होना चाहिए
- Flutter का डेवलपमेंट एनवायरमेंट
Flutter डेवलपमेंट एनवायरमेंट सेट अप करना
- वह ऑपरेटिंग सिस्टम चुनें जिस पर आपको Flutter इंस्टॉल करना है.
- macOS का इस्तेमाल करने वाले लोग: https://flutter.dev/docs/get-started/install/macos
- Windows: https://flutter.dev/docs/get-started/install/windows
- Linux: https://flutter.dev/docs/get-started/install/linux
- ChromeOS: https://flutter.dev/docs/get-started/install/chromeos
- Flutter की मदद से ऐप्लिकेशन बनाने के लिए, किसी भी टेक्स्ट एडिटर के साथ-साथ हमारे कमांड-लाइन टूल का इस्तेमाल किया जा सकता है. हालांकि, इस वर्कशॉप में Android Studio का इस्तेमाल किया जाएगा. Android Studio के लिए Flutter और Dart प्लगिन, आपको कोड पूरा करने, सिंटैक्स हाइलाइट करने, विजेट में बदलाव करने में मदद करने, चलाने और डीबग करने की सुविधा देते हैं. https://flutter.dev/docs/get-started/editor पर दिया गया तरीका अपनाएं
2. एनवायरमेंट सेटअप करना
Dialogflow: नया Dialogflow ES एजेंट बनाना
- खोलें
- बाईं ओर मौजूद बार में, लोगो के ठीक नीचे मौजूद ड्रॉपडाउन में, "नया एजेंट बनाएं" चुनें. (ध्यान दें, "ग्लोबल" वाले ड्रॉपडाउन पर क्लिक न करें. हमें अक्सर पूछे जाने वाले सवालों के नॉलेज बेस का इस्तेमाल करने के लिए, Dialogflow के ग्लोबल इंस्टेंस की ज़रूरत होगी.)
- एजेंट का नाम
yourname-dialogflowडालें (अपना नाम डालें) - डिफ़ॉल्ट भाषा के तौर पर, अंग्रेज़ी - en चुनें.
- डिफ़ॉल्ट टाइम ज़ोन के तौर पर, वह टाइम ज़ोन चुनें जो आपके लिए सबसे सही हो.
- मेगा एजेंट को न चुनें. (इस सुविधा की मदद से, एक ऐसा एजेंट बनाया जा सकता है जो "सब" एजेंट के बीच तालमेल बिठा सकता है. अब हमें इसकी ज़रूरत नहीं है.)
- बनाएं पर क्लिक करें.

Dialogflow को कॉन्फ़िगर करना
- बाईं ओर मौजूद मेन्यू में, अपने प्रोजेक्ट के नाम के बगल में मौजूद गियर आइकॉन पर क्लिक करें.

- एजेंट की यह जानकारी डालें: Dialogflow FAQ Chatbot
- बीटा वर्शन की सुविधाएं चालू करें के बगल में मौजूद स्विच को टॉगल करें.

- Speech टैब पर क्लिक करें. इसके बाद, पक्का करें कि Auto Speech Adaptation बॉक्स चालू हो.
- इसके अलावा, पहले स्विच को भी फ़्लिप किया जा सकता है. इससे स्पीच मॉडल को बेहतर बनाने में मदद मिलेगी. हालांकि, यह सुविधा सिर्फ़ तब उपलब्ध होती है, जब Dialogflow के ट्रायल वर्शन को अपग्रेड किया जाता है.
- सेव करें पर क्लिक करें
Google Cloud: सेवा खाता पाना
Dialogflow में एजेंट बनाने के बाद, Google Cloud Console में एक Google Cloud प्रोजेक्ट बनाया जाना चाहिए.
- Google Cloud Console खोलें:
- पक्का करें कि आपने उसी Google खाते से लॉग इन किया हो जिसका इस्तेमाल Dialogflow में किया गया था. इसके बाद, सबसे ऊपर मौजूद नीले बार में, प्रोजेक्ट:
yourname-dialogflowचुनें. - इसके बाद, सबसे ऊपर मौजूद टूलबार में
Dialogflow APIखोजें. इसके बाद, ड्रॉपडाउन में Dialogflow API के नतीजे पर क्लिक करें.

- नीले रंग के मैनेज करें बटन पर क्लिक करें. इसके बाद, बाईं ओर मौजूद मेन्यू बार में, क्रेडेंशियल पर क्लिक करें. (अगर Dialogflow की सुविधा अभी चालू नहीं है, तो पहले चालू करें पर क्लिक करें)

- अपनी स्क्रीन पर सबसे ऊपर मौजूद, क्रेडेंशियल बनाएं पर क्लिक करें. इसके बाद, सेवा खाता चुनें.

- सेवा खाते का नाम डालें:
flutter_dialogflow, आईडी और जानकारी डालें. इसके बाद, बनाएं पर क्लिक करें.

- दूसरे चरण में, आपको भूमिका चुननी होगी:
Dialogflow API Admin. इसके बाद, जारी रखें और हो गया पर क्लिक करें. flutter_dialogflowसेवा खाते पर क्लिक करें. इसके बाद, कुंजियां टैब पर क्लिक करें और कुंजी जोड़ें > नई कुंजी बनाएं पर क्लिक करें

- JSON फ़ॉर्मैट वाली कुंजी बनाएं. इसका नाम बदलकर
credentials.jsonकर दें और इसे अपनी हार्ड ड्राइव की किसी सुरक्षित जगह पर सेव करें. हम इसका इस्तेमाल बाद में करेंगे.

बहुत बढ़िया, हमें जिन टूल की ज़रूरत है वे सभी सही तरीके से सेट अप किए गए हैं. अब हम अपने ऐप्लिकेशन में Dialogflow को इंटिग्रेट करना शुरू कर सकते हैं!
3. Flutter: Building the Chat Application
बॉयलरप्लेट ऐप्लिकेशन बनाना
- Android Studio खोलें और नया Flutter प्रोजेक्ट शुरू करें को चुनें.
- प्रोजेक्ट टाइप के तौर पर Flutter Application चुनें. इसके बाद, आगे बढ़ें पर क्लिक करें.
- पुष्टि करें कि Flutter SDK का पाथ, एसडीके की जगह की जानकारी देता हो. अगर टेक्स्ट फ़ील्ड खाली है, तो एसडीके इंस्टॉल करें... को चुनें.
- प्रोजेक्ट का नाम डालें. उदाहरण के लिए,
flutter_dialogflow_agent. इसके बाद, आगे बढ़ें पर क्लिक करें. - पैकेज के नाम में बदलाव करें और Finish पर क्लिक करें.

इससे मटीरियल कॉम्पोनेंट वाला एक सैंपल ऐप्लिकेशन बन जाएगा.
Android Studio को एसडीके इंस्टॉल करने और प्रोजेक्ट बनाने के लिए इंतज़ार करें.
सेटिंग और अनुमतियां
- हम जिस ऑडियो रिकॉर्डर लाइब्रेरी sound_stream का इस्तेमाल करेंगे उसके लिए, कम से कम 21 का minSdk ज़रूरी है. इसलिए, इसे defaultConfig ब्लॉक में android/app/build.gradle में बदलते हैं. (ध्यान दें, android फ़ोल्डर में दो build.gradle फ़ाइलें होती हैं, लेकिन app फ़ोल्डर में मौजूद फ़ाइल सही होती है.)
defaultConfig {
applicationId "com.myname.flutter_dialogflow_agent"
minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
- माइक्रोफ़ोन को अनुमतियां देने के लिए, हमें app/src/main/AndroidManifest.xml फ़ाइल में INTERNET और RECORD_AUDIO अनुमतियां जोड़नी होंगी. इससे ऐप्लिकेशन, क्लाउड में चलने वाले Dialogflow एजेंट से संपर्क कर पाएगा. आपके Flutter प्रोजेक्ट में कई AndroidManifest.xml फ़ाइलें हैं. हालांकि, आपको मुख्य फ़ोल्डर में मौजूद फ़ाइल की ज़रूरत होगी. लाइनों को सीधे तौर पर मेनिफ़ेस्ट टैग में जोड़ा जा सकता है.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
डिपेंडेंसी जोड़ना
हम sound_stream, rxdart, और dialogflow_grpc पैकेज का इस्तेमाल करेंगे.
sound_streamडिपेंडेंसी जोड़ना
$ flutter pub add sound_stream Resolving dependencies... async 2.8.1 (2.8.2 available) characters 1.1.0 (1.2.0 available) matcher 0.12.10 (0.12.11 available) + sound_stream 0.3.0 test_api 0.4.2 (0.4.5 available) vector_math 2.1.0 (2.1.1 available) Downloading sound_stream 0.3.0... Changed 1 dependency!
dialogflow_grpcडिपेंडेंसी जोड़ना
flutter pub add dialogflow_grpc Resolving dependencies... + archive 3.1.5 async 2.8.1 (2.8.2 available) characters 1.1.0 (1.2.0 available) + crypto 3.0.1 + dialogflow_grpc 0.2.9 + fixnum 1.0.0 + googleapis_auth 1.1.0 + grpc 3.0.2 + http 0.13.4 + http2 2.0.0 + http_parser 4.0.0 matcher 0.12.10 (0.12.11 available) + protobuf 2.0.0 test_api 0.4.2 (0.4.5 available) + uuid 3.0.4 vector_math 2.1.0 (2.1.1 available) Downloading dialogflow_grpc 0.2.9... Downloading grpc 3.0.2... Downloading http 0.13.4... Downloading archive 3.1.5... Changed 11 dependencies!
rxdartडिपेंडेंसी जोड़ना
$ flutter pub add rxdart Resolving dependencies... async 2.8.1 (2.8.2 available) characters 1.1.0 (1.2.0 available) matcher 0.12.10 (0.12.11 available) + rxdart 0.27.2 test_api 0.4.2 (0.4.5 available) vector_math 2.1.0 (2.1.1 available) Downloading rxdart 0.27.2... Changed 1 dependency!
सेवा खाते और Google Cloud प्रोजेक्ट की जानकारी लोड की जा रही है
- अपने प्रोजेक्ट में एक डायरेक्ट्री बनाएं और उसका नाम यह रखें:
assets. - Google Cloud Console से डाउनलोड की गई credentials.json फ़ाइल को assets फ़ोल्डर में ले जाएं.
- pubspec.yaml खोलें और सेवा खाते को फ़्लटर ब्लॉक में जोड़ें.
flutter:
uses-material-design: true
assets:
- assets/credentials.json
ऐप्लिकेशन को किसी फ़िज़िकल डिवाइस पर चलाना
अगर आपके पास Android डिवाइस है, तो यूएसबी केबल की मदद से अपने फ़ोन को प्लग इन करें और डिवाइस पर डीबग करें. Android डिवाइस पर, डेवलपर विकल्प स्क्रीन के ज़रिए इसे सेट अप करने के लिए, यह तरीका अपनाएं.
वर्चुअल डिवाइस पर ऐप्लिकेशन चलाना
अगर आपको वर्चुअल डिवाइस पर ऐप्लिकेशन चलाना है, तो यह तरीका अपनाएं:
- Tools> AVD Manager पर क्लिक करें. (इसके अलावा, ऊपर मौजूद टूलबार से AVD Manager को चुना जा सकता है. नीचे दी गई इमेज में, इसे गुलाबी रंग से हाइलाइट किया गया है)

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


- Android Studio के मुख्य टूलबार में, ड्रॉपडाउन की मदद से Android डिवाइस को टारगेट के तौर पर चुनें. साथ ही, पक्का करें कि main.dart चुना गया हो. इसके बाद, Run बटन (हरा त्रिकोण) दबाएं.
आईडीई में सबसे नीचे, आपको कंसोल में लॉग दिखेंगे. आपको दिखेगा कि यह Android और आपके स्टार्टर फ़्लटर ऐप्लिकेशन को इंस्टॉल कर रहा है. इसमें एक मिनट लगेगा. वर्चुअल डिवाइस तैयार होने के बाद, बदलाव बहुत तेज़ी से होंगे. जब यह प्रोसेस पूरी हो जाएगी, तब स्टार्टर फ़्लटर ऐप्लिकेशन खुल जाएगा.

- आइए, चैटबॉट ऐप्लिकेशन के लिए माइक्रोफ़ोन चालू करें. विकल्प खोलने के लिए, वर्चुअल डिवाइस के विकल्प बटन पर क्लिक करें. माइक्रोफ़ोन टैब में जाकर, तीनों स्विच चालू करें.

- आइए, हॉट रिलोड की सुविधा आज़माएं. इससे पता चलेगा कि बदलाव कितनी तेज़ी से किए जा सकते हैं.
lib/main.dart में, MyApp क्लास में मौजूद MyHomePage title को बदलकर यह करें: Flutter Dialogflow Agent. इसके बाद, primarySwatch को Colors.orange में बदलें.

फ़ाइल को सेव करें या Android Studio टूलबार में मौजूद बोल्ट आइकॉन पर क्लिक करें. आपको वर्चुअल डिवाइस में सीधे तौर पर किया गया बदलाव दिखना चाहिए.
4. Flutter: एसटीटी की सुविधा के साथ चैट इंटरफ़ेस बनाना
चैट इंटरफ़ेस बनाया जा रहा है
- lib फ़ोल्डर में, नई Flutter विजेट फ़ाइल बनाएं. (lib फ़ोल्डर पर राइट क्लिक करें, नया > Flutter विजेट > स्टेटफ़ुल विजेट), इस फ़ाइल को यह नाम दें:
chat.dart
इस फ़ाइल में यह कोड चिपकाएं. इस डार्ट फ़ाइल से चैट इंटरफ़ेस बनाया जाता है. Dialogflow अभी काम नहीं करेगा. यह सिर्फ़ सभी कॉम्पोनेंट का लेआउट है. साथ ही, इसमें स्ट्रीम की अनुमति देने के लिए माइक्रोफ़ोन कॉम्पोनेंट को इंटिग्रेट किया गया है. फ़ाइल में मौजूद टिप्पणियों में बताया जाएगा कि Dialogflow को बाद में कहां इंटिग्रेट किया जाएगा.
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rxdart/rxdart.dart';
import 'package:sound_stream/sound_stream.dart';
// TODO import Dialogflow
class Chat extends StatefulWidget {
Chat({Key key}) : super(key: key);
@override
_ChatState createState() => _ChatState();
}
class _ChatState extends State<Chat> {
final List<ChatMessage> _messages = <ChatMessage>[];
final TextEditingController _textController = TextEditingController();
bool _isRecording = false;
RecorderStream _recorder = RecorderStream();
StreamSubscription _recorderStatus;
StreamSubscription<List<int>> _audioStreamSubscription;
BehaviorSubject<List<int>> _audioStream;
// TODO DialogflowGrpc class instance
@override
void initState() {
super.initState();
initPlugin();
}
@override
void dispose() {
_recorderStatus?.cancel();
_audioStreamSubscription?.cancel();
super.dispose();
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlugin() async {
_recorderStatus = _recorder.status.listen((status) {
if (mounted)
setState(() {
_isRecording = status == SoundStreamStatus.Playing;
});
});
await Future.wait([
_recorder.initialize()
]);
// TODO Get a Service account
}
void stopStream() async {
await _recorder.stop();
await _audioStreamSubscription?.cancel();
await _audioStream?.close();
}
void handleSubmitted(text) async {
print(text);
_textController.clear();
//TODO Dialogflow Code
}
void handleStream() async {
_recorder.start();
_audioStream = BehaviorSubject<List<int>>();
_audioStreamSubscription = _recorder.audioStream.listen((data) {
print(data);
_audioStream.add(data);
});
// TODO Create SpeechContexts
// Create an audio InputConfig
// TODO Make the streamingDetectIntent call, with the InputConfig and the audioStream
// TODO Get the transcript and detectedIntent and show on screen
}
// The chat interface
//
//------------------------------------------------------------------------------------
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
Flexible(
child: ListView.builder(
padding: EdgeInsets.all(8.0),
reverse: true,
itemBuilder: (_, int index) => _messages[index],
itemCount: _messages.length,
)),
Divider(height: 1.0),
Container(
decoration: BoxDecoration(color: Theme.of(context).cardColor),
child: IconTheme(
data: IconThemeData(color: Theme.of(context).accentColor),
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),
child: Row(
children: <Widget>[
Flexible(
child: TextField(
controller: _textController,
onSubmitted: handleSubmitted,
decoration: InputDecoration.collapsed(hintText: "Send a message"),
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 4.0),
child: IconButton(
icon: Icon(Icons.send),
onPressed: () => handleSubmitted(_textController.text),
),
),
IconButton(
iconSize: 30.0,
icon: Icon(_isRecording ? Icons.mic_off : Icons.mic),
onPressed: _isRecording ? stopStream : handleStream,
),
],
),
),
)
),
]);
}
}
//------------------------------------------------------------------------------------
// The chat message balloon
//
//------------------------------------------------------------------------------------
class ChatMessage extends StatelessWidget {
ChatMessage({this.text, this.name, this.type});
final String text;
final String name;
final bool type;
List<Widget> otherMessage(context) {
return <Widget>[
new Container(
margin: const EdgeInsets.only(right: 16.0),
child: CircleAvatar(child: new Text('B')),
),
new Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(this.name,
style: TextStyle(fontWeight: FontWeight.bold)),
Container(
margin: const EdgeInsets.only(top: 5.0),
child: Text(text),
),
],
),
),
];
}
List<Widget> myMessage(context) {
return <Widget>[
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Text(this.name, style: Theme.of(context).textTheme.subtitle1),
Container(
margin: const EdgeInsets.only(top: 5.0),
child: Text(text),
),
],
),
),
Container(
margin: const EdgeInsets.only(left: 16.0),
child: CircleAvatar(
child: Text(
this.name[0],
style: TextStyle(fontWeight: FontWeight.bold),
)),
),
];
}
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: this.type ? myMessage(context) : otherMessage(context),
),
);
}
}
chat.dart फ़ाइल में, Widget build खोजें. इससे चैटबॉट इंटरफ़ेस बनता है. इसमें ये शामिल हैं:
- ListView, जिसमें उपयोगकर्ता और चैटबॉट के सभी चैट बबल शामिल होते हैं. यह ChatMessage क्लास का इस्तेमाल करता है. यह क्लास, अवतार और टेक्स्ट के साथ चैट मैसेज बनाती है.
- टेक्स्ट क्वेरी डालने के लिए TextField
- Dialogflow को टेक्स्ट क्वेरी भेजने के लिए, 'भेजें' आइकॉन वाला IconButton
- Dialogflow को ऑडियो स्ट्रीम भेजने के लिए, माइक्रोफ़ोन वाला IconButton. इसे दबाने पर, इसकी स्थिति बदल जाती है.
चैट इंटरफ़ेस को लिंक करना
- main.dart खोलें और
Widget buildको बदलें, ताकि यह सिर्फ़Chat()इंटरफ़ेस को इंस्टैंशिएट करे. अन्य सभी डेमो कोड हटाए जा सकते हैं.
import 'package:flutter/material.dart';
import 'chat.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.orange,
),
home: MyHomePage(title: 'Flutter Dialogflow Agent'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Chat())
);
}
}
- ऐप्लिकेशन चलाएं. (अगर ऐप्लिकेशन पहले शुरू किया गया था. वर्चुअल डिवाइस को बंद करें और main.dart को फिर से चलाएं. जब चैट इंटरफ़ेस के साथ पहली बार ऐप्लिकेशन चलाया जाता है. आपको अनुमति देने के लिए एक पॉप-अप दिखेगा. इसमें पूछा जाएगा कि क्या आपको माइक्रोफ़ोन का ऐक्सेस देना है. ऐप्लिकेशन इस्तेमाल करते समय पर क्लिक करें.

- टेक्स्ट एरिया और बटन का इस्तेमाल करें. टेक्स्ट क्वेरी टाइप करके Enter दबाने या 'भेजें' बटन पर टैप करने पर, आपको Android Studio के Run टैब में टेक्स्ट क्वेरी लॉग की हुई दिखेगी. माइक्रोफ़ोन बटन पर टैप करके उसे बंद करने पर, आपको चलाएं टैब में ऑडियो स्ट्रीम लॉग की हुई दिखेगी.

बहुत बढ़िया, अब हम ऐप्लिकेशन को Dialogflow के साथ इंटिग्रेट करने के लिए तैयार हैं!
अपने Flutter ऐप्लिकेशन को Dialogflow_gRPC के साथ इंटिग्रेट करना
- chat.dart खोलें और ये इंपोर्ट जोड़ें:
import 'package:dialogflow_grpc/dialogflow_grpc.dart';
import 'package:dialogflow_grpc/generated/google/cloud/dialogflow/v2beta1/session.pb.dart';
- फ़ाइल में सबसे ऊपर,
// TODO DialogflowGrpcV2Beta1 class instanceके ठीक नीचे, Dialogflow क्लास इंस्टेंस को होल्ड करने के लिए यह लाइन जोड़ें:
DialogflowGrpcV2Beta1 dialogflow;
- initPlugin() तरीके को खोजें और TODO टिप्पणी के ठीक नीचे यह कोड जोड़ें:
// Get a Service account
final serviceAccount = ServiceAccount.fromString(
'${(await rootBundle.loadString('assets/credentials.json'))}');
// Create a DialogflowGrpc Instance
dialogflow = DialogflowGrpcV2Beta1.viaServiceAccount(serviceAccount);
इससे, सेवा खाते के साथ आपके Google Cloud प्रोजेक्ट के लिए, Dialogflow का एक ऐसा इंस्टेंस बन जाएगा जिसे अनुमति मिली हुई है. (पक्का करें कि आपके पास assets फ़ोल्डर में credentials.json फ़ाइल हो!)
Dialogflow gRPC का इस्तेमाल करने का तरीका दिखाने के लिए, क्रेडेंशियल फ़ाइल को ऐसेट फ़ोल्डर में सेव किया जा सकता है.हालांकि, प्रोडक्शन ऐप्लिकेशन के लिए ऐसा नहीं करना चाहिए, क्योंकि इसे सुरक्षित नहीं माना जाता.
detectIntent कॉल करना
- अब
handleSubmitted()तरीका ढूंढें. यहां से जादू शुरू होता है. TODO टिप्पणी के ठीक नीचे, यह कोड जोड़ें.इस कोड से, उपयोगकर्ता के टाइप किए गए मैसेज को ListView में जोड़ा जाएगा:
ChatMessage message = ChatMessage(
text: text,
name: "You",
type: true,
);
setState(() {
_messages.insert(0, message);
});
- अब हम पिछले कोड के ठीक नीचे, detectIntent कॉल करेंगे. इसमें हम इनपुट से मिले टेक्स्ट और भाषा का कोड पास करेंगे. - नतीजा (
data.queryResult.fulfillmentके अंदर) ListView में प्रिंट किया जाएगा:
DetectIntentResponse data = await dialogflow.detectIntent(text, 'en-US');
String fulfillmentText = data.queryResult.fulfillmentText;
if(fulfillmentText.isNotEmpty) {
ChatMessage botMessage = ChatMessage(
text: fulfillmentText,
name: "Bot",
type: false,
);
setState(() {
_messages.insert(0, botMessage);
});
}
- वर्चुअल डिवाइस शुरू करें और इंटेंट का पता लगाने वाले कॉल की जांच करें. टाइप:
hi. इसमें आपको डिफ़ॉल्ट वेलकम मैसेज दिखना चाहिए. कुछ और टाइप करने पर, आपको डिफ़ॉल्ट फ़ॉलबैक जवाब मिलेगा.
streamingDetectIntent कॉल करना
- अब
handleStream()तरीका ढूंढें. ऑडियो स्ट्रीमिंग के लिए, यहां से जादू शुरू होता है. पहले TODO के ठीक नीचे, ऑडियो InputConfigV2beta1 बनाएं. इसमें biasList का इस्तेमाल करके, आवाज़ के मॉडल को पक्षपात करने के लिए कहा गया है. हम फ़ोन (वर्चुअल डिवाइस) का इस्तेमाल कर रहे हैं. इसलिए, sampleHertz 16000 होगा और एन्कोडिंग Linear 16 होगा. यह आपके मशीन हार्डवेयर / इस्तेमाल किए जा रहे माइक्रोफ़ोन पर निर्भर करता है. मेरे Macbook के इंटरनल माइक के लिए, 16000 अच्छा था. (https://pub.dev/packages/sound_stream पैकेज की जानकारी देखें)
var biasList = SpeechContextV2Beta1(
phrases: [
'Dialogflow CX',
'Dialogflow Essentials',
'Action Builder',
'HIPAA'
],
boost: 20.0
);
// See: https://cloud.google.com/dialogflow/es/docs/reference/rpc/google.cloud.dialogflow.v2#google.cloud.dialogflow.v2.InputAudioConfig
var config = InputConfigV2beta1(
encoding: 'AUDIO_ENCODING_LINEAR_16',
languageCode: 'en-US',
sampleRateHertz: 16000,
singleUtterance: false,
speechContexts: [biasList]
);
- इसके बाद, हम
streamingDetectIntentऑब्जेक्ट परstreamingDetectIntentमेथड को कॉल करेंगे. यह ऑब्जेक्ट, हमारे Dialogflow सेशन को होल्ड करता है:dialogflow
final responseStream = dialogflow.streamingDetectIntent(config, _audioStream);
- responseStream की मदद से, हम आखिर में आने वाली ट्रांसक्रिप्ट, उपयोगकर्ता की पहचानी गई क्वेरी, और पहचाने गए मैचिंग इंटेंट के जवाब को सुन सकते हैं. हम इसे स्क्रीन पर
ChatMessageमें प्रिंट करेंगे:
// Get the transcript and detectedIntent and show on screen
responseStream.listen((data) {
//print('----');
setState(() {
//print(data);
String transcript = data.recognitionResult.transcript;
String queryText = data.queryResult.queryText;
String fulfillmentText = data.queryResult.fulfillmentText;
if(fulfillmentText.isNotEmpty) {
ChatMessage message = new ChatMessage(
text: queryText,
name: "You",
type: true,
);
ChatMessage botMessage = new ChatMessage(
text: fulfillmentText,
name: "Bot",
type: false,
);
_messages.insert(0, message);
_textController.clear();
_messages.insert(0, botMessage);
}
if(transcript.isNotEmpty) {
_textController.text = transcript;
}
});
},onError: (e){
//print(e);
},onDone: () {
//print('done');
});
बस इतना ही करना है. अब अपना ऐप्लिकेशन शुरू करें और उसे वर्चुअल डिवाइस पर टेस्ट करें. इसके लिए, माइक्रोफ़ोन बटन दबाएं और बोलें: "नमस्ते".
इससे Dialogflow का डिफ़ॉल्ट वेलकम इंटेंट ट्रिगर होगा. नतीजे स्क्रीन पर दिखेंगे. Dialogflow के साथ Flutter का इंटिग्रेशन अब बेहतर तरीके से काम करता है. इसलिए, हम चैटबॉट से बातचीत करने की सुविधा पर काम शुरू कर सकते हैं.
5. Dialogflow: Dialogflow एजेंट को मॉडल करना
Dialogflow Essentials, बातचीत वाले यूज़र इंटरफ़ेस (यूआई) बनाने के लिए डेवलपमेंट सुइट है. इसलिए, चैटबॉट, वॉइस बॉट, फ़ोन गेटवे. आप सभी एक ही टूल का इस्तेमाल करके इसे बना सकते हैं. साथ ही, 20 से ज़्यादा भाषाओं में कई चैनलों के लिए भी इसका इस्तेमाल किया जा सकता है. Dialogflow के UX डिज़ाइनर (एजेंट मॉडलर, भाषाविद्) या डेवलपर, इंटेंट बनाते हैं. इसके लिए, वे ट्रेनिंग फ़्रेज़ तय करते हैं, ताकि मशीन लर्निंग मॉडल को ट्रेन किया जा सके.
इंटेंट से, उपयोगकर्ता के मकसद का पता चलता है. हर Dialogflow ES एजेंट के लिए, कई इंटेंट तय किए जा सकते हैं. इन सभी इंटेंट को मिलाकर, पूरी बातचीत को हैंडल किया जा सकता है. हर इंटेंट में पैरामीटर और जवाब शामिल हो सकते हैं.
किसी इंटेंट से मैच करने को इंटेंट क्लासिफ़िकेशन या इंटेंट मैचिंग भी कहा जाता है. यह Dialogflow ES का मुख्य कॉन्सेप्ट है. किसी इंटेंट के मैच होने पर, वह जवाब दे सकता है, पैरामीटर इकट्ठा कर सकता है (इकाई एक्सट्रैक्शन) या वेबुक कोड (फ़ुलफ़िलमेंट) ट्रिगर कर सकता है. उदाहरण के लिए, किसी डेटाबेस से डेटा फ़ेच करने के लिए.
जब कोई व्यक्ति चैटबॉट में कुछ लिखता है या कहता है, तो उसे उपयोगकर्ता का एक्सप्रेशन या अटरेंस कहा जाता है. Dialogflow ES, ट्रेनिंग फ़्रेज़ के आधार पर, एक्सप्रेशन को आपके Dialogflow एजेंट के सबसे सही इंटेंट से मैच करता है. Dialogflow ES के मशीन लर्निंग मॉडल को इन ट्रेनिंग फ़्रेज़ के आधार पर ट्रेन किया गया था.
Dialogflow ES, कॉन्टेक्स्ट नाम के कॉन्सेप्ट के साथ काम करता है. Dialogflow ES, किसी इंसान की तरह ही बातचीत के दूसरे और तीसरे मोड़ में कॉन्टेक्स्ट को याद रख सकता है. इस तरह, यह उपयोगकर्ता के पिछले जवाबों को ट्रैक कर सकता है.
Dialogflow इंटेंट के बारे में ज़्यादा जानकारी यहां दी गई है.
डिफ़ॉल्ट वेलकम इंटेंट में बदलाव करना
नया Dialogflow एजेंट बनाने पर, दो डिफ़ॉल्ट इंटेंट अपने-आप बन जाएंगे. डिफ़ॉल्ट वेलकम इंटेंट, वह पहला फ़्लो होता है जो एजेंट से बातचीत शुरू करने पर दिखता है. डिफ़ॉल्ट फ़ॉलबैक इंटेंट, वह फ़्लो है जो आपको तब मिलेगा, जब एजेंट आपकी बात नहीं समझ पाएगा या आपके कहे गए शब्दों से किसी इंटेंट का मिलान नहीं कर पाएगा.
डिफ़ॉल्ट वेलकम इंटेंट के लिए वेलकम मैसेज यहां दिया गया है:
उपयोगकर्ता | Agent |
नमस्ते | "नमस्ते, मैं Dialogflow के बारे में अक्सर पूछे जाने वाले सवालों का जवाब देने वाला बॉट हूं. मैं Dialogflow के बारे में पूछे गए सवालों के जवाब दे सकता हूं." |
- इंटेंट > डिफ़ॉल्ट वेलकम इंटेंट पर क्लिक करें
- नीचे की ओर स्क्रोल करके, जवाब पर जाएं.
- टेक्स्ट के सभी जवाब मिटाएं.
- डिफ़ॉल्ट टैब में, ये दो जवाब बनाएं:
- नमस्ते, मैं Dialogflow के बारे में अक्सर पूछे जाने वाले सवालों का जवाब देने वाला बॉट हूं. मैं Dialogflow से जुड़े सवालों के जवाब दे सकता हूं. आपको क्या जानना है?
- नमस्ते, मैं Dialogflow के बारे में अक्सर पूछे जाने वाले सवालों का जवाब देने वाला बॉट हूं. क्या आपको Dialogflow के बारे में कुछ पूछना है? मैं आपकी क्या मदद कर सकता हूं?
कॉन्फ़िगरेशन, इस स्क्रीनशॉट जैसा होना चाहिए.

- सेव करें पर क्लिक करें
- आइए, इस इंटेंट को टेस्ट करें. सबसे पहले, हम इसे Dialogflow Simulator में टेस्ट कर सकते हैं.टाइप करें: Hello. इसे इनमें से कोई एक मैसेज दिखाना चाहिए:
- नमस्ते, मैं Dialogflow के बारे में अक्सर पूछे जाने वाले सवालों का जवाब देने वाला बॉट हूं. मैं Dialogflow से जुड़े सवालों के जवाब दे सकता हूं. आपको क्या जानना है?
- नमस्ते, मैं Dialogflow के बारे में अक्सर पूछे जाने वाले सवालों का जवाब देने वाला बॉट हूं. क्या आपको Dialogflow के बारे में कुछ पूछना है? मैं आपकी क्या मदद कर सकता हूं?
डिफ़ॉल्ट फ़ॉलबैक इंटेंट में बदलाव करना
- इंटेंट > डिफ़ॉल्ट फ़ॉलबैक इंटेंट पर क्लिक करें
- नीचे की ओर स्क्रोल करके, जवाब पर जाएं.
- टेक्स्ट के सभी जवाब मिटाएं.
- डिफ़ॉल्ट टैब में, यह जवाब बनाएं:
- माफ़ करें, मुझे इस सवाल का जवाब नहीं पता. क्या आपने हमारी वेबसाइट http://www.dialogflow.com देखी है?
- सेव करें पर क्लिक करें
ऑनलाइन नॉलेज बेस से कनेक्ट करना
नॉलेज कनेक्टर, तय किए गए इंटेंट के साथ काम करते हैं. ये नॉलेज दस्तावेज़ों को पार्स करके, अपने-आप जनरेट होने वाले जवाब ढूंढते हैं. (उदाहरण के लिए, CSV फ़ाइलों, ऑनलाइन वेबसाइटों या PDF फ़ाइलों से अक्सर पूछे जाने वाले सवाल या लेख!) इन्हें कॉन्फ़िगर करने के लिए, एक या उससे ज़्यादा नॉलेज बेस तय किए जाते हैं. ये नॉलेज बेस, नॉलेज से जुड़े दस्तावेज़ों के कलेक्शन होते हैं.
Knowledge Connectors के बारे में ज़्यादा जानें.
आइए, इसे आज़माकर देखें.
- मेन्यू में, नॉलेज (बीटा वर्शन) को चुनें.

- दाईं ओर मौजूद नीले बटन पर क्लिक करें: नॉलेज बेस बनाएं
- नॉलेज बेस का नाम Dialogflow के बारे में अक्सर पूछे जाने वाले सवाल टाइप करें और सेव करें पर क्लिक करें.
- पहला लिंक बनाएं लिंक पर क्लिक करें

- इससे एक विंडो खुलेगी.
इस कॉन्फ़िगरेशन का इस्तेमाल करें:
दस्तावेज़ का नाम: DialogflowFAQ नॉलेज टाइप: FAQ माइम टाइप: text/html
- हम इस यूआरएल से डेटा लोड करते हैं:
https://www.leeboonstra.dev/faqs/
- बनाएं पर क्लिक करें
एक नॉलेज बेस बनाया गया है:

- जवाब सेक्शन तक नीचे की ओर स्क्रोल करें और जवाब जोड़ें पर क्लिक करें
नीचे दिए गए जवाब बनाएं और सेव करें पर क्लिक करें.
$Knowledge.Answer[1]
- जानकारी देखें पर क्लिक करें

- अक्सर पूछे जाने वाले सवालों वाला वेबपेज अपडेट होने पर, बदलावों को अपने-आप फ़ेच करने के लिए, अपने-आप रीलोड होने की सुविधा चालू करें को चुनें. इसके बाद, सेव करें पर क्लिक करें.
इससे, Dialogflow में लागू किए गए सभी अक्सर पूछे जाने वाले सवाल दिखेंगे.यह बहुत आसान है!
ध्यान दें कि आपके पास अक्सर पूछे जाने वाले सवालों वाली ऑनलाइन एचटीएमएल वेबसाइट का इस्तेमाल करके, अपने एजेंट में अक्सर पूछे जाने वाले सवाल इंपोर्ट करने का विकल्प भी होता है. टेक्स्ट वाले ब्लॉक के साथ PDF भी अपलोड किया जा सकता है. इसके बाद, Dialogflow अपने-आप सवाल जनरेट करेगा.
अब अक्सर पूछे जाने वाले सवालों को, आपके एजेंटों के लिए ‘अतिरिक्त जानकारी' के तौर पर देखा जाना चाहिए. यह जानकारी, आपके इंटेंट फ़्लो के बगल में दिखेगी. नॉलेज बेस में मौजूद अक्सर पूछे जाने वाले सवालों से, मॉडल को ट्रेन नहीं किया जा सकता. इसलिए, किसी सवाल को बिलकुल अलग तरीके से पूछने पर, हो सकता है कि आपको सही जवाब न मिले. इसकी वजह यह है कि इसमें नैचुरल लैंग्वेज अंडरस्टैंडिंग (मशीन लर्निंग मॉडल) का इस्तेमाल नहीं किया जाता. इसलिए, कभी-कभी अपने अक्सर पूछे जाने वाले सवालों को इंटेंट में बदलना फ़ायदेमंद होता है.
- दाईं ओर मौजूद सिम्युलेटर में सवालों की जांच करें.
- जब सब कुछ काम करने लगे, तो अपने Flutter ऐप्लिकेशन पर वापस जाएं. इसके बाद, इस नए कॉन्टेंट के साथ अपने चैट और वॉइस बॉट को टेस्ट करें! Dialogflow में लोड किए गए सवाल पूछें.

6. बधाई हो
बधाई हो, आपने Dialogflow चैटबॉट इंटिग्रेशन के साथ अपना पहला Flutter ऐप्लिकेशन बना लिया है. बहुत बढ़िया!
हमने क्या-क्या कवर किया है
- Dialogflow Essentials का इस्तेमाल करके चैटबॉट बनाने का तरीका
- Dialogflow को Flutter ऐप्लिकेशन में इंटिग्रेट करने का तरीका
- Dialogflow की मदद से टेक्स्ट इंटेंट का पता कैसे लगाया जाता है
- माइक्रोफ़ोन से Dialogflow पर आवाज़ को स्ट्रीम करने का तरीका
- नॉलेज बेस कनेक्टर का इस्तेमाल कैसे करें
आगे क्या करना है?
क्या आपको यह कोड लैब पसंद आया? Dialogflow के इन शानदार Labs को देखें!
- Dialogflow को Google Assistant के साथ इंटिग्रेट करना
- Dialogflow को Google Chat के साथ इंटिग्रेट करना
- Dialogflow की मदद से, Google Assistant के लिए ऐक्शन बनाना (लेवल 1)
- Dialogflow को Google Calendar के साथ इंटिग्रेट करके, फ़ुलफ़िलमेंट को समझना +. अपना पहला Flutter ऐप्लिकेशन बनाना
क्या आपको यह जानना है कि मैंने Dart/Flutter के लिए Dialogflow gRPC पैकेज कैसे बनाया?
- मेरे ब्लॉग लेख The Hidden Manual for working with the Google Cloud gRPC APIs को पढ़ें