声の旅

このガイドでは、次のようなコンタクトセンターのシナリオを実装します:

  • ユーザーはあなたのVonage番号に電話をかけます、
  • 最初の挨拶が読み上げられ、ユーザーは提供されたメニューからオプションを選択する、
  • ユーザーはエージェントに接続されている、
  • エージェントが通話を終えると、ユーザーは顧客満足度調査に転送される。

流れをよりよく理解するためには、以下を参照のこと。 通話フロー.

前提条件

このガイドを完成させるには

  • A Vonageアカウント,
  • について Vonage CLI をインストールし、セットアップした、
  • ングロク - を使用して、開発用Webサーバーをインターネット経由でVonageのサーバーにアクセスできるようにします、
  • ノードジェーエス を設置した、
  • PSTN番号が割り当てられた2つの電話通話デバイス - 「ユーザー電話」と「エージェント電話」、例えば2台の携帯電話、または以下のような通話機能を持つアプリケーション。 ボンテージビジネス アプリ

依存関係をインストールする

をインストールします。 エクスプレス ウェブアプリケーションフレームワークと ボディパーサー パッケージ:

npm install express body-parser

音声アプリケーションの作成

CLIを使ってVoice APIアプリケーションを作成します。 ウェブフック Vonage番号( あなたのVonage番号にかかってきた電話に応答します。/webhooks/voice/answer) とコール・イベントのログ (/webhooks/voice/event)をそれぞれ示している。

これらのウェブフックはVonageのサーバーからアクセスできる必要があるので、このガイドでは ngrok ローカル 開発環境を公共のインターネットに公開する。 この記事 をインストールする方法を説明する。 そして ngrok をクリックし、リクエストを送信するようにVonageを設定します。

アプリケーションをお持ちでない場合は、CLIを使用してアプリケーションを作成することができます。

vonage apps create 'Your application'

✅ Creating Application
Saving private key ... Done!
Application created

Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set

Capabilities:
  None Enabled

このコマンドは、アプリケーションID(メモしておくとよい)と秘密鍵情報(このガイドでは無視してもよい)を返す。 このガイドの目的では無視しても構わない)。

走る ngrok 以下のコマンドを使用する:

ngrok http 3000

の一時的なホスト名をメモしておいてください。 ngrok の代わりに使用する。 example.com 次の コマンドを使用する:

vonage apps capabilities update 00000000-0000-0000-0000-000000000000 voice `
  --voice-answer-url='https://example.com/webhooks/voice/answer' `
  --voice-event-url='https://example.com/webhooks/voice/event' `
  --voice-fallback-url='https://example.com/webhooks/voice/fallback'
  
✅ Fetching Application
✅ Adding voice capability to application 00000000-0000-0000-0000-000000000000

Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set

Capabilities:
 VOICE:
    Uses Signed callbacks: On
    Conversation TTL: 41 hours
    Leg Persistence Time: 6 days
    Event URL: [POST] https://example.com/webhooks/voice/event
    Answer URL: [POST] https://example.com/webhooks/voice/answer
    Fallback URL: [POST] https://example.com/webhooks/voice/fallback

電話番号の購入

アプリケーションへのインバウンドコールを処理するには、Vonageの番号が必要です。すでに使用する番号がある場合は、次のセクションに進んで既存の番号をアプリケーションに関連付けます。 次のセクションにジャンプして、既存の番号をアプリケーションに関連付けます。

を使用することができます。 Vonage CLI 電話番号を購入する:

Numbersの検索

Vonage CLIを使用して番号を購入できます。次のコマンドは、購入する番号を検索します。 別の2文字の国コード を購入する。 他国で番号を購入する場合)。

vonage numbers search US

✅ Searching for numbers

There is 1 number available for purchase in United States

Number       Type    Features         Monthly Cost  Setup Cost
-----------  ------  ---------------  ------------  ----------
16127779311  Mobile  MMS, SMS, VOICE  €0.900.00

Use vonage numbers buy to purchase.

Numbersを購入する

納得のいく番号が見つかったら、その番号を vonage numbers buy コマンドを使用している:

vonage numbers buy US 16127779311 
✅ Searching for numbers
Are you sure you want to purchase the number 16127779311 for0.90? [y/n] y

✅ Purchasing number
Number 16127779311 purchased

Number: 16127779311 
Country: 🇺🇸 United States
Type: Mobile
Features: MMS, SMS, VOICE
Monthly Cost: €0.90
Setup Cost: €0.00
Linked Application ID: Not linked to any application
Voice Callback: Not Set
Voice Callback Value: Not Set
Voice Status Callback: Not Set

これでアプリケーションコードを書く準備ができた。

回答のウェブフックを書く

Vonageはバーチャル番号で着信コールを受けると、以下のリクエストを行います。 /webhooks/answer ルートに接続します。 このルートはHTTPの GET リクエストを返し ネクスモ・コール・コントロール・オブジェクト(NCCO) これは、Vonageにコールの処理方法を指示するものです。

NCCOは talk というアクションを実行します。 input ユーザーを取得するアクション DTMF入力 (キーが押された):

app.get('/webhooks/voice/answer', (request, response) => {
  console.log('answer: ', request.query)

  const ncco = [{
    action: 'talk',
    text: 'Thank you for calling Example Inc.! Press 1 to talk to the sales department, press 2 to get technical support.',
    bargeIn: true
  },
    {
      action: 'input',
      eventUrl: [
        `${request.protocol}://${request.get('host')}/webhooks/input`],
      type: [ 'dtmf' ],
      dtmf: {
        maxDigits: 1
      }
    }
  ]

  response.json(ncco)
})

