新年のコールセンターを作る

2015年の新年が近づいており、少し考えてから、人々を楽しませると同時に、 ブラックジャックのサンタクロースと雪の乙女が新年にチャットしたい電話に答える新年のコールセンターのアイデアを実現することにしました。 誰もがこのコールセンターをブラウザーから直接呼び出すことができるように(マイクが必要です)、または電話番号をダイヤルするだけで、オペレーターの性別を選択することで、誰でもこのコールセンターのオペレーターになれます。 オペレーターのサンタクロース/スネグーラチカの場所は、ブラウザーで直接動作します(hi WebRTC)。マイクなしで行う方法はありません。 そのようなサービスを実装するには、すべてをゼロから行う場合は時間がかかる場合がありますが、VoxImplantプラットフォームを使用します。これにより、プロセス全体が大幅に容易になり、スピードアップします。 合計で、オペレーターになりたい人を登録するためのWebサービスと、ダイヤラーとオペレーターの場所の2つのWebアプリケーションを作成し、javascriptでいくつかのスクリプトを作成する必要があります。 コールセンターのオペレーターとして行動したい人が十分にいることを願っています。そうしないと、発呼者は会話が並ぶのを長時間待たなければなりません。 より興味深いものにするために、最もおしゃべりなオペレーターの評価を整理し、VoxImplantギフト券を付与して、後で独自のブラックジャックサービスを実装できるようにします... すべての最も興味深い、いつものように、カットの下で!



結果



サービスを試すのが待ちきれない人のために、すぐにリンクhttp://demos.zingaya.com/newyear/を提供します。インターフェイスには特別なコメントは必要ないと思います。 あなたの側を選択し、電話をかける/受信します。

オペレーターのアカウントを登録し、ログインし、ステータスを「通話の受信準備完了」に設定します



着信コールがオペレーターに配信されるとすぐに、メロディが再生され、コールに応答できるポップアップウィンドウが表示されます。





アプリケーション作成



