Voxインプラントアバタ:AIチャットとボイスロボット


音声やチャットロボットに遭遇.彼らの何人かは商品出荷について我々に通知するように要求します、そして、彼らの何人かは広告で我々をいらいらさせます.
そのようなロボットの最も重要な不利な点は、彼らが以前にスクリプトされた情報だけを言うか、知覚することができるということです.これは、ロボットが私たちを刺激する理由です.なぜなら、彼らとの対話ができないからです.それで、我々は通常、代わりに人間と話すのを好みます.
ここに人工知能(AI)が便利になるところです.AIはここ数年で大きな前進を遂げ、まだ進化している.本当の人間のように自由に話すことができる人工知能仲間がたくさんあります.そのような仲間は、コミュニケーションの間、学びます、そして、多くのフレーズを理解して、さらに異なる質問に答えてみてください.
だから、我々はこのようなAIコンパニオンと音声/テキストロボットを組み合わせる場合はどうですか?これを行うと、顧客とのスムーズな会話を維持できるアシスタントを作成することができます.それは、現実的な音声合成エンジンを追加する必要がありますが、このアシスタントを教えてVoximplant Avatar .

アバター作品


アバターは、顧客との音声やテキスト通信のためのAIとNLP(ネイティブ言語処理)を使用してVoxインプラントサービスです.あなたのカフェの労働時間や配信オプションなど、あなたのアバターをすべての必要な情報を教えることができるので、顧客の質問に答えることができます.あなたのお客様のお客様のお客様の書籍のテーブルを助けることができるので、また、CRMと統合することができます.
また、現実的な音声合成と認識エンジンを使用してアバターを供給することができます、それは現実的なinterlocutor.現代の音声エンジンは大きく、AIとNLPは会話をより自然にする.電話やチャット機能を追加し、ホットライン、連絡先センター、またはWebサイトのための完璧なアシスタントを受け取る.

アバターを作成する方法


上で説明したすべてを実行できるアバターを作ろう.このためにはa Voximplant account . コントロールパネルにログインして下さいAvatars 「作成」をクリックします.あなたのアバターの名前を与え、言語とタイムゾーンを選択し、それを作成!

このステップでは、すでに人間のスピーチを分析し、スピーカーの意図を理解できるスマートアバターを持っています.今私たちのアバターを教えることができるすべての情報が必要な場合があります.

アバターを教える方法


あなたのアバターを教えるために、それを開き、目的のセクションに移動し、[追加]をクリックします.

