Kami baru-baru ini
mempresentasikan solusi bisnis yang disebut Konektor Dialogflow: sekelompok Dialogflow Google dan cloud Voximplant kami. Konektor dapat berfungsi sebagai ganti operator pusat panggilan dan menerima pesanan yang rumit. Ini menjadi mungkin karena Dialogflow memungkinkan Anda untuk keluar dari skenario IVR biasa, di mana klien dipaksa untuk menyebutkan kata-kata dari set yang diberikan, di mana menu interaktif dapat merespons. Platform Google dapat secara berurutan menerima input dari klien dan mengumpulkannya bersama - misalnya, untuk membentuk pesanan di toko online. Anda mungkin sudah mendengar kata kunci "
mengisi slot, " begitu saja. Detail menunggu Anda di bawah potongan, seperti yang kami lakukan bot untuk memesan pizza - dengan analogi, Anda dapat menemukan sesuatu yang serupa dan senang bahwa waktu lift dan "sebelas" sudah lama hilang ...
Nomor telepon
Untuk mulai dengan, Anda harus menyewa nomor virtual yang bot akan "jawab". Untuk melakukan ini, di panel admin Voximplant, di menu
"Angka", klik "Beli Nomor Telepon".
Di layar baru, letakkan sakelar di posisi "Nomor uji" - ini memungkinkan Anda untuk menyewa nomor virtual.
Nomor virtual sangat murah dan memungkinkan Anda menguji sepenuhnya solusi apa pun di platform kami. Sewa kamar dan banyak lagi ...
... buat skrip
Sekarang kita membutuhkan skenario cloud, jantung dari keputusan kita. Dialah yang akan menerima panggilan, mengenali ucapan dan mentransfernya ke Dialogflow. Script harus dibuat di dalam aplikasi. Di menu sebelah kiri, pilih
"Aplikasi" , buat aplikasi baru dan beri nama.
Lalu buka tab "Scripts" di aplikasi Anda dan buat sendiri dengan mengeklik plus. Ingatlah untuk memberinya nama, seperti dialogflow.
Saatnya menulis kode!
Mari kita sambungkan modul
AI - ini berisi metode dan acara untuk Dialogflow - serta modul dan
pemutar pengenalan suara . Kami akan mendeklarasikan variabel dan fungsi
wordend yang rumit, yang mengambil jumlah input (pizza) dan array dengan kata-kata ('margarita', 'margaritas', 'margaritas') dan mengembalikan kata yang cocok dengan nomor kasus. Ini diperlukan agar bot tidak mengatakan “4 margaritas”, tetapi dengan benar mengeluarkan “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) ]; }
Sekarang tambahkan handler untuk panggilan masuk dan fungsi pembantu
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); }
Ketika acara
Connected terjadi, fungsi
handleCallConnected dipanggil . Sebenarnya, seluruh isian terjadi di dalamnya:
- objek Dialogflow dibuat;
- suara yang disintesis menyapa pelanggan dan menawarkan untuk melakukan pemesanan;
- pengakuan dimulai, pelanggan melakukan pemesanan;
- kata-kata klien ditransfer ke Dialogflow, terjadi slot philling;
- suara yang disintesis menyuarakan urutan dan alamat klien;
- bot menutup telepon, sesi ditutup.
Daftar Fitur:
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(); |
| }) |
| } |
Hanya ada sedikit yang tersisa. Pergi ke tab Routing -> "Buat". Jendela modal dengan formulir akan muncul. Nama dapat diberikan dengan analogi - dialogflow-rule. Biarkan mask default dan yang paling penting adalah melampirkan skrip dialogflow. Klik "Buat Aturan", jendela modal akan ditutup.
Sekarang Anda perlu melampirkan nomor yang dibeli ke aplikasi. Untuk melakukan ini, buka bagian "Angka" di dalam aplikasi Anda, klik "Tersedia" dan kemudian - "Lampirkan" di sebelah nomor yang dipilih. Sebuah jendela modal akan terbuka, tetap hanya untuk memilih aturan yang diinginkan di sini dan klik "lampirkan".
Klik "Simpan." Sekarang skrip tahu apa yang perlu direspon ke nomor yang dihubungi yang Anda sewa. Mengingat kami memiliki satu nomor, inilah yang kami butuhkan.
Hebat, sekarang semuanya terhubung bersama dan harus bekerja!
Agen Dialogflow
Dalam hal Dialogflow, agen adalah bot. Kami telah
menjelaskan secara rinci cara membuat agen Anda dan cara berkomunikasi dengannya, tapi kali ini kami menyarankan menggunakan benda kerja kami.
Anda perlu mendaftar di
dialogflow.com dan membuat agen baru. Jangan lupa untuk menentukan bahasa Rusia:
Secara default, agen tidak tahu satu pernyataan (maksud) dan umumnya tidak bisa berbuat apa-apa.
Unduh aset agen kami dan unggah ke
aset Anda: untuk ini, dalam pengaturan agen, buka tab "Ekspor dan Impor" -> "Impor dari ZIP".
Sekarang Anda memiliki serangkaian ucapan untuk memesan pizza! Anda dapat mempelajarinya di bagian "Maksud"; perhatikan bahwa agen memiliki pernyataan tambahan
pizza.sizehelp dan
pizza.typehelp . Terima kasih kepada mereka, setelah menyapa restoran pizza, klien dapat bertanya, "Jenis pizza apa yang Anda miliki" dan bot akan memberi tahu Anda apa yang ada di menu.
Verifikasi bahwa versi kedua API dipilih dalam pengaturan pada tab Umum.
Terakhir, unduh JSON dari akun Layanan Google Anda -
ini dilakukan dalam beberapa klik .
Bind Agent ke Aplikasi Voximplant
Di menu di sebelah kiri dalam aplikasi Voximplant Anda, pilih "Konektor dialogflow", klik "Tambah", dalam bentuk modal muncul JSON dan klik "Tambah" lagi.
Anda akan melihat bahwa file JSON muncul dalam daftar, yang berarti dilampirkan ke aplikasi.
Selesai! Bundel Dialoglow + Voximplant dikonfigurasikan, semua tautan rantai dirakit bersama.
Jika Anda terlalu malas untuk melakukan semua langkah ini, Anda dapat merasakan demo pizzeria kami:
- pergi ke http://demos05.voximplant.com/pizza/ ;
- masukkan nomor telepon (untuk Rusia akan menjadi 7900 ...) dan klik "BERIKUTNYA";
- dari nomor dial yang ditunjukkan +74999384952;
- selamat menikmati keajaiban bot :)