VoxImplantコントロールパネル( https://manage.voximplant.com )にログインし、アプリケーションセクションで新年のアプリケーションを作成します。これは、ユーザーオペレーターをまとめる仮想エンティティであり、呼び出しを処理するためのルールも記述します(どのシナリオを処理する必要があります)呼び出し)。



VoxEngineスクリプトを作成する



ここで、着信コールを処理し、それらをオペレーターに分配するスクリプトを作成する必要があります。 VoxImplantのスクリプトはJSで記述されています。 次のようになります。

//   ACD ( )  ASR ( ) require(Modules.ACD); require(Modules.ASR); var request, originalCall, callerid, statusInterval, asrTimeout, asr, queueName = 'MainQueue'; //     VoxEngine.addEventListener(AppEvents.CallAlerting, handleInboundCall); // -   function handleInboundCall(e) { originalCall = e.call; //     callerid = e.callerid; //  caller id //   originalCall.addEventListener(CallEvents.Connected, handleCallConnected); originalCall.addEventListener(CallEvents.Failed, cleanup); originalCall.addEventListener(CallEvents.Disconnected, cleanup); //     originalCall.answer(); } //      function cleanup(e) { if (request) { //      -  request.cancel(); request = null; } //   VoxEngine.terminate(); } //       TTS function handlePlaybackFinished(e) { e.call.startPlayback("http://cdn.voximplant.com/newyear.mp3"); } //        TTS function getNumEnding(iNumber, aEndings) { var sEnding, i; iNumber = iNumber % 100; if (iNumber >= 11 && iNumber <= 19) { sEnding = aEndings[2]; } else { i = iNumber % 10; switch (i) { case (1): sEnding = aEndings[0]; break; case (2): case (3): case (4): sEnding = aEndings[1]; break; default: sEnding = aEndings[2]; } } return sEnding; } //   function handleCallConnected(e) { //   e.call.say(" -  !!! " + "        ?", Language.RU_RUSSIAN_FEMALE); e.call.addEventListener(CallEvents.PlaybackFinished, handleIntroPlayed); } //    function handleIntroPlayed(e) { e.call.removeEventListener(CallEvents.PlaybackFinished, handleIntroPlayed); //         asr = VoxEngine.createASR(ASRLanguage.RUSSIAN_RU, [" ", "", "", "  ", " ", " " ]); //     asr.addEventListener(ASREvents.CaptureStarted, function (e) { clearTimeout(asrTimeout); }); //   asr.addEventListener(ASREvents.Result, function (e) { //   asr.stop(); //   ,      SnegurQueue if ((e.text == ' ' || e.text == '' || e.text == '') && e.confidence >= 50) { originalCall.say("!       .", Language.RU_RUSSIAN_FEMALE); queueName = 'SnegurQueue'; originalCall.addEventListener(CallEvents.PlaybackFinished, addToQueue); } else if ((e.text == '  ' || e.text == ' ' || e.text == ' ') && e.confidence >= 50) { //    ,   - MorozQueue originalCall.say("!        .", Language.RU_RUSSIAN_FEMALE); queueName = 'MorozQueue'; originalCall.addEventListener(CallEvents.PlaybackFinished, addToQueue); } else { //    ( < 50%),      - MainQueue originalCall.say("         .", Language.RU_RUSSIAN_FEMALE); originalCall.addEventListener(CallEvents.PlaybackFinished, addToQueue); } }); //     ASR originalCall.sendMediaTo(asr); //    3       ,      asrTimeout = setTimeout(function () { asr.stop(); originalCall.say("         .", Language.RU_RUSSIAN_FEMALE); originalCall.addEventListener(CallEvents.PlaybackFinished, addToQueue); }, 3000); } //         queueName function addToQueue(e) { Logger.write('Adding call to queue: '+queueName); originalCall.removeEventListener(CallEvents.PlaybackFinished, addToQueue); //   TTS    originalCall.addEventListener(CallEvents.PlaybackFinished, handlePlaybackFinished); //    request = VoxEngine.enqueueACDRequest(queueName, callerid); //      request.addEventListener(ACDEvents.Queued, function (acdevent) { request.getStatus(); }); //       request.addEventListener(ACDEvents.Waiting, function (acdevent) { var minutesLeft = acdevent.ewt + 1, txt = '      '; if (queueName == 'SnegurQueue') txt = "   "; else if (queueName == 'MorozQueue') txt = "    "; originalCall.say("     " + acdevent.position + ". " + txt + " " + (acdevent.ewt + 1) + getNumEnding(minutesLeft, ['', '', '']), Language.RU_RUSSIAN_FEMALE); }); //   -     request.addEventListener(ACDEvents.OperatorReached, function (acdevent) { VoxEngine.sendMediaBetween(acdevent.operatorCall, originalCall); acdevent.operatorCall.sendMessage(JSON.stringify({ number: originalCall.callerid() })); acdevent.operatorCall.addEventListener(CallEvents.Disconnected, VoxEngine.terminate); clearInterval(statusInterval); }); //    request.addEventListener(ACDEvents.Offline, function (acdevent) { clearInterval(statusInterval); //         ,       if (queueName == 'SnegurQueue') { originalCall.say(" ,       .    !", Language.RU_RUSSIAN_FEMALE); queueName = 'MainQueue'; originalCall.addEventListener(CallEvents.PlaybackFinished, addToQueue); } else if (queueName == 'MorozQueue') { originalCall.say(" ,        .   !", Language.RU_RUSSIAN_FEMALE); queueName = 'MainQueue'; originalCall.addEventListener(CallEvents.PlaybackFinished, addToQueue); } else { //        ,        originalCall.say(" ,          .    " + "      -!   !", Language.RU_RUSSIAN_FEMALE); originalCall.addEventListener(CallEvents.PlaybackFinished, VoxEngine.Terminate); } }); //        30  statusInterval = setInterval(request.getStatus, 30000); }
      
      







処理ルールの作成



番号およびWeb SDKからの着信呼び出しは、処理のためにスクリプトに送信する必要があります。 発信通話用のWebアプリケーションでは、newyearcall番号を縫い付け、電話番号のセクションでは、番号74951330204をアプリケーションに接続しました。 2つのルールを作成します。





待ち行列



このプロジェクトのコンテキストでは、3つの異なるキュー([設定]-> [キュー])- MainQueue (すべて)、 MorozQueue (Santa Clausesのみ)、およびSnegurQueue (Snow Maidenのみ)を作成する必要があります。 呼び出し元は、話したい相手を選択するように招待されます-Snow MaidenまたはSanta Clausで、前述の辞書からVoxImplantで利用可能な音声認識システムを使用して選択します。 3秒以内に選択が表明されなかった場合、またはシステムが認識されたオプション(確率<50%)を確信していない場合、コールは一般的なキューにルーティングされます。 選択が正常に行われた場合、特定のキューに送信しています。 このキューにサービスを提供するオペレーターがいない場合、一般キューでコールを再定義し、オペレーターがいない場合、メッセージを失い、自分でオペレーターになることを申し出ます。

キューの作成に加えて、アプリケーションユーザー(オペレーター)のキューへのバインドはスキル(設定->スキル)によって行われるため、適切なスキルグループを作成する必要もあります。 NewYearSkillAllNewYearSkillMorozおよびNewYearSkillSnegurの 3つのスキルを作成し、それぞれのスキルMainQueueMorozQueueおよびSnegurQueue )に順番を設定します。 ユーザーオペレーターを作成する場合、NewYearSkillAll + NewYearSkillMoroz(Santa Clauses)またはNewYearSkillSnegur(snow Maidens)の2つのスキルグループにすぐにフックします。





オペレーターの場所



ウェブダイヤラーのようなオペレーターの場所は、 VoxImplant Web SDKを使用して作成されます 。 重要な点のうち、 setOperatorACDStatus関数を使用したオペレーターステータススイッチの実装に注意することができます。



 vox.setOperatorACDStatus(VoxImplant.OperatorACDStatuses.Ready); //  vox -  VoxImplant.Client
      
      





コールは、エージェントが準備完了状態の場合にのみエージェントに配信されます。 他の状態にあることは、オペレーターの統計に反映されます。



一般に、これで十分です。残りのねじ込み(アプリケーションユーザーのリモート作成など)は、 HTTP API VoxImplantに基づいて既に行われています。



もう一度、結果へのリンクはhttp://demos.zingaya.com/newyear/になります。または、+ 74951330204をダイヤルするだけです。



PSトップオペレーターを完了





したがって、私たちの競争の勝者は、ログインを持つオペレーターでした:

フリザルザル

イボルデュレフ

ピズダグ

zoor4117

ThereIsNoSanta

フィエスタ

DedMorozZzZ

保安官

ベンターショット

joloweb6

みんな、賞品を受け取るために個人で書いてください。



All Articles