تبيع منظمة العفو الدولية البيتزا أو كيف يصنع Voximplant صداقات مع Dialogflow

قدمنا مؤخرًا حلًا تجاريًا يسمى Dialogflow Connector: مجموعة من Dialogflow من Google وسحابة Voximplant. يمكن أن يعمل الموصل بدلاً من مشغل مركز الاتصال وقبول الطلبات المعقدة. أصبح هذا ممكنًا لأن Dialogflow يسمح لك بالابتعاد عن سيناريو الرد الآلي المعتاد ، حيث يضطر العميل إلى تسمية الكلمات من مجموعة معينة ، والتي يمكن أن تستجيب لها القائمة التفاعلية. يمكن لنظام Google الأساسي استقبال المدخلات من العميل بشكل تسلسلي وجمعها معًا - على سبيل المثال ، لتكوين طلب في متجر عبر الإنترنت. ربما سمعت بالفعل الكلمة الطنانة " ملء فتحة " ، وهذا كل شيء. التفاصيل في انتظارك تحت القطع ، كما فعلنا الروبوت لطلب البيتزا - عن طريق القياس ، يمكنك تحطيم شيء مشابه وتكون سعيدًا لأن أوقات المصعد و "أحد عشر" قد ولت منذ فترة طويلة ...


رقم الهاتف


بادئ ذي بدء ، يجب عليك استئجار رقم افتراضي يقوم البوت "بالإجابة" عليه. للقيام بذلك ، في لوحة إدارة Voximplant ، في قائمة "الأرقام" ، انقر فوق "شراء رقم الهاتف".


في الشاشة الجديدة ، ضع المفتاح في وضع "اختبار الأرقام" - سيتيح لك ذلك استئجار رقم افتراضي.


الأرقام الافتراضية رخيصة للغاية وتسمح لك باختبار أي حل على منصتنا بشكل كامل. استئجار غرفة والمزيد ...

... إنشاء برنامج نصي


الآن نحن بحاجة إلى سيناريو سحابة ، قلب قرارنا. هو الذي سيتلقى المكالمة ويتعرف على الكلام وينقله إلى Dialogflow. يجب إنشاء البرنامج النصي داخل التطبيق. في القائمة اليسرى ، حدد "التطبيقات" ، وأنشئ تطبيقًا جديدًا وأطلق عليه اسمًا.


ثم انتقل إلى علامة التبويب "البرامج النصية" في التطبيق الخاص بك وإنشاء الخاصة بك عن طريق النقر على علامة الجمع. تذكر أن تعطيه اسمًا ، مثل تدفق الحوار.


حان الوقت لكتابة التعليمات البرمجية!

دعنا نربط وحدة AI - تحتوي على طرق وأحداث Dialogflow - بالإضافة إلى وحدة التعرف على الكلام والمشغل. سنعلن عن المتغيرات ووظيفة الكلمات الصعبة ، التي تأخذ كمية إدخال (بيتزا) وصفيفًا يحتوي على الكلمات ("margarita" ، "margaritas" ، "margaritas") وإرجاع كلمة تطابق رقم الحالة. هذا ضروري حتى لا يقول البوت "4 margaritas" ، ولكن يصدر بشكل صحيح "4 margaritas".

require(Modules.AI); require(Modules.ASR); require(Modules.Player); let mycall = null, voice = Language.Premium.RU_RUSSIAN_YA_FEMALE, account_name = "", dialed_number = "", caller_id = "", flow, lastText = '', player function wordend(num, words) { return words[ ((num=Math.abs(num%100)) > 10 && num < 15 || (num%=10) > 4 || num === 0) + (num !== 1) ]; } 

أضف الآن المعالج للمكالمة الواردة ووظيفة المساعد startASR :

 VoxEngine.addEventListener(AppEvents.CallAlerting, (e) => { mycall = e.call; mycall.addEventListener(CallEvents.Connected, handleCallConnected); account_name = e.toURI.substring(e.toURI.indexOf('.') + 1); account_name = account_name.substring(0, account_name.indexOf('.')); dialed_number = e.destination; caller_id = e.callerid; mycall.answer(); }); function startASR() { mycall.removeEventListener(CallEvents.PlaybackFinished, startASR); mycall.sendMediaTo(flow); } 

