https://d226lax1qjow5r.cloudfront.net/blog/blogposts/call-whisper-with-selective-audio-controls-dr/Selective-Audio-Controls_1200x675.jpg

音声選択機能付きコール・ウィスパー

最終更新日 May 11, 2021

所要時間:1 分

Nexmoはコンタクトセンター・ソリューションとして長い間好評を博してきましたが、本日リリースされた選択型音声コントロールにより、次のレベルへと進化を遂げました。選択的音声コントロールは、よくあるユースケース、つまり、スーパーバイザーが通話を聞いているが、顧客ではなく、その従業員にしか聞こえないというケースを、直感的な方法で解決します。

Nexmoプラットフォーム上の会話参加者にはそれぞれIDが割り当てられます。これらのIDと 会話アクションを使用すると、会話に初めて参加した人がどの参加者の話を聞くことができるかを制御するアプリケーションを構築することができます。この投稿では、従業員の話を聞く上司のユースケースを構築します。

このアプリケーションのコードは Github

アプリケーションのブートストラップ

このコール・フローを構築するには、小さなnode.jsアプリケーションを書く必要がある。新しいプロジェクトを作成して expressをインストールしよう。 answer_url.

mkdir selective-audio cd selective-audio npm init -y npm install express body-parser --save

のインスタンスを作成する必要がある。 expressのインスタンスを作成し answer_urlのインスタンスを作成し、ポートをリッスンする必要がある。そのためには index.jsを以下の内容で作成する:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.urlencoded({"extended": true}));
app.use(bodyParser.json());

app.get('/webhooks/answer', (req, res) => {
    return res.json([]);
});

app.listen(3000, () => {
    console.log('Listening');
});

回答URLの作成

アプリケーションのブートストラップができたので、いよいよビジネスロジックの追加を開始します。このコールには3人の参加者がいます:

  • コンタクトセンターのスーパーバイザー、アリス

  • コンタクトセンターのボブ

  • 顧客のチャーリー

現実の世界では、これを実現するために必要なすべての情報を格納するためにデータベースを使うだろうが、この記事ではメモリ上のオブジェクトを使うことにしよう。キーは参加者の電話番号で、参加者に関する情報を含むオブジェクトにマップされます。今のところ、それは彼らの役割だけです。以下のコードを app.use(bodyParser.json());以下のコードを更新し、キーを実際の電話番号に置き換えてください。

const conversationName = 'selective-audio-demo';
const participants = {
  "<supervisor_phone_number>": {
    "role": "supervisor",
  },
  "<agent_phone_number>": {
    "role": "agent",
  },
  "<customer_phone_number>": {
    "role": "customer",
  }
};

それができたら、有効なNCCOを返すように /webhooks/answerを更新する必要がある。発信者のタイプごとに異なるNCCOが必要になるので、次のように switchステートメントを追加し、発信者タイプごとにNCCOを返すメソッドを呼び出してみましょう:

app.get('/webhooks/answer', (req, res) => {
    const caller = participants[req.query.from];

    if (!caller) {
        return res.status(400).json("Unknown caller type: " + req.query.from);
    }

    // Generate an NCCO based on role
    let ncco;
    switch (caller.role) {
        case 'supervisor':
            ncco = createSupervisorNcco(caller);
            break;
        case 'agent':
            ncco = createAgentNcco(caller);
            break;
        case 'customer':
            ncco = createCustomerNcco(caller);
            break;
        default:
            return res.status(400).json("Unknown caller type: " + caller.type);

    }
    return res.json(ncco);
});

このコードでは createSupervisorNcco, createAgentNccoまたは createCustomerNccoを呼び出す。これらの関数を作成し、NCCOを返す必要がある。

カスタマーNCCO

顧客のNCCOから始めよう。顧客は、エージェントの声は聞こえるが、スーパーバイザーの声は聞こえないようにし、エージェントとスーパーバイザーの両方に話しかけることができるようにしたい。さらに、顧客が電話をかけてきたときは、エージェントが会話に加わるまで保留にしておきたい。

顧客NCCOを生成するために、ファイルの末尾に以下を追加してください。私たちは conversationアクションを使用し、会話に nameを指定し、通話を自動的に開始しないことと、ユーザーを保留にすることを指定します。これらはすべてNexmo Voice APIの既存のパラメータです。

このNCCOが興味深いのは canSpeakcanHearパラメータである。この2つのパラ メータは、他の参加者を識別するUUIDのリストを受け入れ、通話に接続する人が 誰と話したり聞いたりできるかを制御する。参加者のUUIDが提供されない場合、接続するユーザーは、その参加者と話し たり聞いたりすることはできない。