顧客が望むものを理解するために、アバターは顧客のスピーチにおける意図を見つける必要がある.しかし、顧客はあなたのアバターがトレーニングを必要とする理由とは異なり、同じ質問をすることができます.
作成した意図を開き、トレーニングフレーズセクションに移動します.我々は、顧客が質問をすることができる方法について、いくつかのフレーズを書く必要があります.
  • 開館時間は?
  • あなたは明日働きますか.
  • 今夜までどれくらい遅くなっていますか.
  • その後、回答セクションに移動し、あなたの答えのいくつかの変形を記述します.
    意図を保存すると、画面の上部にある黄色のトレーニングが必要ボタンが表示されます.

    電車をクリックして待つ、これは瞬間かかります.AIは、この質問のすべての可能な亜種を分析し、本当の場合に答える準備ができています.
    必要に応じて多くの目的として追加することができます.我々のアバターの意図を配信オプションを教えて、テーブルを予約しましょう.
    次に、ダイアログシナリオタブでJavaScriptシナリオを作成します.私は、アバターが顧客に挨拶し、顧客のスピーチと回答における労働時間と配達オプションについて学ぶために意図を捜し求める単純なシナリオを作成しました.
    addState({
        name: 'start',
        onEnter:async(event)=> {
            // greet a customer when it connects to the dialogue
            return Response({utterance: 'Pineapple garden, how can I help you?', listen: true})
        },
        onUtterance:async(event)=>{
            // search for intents in a customer's speech
            if (event.intent === 'openHours' || event.intent === 'delivery' || event.intent === 'reservation') {
                // answer a customer's intent and keep listening
                return Response({utterance: event.response, listen: true});
            } else {
                // if an intent is not clear, ask to rephrase
                return Response({utterance: 'Sorry, I didn\'t catch that. I can help you with open hours, deliveries, and reservations', listen: true});
            }
        }
    });
    
    // set the entry point
    setStartState('start');
    
    Avatarのシナリオをどのように書くかについての詳細な情報を見つけることができますVoximplant documentation .
    さあ、アバターをテストしましょう.右上隅にあるデバッグボタンをクリックしてシナリオを実行します.

    それが着信意図を処理するかどうかをあなたのアバターの質問を尋ねる.アバターはあなたの意図を認識し、正しくあなたの質問に答える必要があります.やってみよう!

    Voila!あなたのアバターは完全に意図を認識し、正しい答えを与える.今ではアバターは、質問を答えるだけではなく、より多くの何かを行うには、テーブルを予約するように教える時間です.

    どのようにアバターを予約テーブル


    まず、あなたのアバターを予約意図を教えてください.この意図を認識すると、アバターは、主に時間、日付、および人々の数を予約するためのすべての必要な情報を収集する必要があります.
    顧客は、テーブルを予約する意図の間、必要な情報を提供するかもしれません例えば、彼らは「2つのテーブルを予約する必要がある」と言うことができました.そういうわけで、我々は意図的な認識の間、情報を集める必要があります.
    シナリオで予約オブジェクトを作成しましょう
    let reservationForm = {
        slotTime: null,
        slotPeopleCount: null,
        uncertainUtterancesCount: 0
    };
    
    今、私たちは、フォームを埋めるために必要な情報をすべて収集する必要があります.何が不足している顧客の質問を確認してください.顧客が特定の答えを提供することができないならば、増加してくださいuncertainUtterancesCount カウンタは、ループを避けるために.
    すべての情報を収集するときは、顧客にそれを要約し、確認を求める必要があります.顧客が確認した場合、我々は予約オブジェクトを記録し、現在のリクエストを介してCRMまたはバックエンドに送信することができます.
    私もループを避けるためにシナリオにいくつかの出口ポイントを追加しました.例えば、もしアバターがクライアントを3回理解していなかったり、アバターが彼らを助けたり、さよならを言うことができないとしても、シナリオは終わります.最後のシナリオを見てみましょう.
    let reservationForm = {
        slotTime: null,
        slotPeopleCount: null,
        uncertainUtterancesCountweirdUtterancesInRow: 0
    };
    
    addState({
        name: 'start',
        onEnter:async(event)=> {
            // if this is the first time in this state, greet the client. if it is not, ask what we can help with
            if (event.visitsCounter === 1) {
                return Response({utterance: 'Pineapple garden, how can I help you?', listen: true})
            } else {
                return Response({utterance: 'Can I help you with somehting else?', listen: true})
            }
        },
        onUtterance:async(event)=>{
            // search for intents
            if (event.intent === 'openHours' || event.intent === 'delivery') {
                // answer the intent and go to the 'start' state
                return Response({utterance: event.response, nextState: 'start'});
            } else if (event.intent === 'reservation') {
                // the client may already give you some information
                if (event.entities.systemTime) {
                    reservationForm.slotTime = event.entities.systemTime[0].value;
                }
                 if (event.entities.systemNumber) {
                    reservationForm.slotPeopleCount = event.entities.systemNumber[0].value;
                }
                return Response({utterance: 'Sure!', nextState: 'reservation'});
            } else if (event.intent === 'no') {
                // if the client says "no thanks", say goodbye and end the conversation
                return Response({utterance: 'Ok! Hope I\'ve helped. See you!', nextState: 'final'});
            } else if (event.intent === 'yes') {
                // if the client says that there's a question, ask and listen
                return Response({utterance: 'Sure, so what\'s your question?', listen: true});
            } else {
                // if the client's intent is not clear, ask for missing information, but not more than 3 times
                if (event.utteranceCounter < 3) {
                    return Response({utterance: 'Sorry, I didn\'t catch that. I can help you with open hours, deliveries, and reservations', listen: true});
                } else {
                    return Response({utterance: 'I\'m so sorry, but I couldn\'t understand you. Bye!', nextState: 'final'});
                }
            }
        }
    });
    
    addState({
        name: 'reservation',
        onEnter:async(event)=> {
            if (reservationForm.uncertainUtterancesCount > 2 ) {
                // if the client cannot answer avatar's questions, or if your avatar does not understand the client, stop asking anything
                reservationForm.uncertainUtterancesCountweirdUtterancesInRow = 0;
                return Response({utterance: 'Sorry I couldn\'t understand you', nextState: 'start'});
            } else if (reservationForm.slotTime && reservationForm.slotPeopleCount) {
                // if the information is given, confirm it
                return Response({nextState: 'reservationConfirm'})
            } else if (!reservationForm.slotTime && !reservationForm.slotPeopleCount) {
                // if something is wrong, ask about it
                return Response({utterance: 'For how many people and which date would you like a reservation?', listen: true})
            } else if (!reservationForm.slotPeopleCount) {
                return Response({utterance: 'And for how many people do you need a table?', listen: true})
            } else {
                return Response({utterance: 'And for which date?', listen: true})
            }
        },
        onUtterance:async(event)=>{
            // check if you have all the necessary information
            if (event.entities.systemTime || event.entities.systemNumber) {
                if (event.entities.systemTime) {
                    reservationForm.slotTime = event.entities.systemTime[0].value;
                }
                if (event.entities.systemNumber) {
                    reservationForm.uncertainUtterancesCount = 0;
                    reservationForm.slotPeopleCount = event.entities.systemNumber[0].value;
                }
                reservationForm.uncertainUtterancesCount = 0;
                return Response({nextState: 'reservation'});
            } else {
                reservationForm.uncertainUtterancesCountweirdUtterancesInRow += 1;
            }
    
            if (event.intent === 'openHours' || event.intent === 'delivery') {
                // if during filling the form any other intent is found, answer it and continue filling the form
                return Response({utterance: event.response, nextState: 'reservation'});
            } else {
                // continue filling the form
                return Response({nextState: 'reservation'});
            }
        }
    });
    
    addState({
        name: 'reservationConfirm',
        onEnter:async(event)=> {
            // convert to human-readable date
            const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
            const monthStr = months[parseInt(reservationForm.slotTime.substring(5, 7), 10) - 1];
            const day = parseInt(reservationForm.slotTime.substring(8, 10), 10);
            const hour = parseInt(reservationForm.slotTime.substring(11, 13), 10);
            const minute = reservationForm.slotTime.substring(14, 16);
            return Response({utterance: `So you want to book a table for ${reservationForm.slotPeopleCount} people at ${day} ${monthStr} ${hour}:${minute}`, listen: true});
        },
        onUtterance:async(event)=>{
            if (event.intent === 'yes') {
                return Response({utterance: 'Awesome! We will be waiting for you', nextState: 'start'});
            } else if (event.intent === 'no') {
                reservationForm.slotTime = null;
                reservationForm.slotPeopleCount = null;
                reservationForm.uncertainUtterancesCount = 0;
                return Response({utterance: 'I see, sorry.', nextState: 'start'});
            } else {
                if (event.utteranceCounter < 3) {
                    return Response({utterance: 'I\'m sorry, so do you want to make a reservation?', listen: true});
                } else {
                    return Response({utterance: 'Sorry, I can\'t help you. Hopefully I will be able to assist you next time. Bye', nextState: 'final'});
                }
            }
        }
    });
    
    addState({
        name: 'final',
        onEnter:async(event)=> {
            return Response({isFinal: true, needRedirectionToOperator: false, reservation:reservationForm})
        }
    });
    
    // set the entry point
    setStartState('start');
    
    今、私たちは、お客様の操作、配信オプションの時間については、お客様に伝えることができるアバターを持っているテーブルを予約し、CRMやバックエンドとの統合.

    電話とチャットを統合する方法


    あなたのアバターが必要とする最後のものはテレフォニーかチャットサービスで、お客様と通信することができます.テレフォニーと統合するには、あなたのアバターの統合タブに移動し、統合スクリプトをコピーします.Then create an application on the Voximplant platform に統合コードをペーストしますapplication scenario .
    設定するspeech synthesis and recognition モジュールを選択して言語と適切な声、家賃や接続a phone number , 設定するa routing rule , そして、あなたのアバターはあなたの顧客の呼び出しに答える準備ができています!
    また、あなたのアバターを接続することができますa text chat , たとえば、あなたのウェブサイト.アバターは、音声とテキストチャンネルの両方で完璧に動作します.あなたはどのようにアバターのチャットでチャットをテストすることができますthis simple demo .

    結果


    我々は、顧客と通信することができます簡単なアバターを作成し、その質問に答えると、APIの要求を介して本のテーブル.これは単純なケースですが、ロジックを拡張することができますし、あなたのアバターをあなたのホットラインやコンタクトセンターの不可欠なアシスタントにします.
    VoxPumpの音声合成と認識モジュールを使用すると、非常に現実的な声を選択するか、サードパーティの声を統合することができますので、お客様が本当の人やロボットかどうかを伝えることができなくなります.そして常に進化AIとNLPはあなたのアバターをより良い毎日になります!
    Register at the Voximplant platform 今日、あなた自身のアバターを作成!テストし、レビューを残して誰もが保証賞を取得します.