عند حدوث الحدث متصل ، يتم استدعاء الدالة handleCallConnected . في الواقع ، يتم الحشو كله فيه:

  • يتم إنشاء كائن Dialogflow ؛
  • يستقبل الصوت المركب الزبون ويعرض تقديم الطلب ؛
  • يبدأ الاعتراف ، يقدم العميل طلبًا ؛
  • يتم نقل كلمات العميل إلى Dialogflow ، تحدث فتحة philling ؛
  • يعبر الصوت المركب عن ترتيب العميل وعنوانه ؛
  • يتوقف البوت عن العمل ، وتغلق الجلسة.

قائمة الميزات:

handleCallConnected
function handleCallConnected(e) {
flow = AI.createDialogflow({
lang: "ru"
});
if (AI.Events.DialogflowResponse !== undefined)
flow.addEventListener(AI.Events.DialogflowResponse, (event) => {
if (event.response.queryResult !== undefined) {
let result = event.response.queryResult
if (result.queryText === undefined) {
if (result.languageCode !== undefined) startASR();
return
}
if (result.fulfillmentText !== undefined) {
try {
player = VoxEngine.createTTSPlayer(result.fulfillmentText, voice)
player.addMarker(-500)
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR)
player.sendMediaTo(mycall)
} catch (err) {}
if (result.allRequiredParamsPresent == true &&
result.outputContexts !== undefined &&
result.parameters.PizzaType != undefined) {
let msg = " ";
for (let k = 0; k < result.parameters.PizzaType.length; k++) {
let count = result.parameters.count[k] !== undefined ? result.parameters.count[k] : 1
switch (count) {
case 1:
msg += " ";
break;
case 2:
msg += " ";
break;
default:
msg += count + " ";
break;
}
if (result.parameters.PizzaSize[k] !== undefined) {
switch (result.parameters.PizzaSize[k]) {
case "small":
msg += wordend(count, ['', '', '']);
break;
case "medium":
msg += wordend(count, ['', '', '']);
break;
case "large":
msg += wordend(count, ['', '', '']);
break;
}
}
msg += " "
switch (result.parameters.PizzaType[k]) {
case "margarita":
msg += wordend(count, ['', '', '']);
break;
case "fourcheese":
msg += wordend(count, ['', '', '']) + " ";
break;
case "vegetarian":
msg += wordend(count, [' ', ' ', ' ']);
break;
case "pepperoni":
msg += wordend(count, ['', '', '']) + " ";
break;
case "cheese":
msg += wordend(count, [' ', ' ', ' ']);
break;
case "chicken":
msg += wordend(count, ['', '', '']) + " ";
break;
}
if (k == result.parameters.PizzaType.length - 1) msg += " , "
else msg += " ";
}
msg = msg.slice(0, msg.length - 2);
if (result.parameters.time !== undefined && result.parameters.time != "") {
let time = new Date(result.parameters.time),
local = time.toTimeString()
local = local.split(":")
time = local[0] + ":" + local[1]
msg += ". " + time
}
if (result.parameters.deliveryaddress !== undefined) msg += ". " + result.parameters.deliveryaddress
msg += ". ?";
player.stop()
player = VoxEngine.createTTSPlayer(msg, voice)
player.addMarker(-500)
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR)
player.sendMediaTo(e.call)
} else {
player.stop()
lastText = result.fulfillmentText
player = VoxEngine.createTTSPlayer(result.fulfillmentText, voice)
if (result.action == "pizzaorder.pizzaorder-yes") {
player.addEventListener(PlayerEvents.PlaybackFinished, () => mycall.hangup())
player.sendMediaTo(e.call)
} else {
player.addMarker(-500)
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR)
player.sendMediaTo(e.call)
}
}
}
}
})
player = VoxEngine.createTTSPlayer("! , !", voice);
player.addMarker(-500);
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR);
player.sendMediaTo(e.call);
mycall.record();
mycall.addEventListener(CallEvents.Disconnected, (event) => {
VoxEngine.terminate();
})
}