この例では、顧客はエージェントとその上司と話すことができますが、エージェントからの音声のみを聞くことができます。ファイルの一番下に以下を追加してください:

function createCustomerNcco(caller){
    // Customer can hear agent, and speak to everyone
    return [
        {
            "action": "conversation",
            "name": conversationName,
            "startOnEnter": false,
            "musicOnHoldUrl": ["https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3"],
            "canSpeak": findParticipants('agent').concat(findParticipants('supervisor')),
            "canHear": findParticipants('agent')
        }
    ]
}

エージェントNCCO

次はエージェントのNCCOだ。エージェントは、参加者全員と話し、参加者全員に聞こえるようにしなければならない。エージェントはこの電話会議のオーナーである。 startOnEnterをtrueに設定し、彼らが参加すると会議がアクティブになることを示す。さらに recordtrueに設定し、通話が録音されるようにした。

エージェントはすべての人に話しかけ、聞くことができるので、すべての顧客とすべてのスーパーバイザーを見つけ、そのUUIDをアクションに供給する。 conversationアクションを実行します。

この場合 canSpeakcanHearをNCCOから省略することができます。デフォルトの値は、すべての参加者の間で音声を許可するようになっているからです。参加者を完全にコントロールするために、私はいずれにせよ、それらを提供することにしました。

function createAgentNcco(caller){
    // Agent can hear everyone, and speak to everyone
    return [
        {
            "action": "conversation",
            "name": conversationName,
            "startOnEnter": true,
            "record": true,
            "canSpeak": findParticipants('customer').concat(findParticipants('supervisor')),
            "canHear": findParticipants('customer').concat(findParticipants('supervisor'))
        }
    ]
}

スーパーバイザー NCCO

最後に、スーパーバイザーNCCOがある。スーパーバイザーは全員の声を聞くことができるが、エージェントとだけ話すことができる(これは顧客の反対である)。先ほどと同様に、彼らはコールを所有しないので startOnEnterはfalseに設定される。

私たちは canSpeakcanHearスーパーバイザーはエージェントとしか話すことができませんが、エージェントと顧客の両方の声を聞くことができます。

function createSupervisorNcco(caller){
    // Supervisor can hear everyone, but only speak to agents
    return [
        {
            "action": "conversation",
            "name": conversationName,
            "startOnEnter": false,
            "musicOnHoldUrl": ["https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3"],
            "canSpeak": findParticipants('agent'),
            "canHear": findParticipants('customer').concat(findParticipants('agent'))
        }
    ]
}

すべてを機能させる

あと少しだ!アプリケーションが動くようになるまでに、あと2つだけやることが残っています。ひとつは findParticipantsメソッドを実装することです。次の関数をファイルの一番下に追加してください:

function findParticipants(callerType) {
    let legs = [];
    Object.entries(participants).forEach(([number, participant]) => {
        if (participant.role == callerType && participant.legId) {
            legs.push(participant.legId);
        }
    });

    return legs;
}

これは指定されたロールのすべての参加者を検索する。ロールがマッチした場合、足のUUIDが配列にプッシュされ、返されます。

もうひとつは、次のようなリクエストがあったときに、呼び出し元の足のUUIDを保存するようにすることだ。 /webhooks/answer.現在の呼び出し元が見つかるかどうかをチェックした後、レッグIDを格納するようにコードを更新する:

if (!caller) {
    return res.status(400).json("Unknown caller type: " + req.query.from);
}

// Add their leg ID to the caller
caller.legId = req.query.uuid;

この時点で、アプリケーションは動作するはずです。あなたの answer_urlがアクセス可能であることを確認してください(おそらく がアクセス可能であることを確認する。を使って)アクセスできることを確認し、構築したアプリケーションを指す番号に電話をかけてください。Nexmoアプリケーションを作成し、番号をレンタルする必要がある場合は、アプリケーションの概念を参照してください。 アプリケーションコンセプトをご覧ください。

シェア:

https://a.storyblok.com/f/270183/384x384/1c8825919c/mheap.png
Michael Heapヴォネージの卒業生

マイケルはポリグロット・ソフトウェア・エンジニアであり、システムの複雑性を軽減し、より予測可能なものにすることに尽力している。さまざまな言語やツールを使いこなし、ユーザーグループやカンファレンスで世界中の聴衆と技術的な専門知識を共有している。日々、マイケルはVonageの元開発者支持者であり、あらゆるテクノロジーについて学び、教え、書くことに時間を費やしている。