イベントウェブフックを書く

コンソールでコールのライフサイクルを観察できるように、コールイベントをキャプチャするWebhookを実装する:

app.post('/webhooks/voice/event', (request, response) => {
  console.log('event:', request.body)
  response.sendStatus(200);
})

Vonageは POST リクエストは、コールステータスが変わるたびに、このエンドポイントに送られる。

入力ウェブフックを書く

DTMF入力の結果は、以下のように設定した特定のURLに送信されます。 input アクションだ: /webhooks/input.結果を処理するためにWebhookを追加し、ユーザーとの対話を追加します。

認識に成功した場合、リクエストペイロードは以下のようになる:

{
  "speech": {
  },
  "dtmf": {
    "digits": "1",
    "timed_out": true
  },
  "from": USER_NUMBER,
  "to": VONAGE_NUMBER,
  "uuid": "abfd679701d7f810a0a9a44f8e298b33",
  "conversation_uuid": "CON-64e6c8ef-91a9-4a21-b664-b00a1f41340f",
  "timestamp": "2020-04-17T17:31:53.638Z"
}

ユーザーの入力を dtmf.digits 配列を使用して、彼らが選択したオプションを決定します。対応する部署のユーザとエージェントの両方を接続するために、エージェントエンドポイントへのアウトバウンドコールを作成します。このサンプルでは、簡単のためにテスト用の電話番号、例えば携帯電話番号を使用することができます。現実には、エンドポイントはPSTN番号または SIPエンドポイント 既存のPBXやコンタクトセンターに接続することができます。また、コンタクトセンター・ソリューションをゼロから開発する場合は、WebRTCクライアントにすることもできます。 Client SDK は、独自のコンタクトセンター・エージェント・アプリケーションを実装するために必要なすべてを提供します。

最後に、両方の通話(レッグ)を1つの会議室(名前 会話).そのためには conversation 同じ name ユーザー呼(インバウンドレグ)とエージェントレグ(アウトバウンドコー ル)の両方。会話名を生成するには、実際のタイムスタンプを使用するなど、どのような一意なID 生成方法を使用してもよい。

オプションとして connect アクションを使用します。違いは connectこの場合、通話参加者のいずれかが電話を切ると、通話は直ちに終了し、残るレッグは1つになります。そのため、通話後にユーザーをアンケートに転送することはできません、 connect はもう少し便利なオプションです。エージェントが通話を完了した後もユーザーを接続したままにしたい場合は、次のオプションを選択します。 conversation 下の例のように。

入力コールバックを処理するコードを追加する:

app.post('/webhooks/input', (request, response) => {
  console.log('input:', request.body)

  // generating unique conversation name
  var conversationName = 'conversation_' + Date.now()

  console.log('conversationName: ', conversationName)

  // selecting agent/department endpoint
  var departmentId = request.body.dtmf.digits
  var department = ''
  var departmentNumber = ''

  switch (departmentId) {
    case '1':
      department = 'Sales'
      departmentNumber = AGENT_NUMBER
      break
    case '2':
      department = 'Support'
      departmentNumber = OTHER_AGENT_NUMBER //you can use the same number for the sample
      break
    default:
      break
  }

  var ncco = ''

  if (department != '') {
      // NCCO for the user leg
    ncco = [{
      action: 'talk',
      text: 'Please wait while we connect you to ' + department
    }, {
      action: 'conversation',
      name: conversationName
    }
    ]

    // creating the agent leg and moving it to the same conversation
    vonage.calls.create({
      to: [
        {
          type: 'phone',
          number: departmentNumber
        }
      ],
      from: {
        type: 'phone',
        number: VONAGE_NUMBER
      },
      ncco: [
        {
          action: 'conversation',
          name: conversationName
        }]

    }, (error, response) => {
      if (error) console.error('outbound error:', error)
      if (response) {
          console.log('outbound ok')
      }
    })
  } else { // something went wrong, fallback route
    ncco = [{
      action: 'talk',
      text: 'Press 1 to talk to the sales department, press 2 to get technical support.',
      bargeIn: true
    }, {
      action: 'input',
      eventUrl: [
        `${request.protocol}://${request.get('host')}/webhooks/input`
      ],
      dtmf: {
        maxDigits: 1
      }
    }]
  }
  
  response.json(ncco)
})  

アンケートNCCOを追加