لم يبق سوى القليل جدا. انتقل إلى علامة التبويب التوجيه -> "إنشاء". ستظهر نافذة مشروطة مع نموذج. يمكن إعطاء الاسم عن طريق القياس - قاعدة تدفق الحوار. اترك القناع الافتراضي وأهم شيء هو إرفاق البرنامج النصي لحوار الحوار. انقر فوق "إنشاء قاعدة" ، سيتم إغلاق نافذة مشروط.


الآن تحتاج إلى إرفاق الرقم الذي تم شراؤه بالتطبيق. للقيام بذلك ، انتقل إلى قسم "الأرقام" داخل التطبيق الخاص بك ، وانقر فوق "متاح" ثم - "إرفاق" بجوار الرقم المحدد. سيتم فتح نافذة مشروطة ، يبقى فقط لتحديد القاعدة المطلوبة هنا وانقر على "إرفاق".


انقر فوق "حفظ". يعرف البرنامج النصي الآن ما يحتاجه للرد على أي رقم تم استئجاره. بالنظر إلى أن لدينا رقمًا واحدًا ، هذا ما نحتاجه.

رائع ، الآن كل شيء مرتبط معًا ويجب أن يعمل!

وكيل Dialogflow


من حيث Dialogflow ، فإن الوكيل هو البوت. لقد وصفنا بالفعل بالتفصيل كيفية إنشاء وكيلك وكيفية التواصل معه ، ولكن هذه المرة نقترح استخدام قطعة العمل لدينا.

أنت بحاجة للتسجيل في حوارflowflow وإنشاء وكيل جديد. لا تنسى تحديد اللغة الروسية:


افتراضيًا ، لا يعرف الوكيل عبارة واحدة (المقاصد) ولا يمكنه بشكل عام فعل أي شيء. قم بتنزيل أصول وكيلنا وتحميلها على أصولك : لهذا ، في إعدادات الوكيل ، انتقل إلى علامة التبويب "تصدير واستيراد" -> "استيراد من ZIP".


الآن لديك مجموعة من الأقوال لطلب البيتزا! يمكنك دراستها في قسم "النوايا". لاحظ أن الوكيل لديه بيانات مساعدة pizza.sizehelp و pizza.typehelp . بفضلهم ، بعد تحية مطعم البيتزا ، يمكن للعميل أن يسأل ، "ما نوع البيتزا التي لديك" وسيخبرك البوت بما هو موجود في القائمة.

تحقق من تحديد الإصدار الثاني من واجهة برمجة التطبيقات في الإعدادات في علامة التبويب عام.


أخيرًا ، قم بتنزيل JSON لحساب خدمة Google - يتم ذلك ببضع نقرات .

وكيل ربط لتطبيق Voximplant


في القائمة الموجودة على اليسار في تطبيق Voximplant الخاص بك ، حدد "Dialogflow connector" ، وانقر فوق "إضافة" ، في النموذج المشروط ، قم بتحميل JSON وانقر فوق "إضافة" مرة أخرى.


سترى أن ملف JSON يظهر في القائمة ، مما يعني أنه مرفق بالتطبيق.

انتهى! يتم تكوين حزمة Dialoglow + Voximplant ، ويتم تجميع جميع روابط السلسلة معًا.

في حال كنت كسولًا جدًا للقيام بكل هذه الخطوات ، يمكنك أن تشعر بعرض البيتزا لدينا:

  • انتقل إلى http://demos05.voximplant.com/pizza/ ؛
  • أدخل رقم الهاتف (بالنسبة لروسيا سيكون 7900 ...) وانقر على "التالي" ؛
  • من الرقم المشار إليه ، اتصل على +74999384952 ؛
  • استمتع ببوت المعجزة :)

Source: https://habr.com/ru/post/ar412663/


All Articles