声の旅
このガイドでは、次のようなコンタクトセンターのシナリオを実装します:
- ユーザーはあなたのVonage番号に電話をかけます、
- 最初の挨拶が読み上げられ、ユーザーは提供されたメニューからオプションを選択する、
- ユーザーはエージェントに接続されている、
- エージェントが通話を終えると、ユーザーは顧客満足度調査に転送される。
流れをよりよく理解するためには、以下を参照のこと。 通話フロー.
前提条件
このガイドを完成させるには
- A Vonageアカウント,
- について Vonage CLI をインストールし、セットアップした、
- ングロク - を使用して、開発用Webサーバーをインターネット経由でVonageのサーバーにアクセスできるようにします、
- ノードジェーエス を設置した、
- PSTN番号が割り当てられた2つの電話通話デバイス - 「ユーザー電話」と「エージェント電話」、例えば2台の携帯電話、または以下のような通話機能を持つアプリケーション。 ボンテージビジネス アプリ
依存関係をインストールする
をインストールします。 エクスプレス ウェブアプリケーションフレームワークと ボディパーサー パッケージ:
音声アプリケーションの作成
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
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 の代わりに使用する。 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 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.90 €0.00
Use vonage numbers buy to purchase.
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.90 €0.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 for €0.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 numbers buy US 16127779311
✅ Searching for numbers
Are you sure you want to purchase the number 16127779311 for €0.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}`))
アプリケーションのテスト
- 以下のコマンドを実行して、Node.jsアプリケーションを実行する:
ユーザーフォン」からVonage番号に電話をかけ、ウェルカムメッセージを聞く。
ダイヤルパッドを開き、1または2を押す。
インバウンドコールに「エージェントフォン」で応答する。
エージェントの電話を切る。
調査メッセージを聞き、最初の機器のいずれかのキーを押す。
コンソールログで調査結果を確認する。
トラブルシューティング
ユーザーとエージェントの音が聞こえない場合、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.通話のスクリプト部分とライブ会話(およびその逆)を切り替えることで、あらゆる電話通話のユースケースをミックスし、シームレスな顧客体験を作り出すことができます。