次に、通話終了時に顧客満足度調査を実施するために、次のことを行う必要があります。 completed イベントを生成します。これは、同じイベントウェブフックに到着するので、イベントウェブフックを 移籍願い を調査 NCCO に追加する必要があります。そのためには、ユーザとエージェントの足の識別子を保存する必要があります:

var userLegId = ''
var agentLegId = ''

app.get('/webhooks/answer', (request, response) => {
  console.log('answer: ', request.query)

  userLegId = request.query.uuid

  console.log('userLegId: ', userLegId)
  

...

app.post('/webhooks/input', (request, response) => {
  console.log('input:', request.body)

    // creating the agent's leg and moving it to the same conversation
    vonage.calls.create({
        ...
    }, (error, response) => {
      if (error) console.error('outbound error:', error)
      if (response) {
        agentLegId = response.uuid
        console.log('agentLegId: ', agentLegId)
      }
    })
  } else ...

実際のシナリオでは、ユーザー/エージェントのレッグ識別子のペアを保存する キャッシュを実装する必要がある。このガイドに示されているサンプル・コードは、1つの同時呼に対してのみ適切に動作する。

でインラインNCCOを使用したREST API更新コールメソッドでイベントWebhookを拡張します。 talk そして input アクションを使用して、ユーザーの足を調査部分に移動させる:

app.post('/webhooks/event', (request, response) => {
  console.log('event:', request.body)

  if (request.body.uuid == agentLegId && request.body.status == 'completed') {
    vonage.calls.update(userLegId, {
      action: 'transfer',
      destination: {
        type: 'ncco',
        ncco: [ {
          action: 'talk',
          text: 'Please valuate quality of service by entering a digit, 1 to 5'
        },
        {
          action: 'input',
          type: [ 'dtmf' ],
          dtmf: {
            maxDigits: 1
          },
          eventUrl: [ `${request.protocol}://${request.get('host')}/webhooks/survey` ]
        }
        ]
      }
    }, (err, res) => {
      if (err) {
        console.error('transfer error:', err)
      } else {
        console.log('transfer ok')
      }
    })
  }
  
  response.sendStatus(200)
})

アンケートのウェブフックを書く

結果を印刷するためにアンケートのウェブフックを追加します:

app.post('/webhooks/survey', (request, response) => {
  console.log('survey: ', request.body)

  var phone = request.body.from
  var date = request.body.timestamp
  var score = request.body.dtmf.digits

  console.log('[%s] User %s gave %d', date, phone, score)

  const ncco = [
    {
      action: 'talk',
      text: 'Thank you, good bye.'
    }
  ]

  response.json(ncco)
})

Node.jsサーバーを作成する

最後に、Node.jsサーバーをインスタンス化するコードを書きます:

const port = 3000
app.listen(port, () => console.log(`Listening on port ${port}`))

アプリケーションのテスト

  1. 以下のコマンドを実行して、Node.jsアプリケーションを実行する:
node index.js
  1. ユーザーフォン」からVonage番号に電話をかけ、ウェルカムメッセージを聞く。

  2. ダイヤルパッドを開き、1または2を押す。

  3. インバウンドコールに「エージェントフォン」で応答する。

  4. エージェントの電話を切る。

  5. 調査メッセージを聞き、最初の機器のいずれかのキーを押す。

  6. コンソールログで調査結果を確認する。

トラブルシューティング

ユーザーとエージェントの音が聞こえない場合、2つの足が異なる場所で処理されている可能性があります。異なる conversation_uuid_to の値は transfer イベントを使用する必要があります。この問題を解決するには、SDKを構成して特定のデータセンターを使用するようにしてください。 トラブルシューティングガイド:

const options = {
  apiHost: 'api-us-1.nexmo.com',
  restHost: 'rest-us-1.nexmo.com'
}

const vonage = new Vonage({
  apiKey: VONAGE_API_KEY,
  apiSecret: VONAGE_API_SECRET
  applicationId: VONAGE_APPLICATION_ID,
  privateKey: VONAGE_APPLICATION_PRIVATE_KEY_PATH
}, options)

結論

Vonage Voice APIを使えば、既存のコンタクトセンター・ソリューションにロジックの複雑さを問わないIVRを追加することができます。また、Voice APIを使用して独自のソリューションをゼロから構築することもできます。 Client SDK.通話のスクリプト部分とライブ会話(およびその逆)を切り替えることで、あらゆる電話通話のユースケースをミックスし、シームレスな顧客体験を作り出すことができます。

次はどこだ?

  • 詳細はこちら 通話フロー Voice APIを使って
  • コールメニュー(インタラクティブ・ボイス・レスポンス)をゼロから構築する方法を以下の手順で学びます。 チュートリアル
  • 顧客体験の向上 音声認識DTMF入力の代わりとして、またはDTMF入力と一緒に;
  • 使い方を見る 通話録音 今後の参考とコール後の分析のために;
  • メディアへの直接アクセス ウェブソケット リアルタイム分析とAI統合のために。
  • チェック ボネージAI IVRまたは音声ボットをお客様の特定のユースケースに合わせて当社の専門家が構築します。