クラウド関数で音声プロキシを構築

音声プロキシ（マスクドコーリング）は、中継電話番号を提供することで、ユーザーの個人情報を保護するものです。この方法により、発信者にも着信者にもお互いの実際の電話番号を隠す事が可能です。Uberを代表にデリバリーサービスやライドシェアサービスでは一般的な方法ですが、中小企業のさまざまな場面でも重要視されています。

このチュートリアルでは、お気に入りのユースケースの1つであるバーチャルビジネスフォンを構築します。

2つの通話方向を取り上げます：
---------------------------------------
1. Vonageのクラウドバーチャル番号でクライアントに電話をかける：DTMFで相手先番号へ接続
2. 他の誰かがあなたのVonageクラウドバーチャル番号に電話をかける：あなたの個人番号に接続


これを実現するために必要なのはバーチャルのVonage番号と、Webフックを処理するちょっとしたサーバレス関数になります！

ここで使用するGoogle Cloud Functionsは、Googleが提供するFunction-as-a-Service (FaaS：サービスとしての関数)で、クラウド上での構築を高速化する方法です。

イベントドリブンのサーバレス関数では、マネージドコンピューティング、オートスケール、100ミリ秒単位での従量課金制を扱っています。開発者はシンプルで直感的な操作によってコードに集中することができ、Google Cloudが運用インフラを処理します。

Cloud Functionsは、クラウドサービスをコードで素早く拡張できる積み木のようなイメージです。HTTPで配信されるイベントや他のGoogle Cloud Platformサービスから発信されるイベントに対してレスポンスする形で実行されるため、イベントベースのアーキテクチャ、データ処理、クラウドの自動化などに最適です。

この例では、Google Cloud Functionsのイベントベースのアーキテクチャを利用して、Vonage Voice APIから受け取ったHTTPリクエストによってトリガーされるHTTP関数を記述します。

前提条件
---------------------------------------
* Google Cloud Platformアカウント：Googleにサインアップまたはログインすると、300ドル分のクレジットが付与されます。これは、テストや学習目的でしたら十分なクレジット
* Node.jsやExpressの基本的な理解


Vonage APIアカウント
---------------------------------------
このチュートリアルを完了するには、Vonage APIアカウントが必要です。まだお持ちでない場合は、本日サインアップして無料のクレジットで構築を開始することができます。アカウントを取得すると、Vonage APIダッシュボードの上部にAPIキーとAPIシークレットが表示されます。

このチュートリアルでは、バーチャル電話番号も使用します。購入するには、Numbers（番号）からBuy Numbers（番号の購入）で必要な番号を検索してください。尚、日本の番号は総務省で定めている本人確認のプロセスが必要になりますので、弊社営業担当者までご連絡願います。

Google Cloud Functionsを設定
---------------------------------------
* Google Cloudの新規プロジェクトを作成

まずは、新しいプロジェクトを作成します。これらのプロジェクトは、すべてのGoogle Cloudサービスを作成、有効化、および使用するためのベースとなります。

Cloud Console（クラウドコンソール）のManage Resources（リソース管理）ページに移動し、Create Project（プロジェクトを作成）をクリックします。リソースの作成と管理について詳しくは、Google Cloudガイドを参照してください。

クラウド関数を作成
---------------------------------------
次に、Navigation(ナビゲーション)メニューからCloud Functions（クラウド関数）を選択し、Create Function（関数を作成）をクリックします。

続いて以下の項目を設定して下さい。

1. 関数にname（名前）を付けます
2. Region（地域）を選択します。どの地域か迷う場合は有効な地域のリストで探してください
3. HTTP関数を記述するため、トリガータイプをHTTPに設定
4. 「Allow unauthenticated invocations（未認証の起動を許可する）」と「Require HTTPS （HTTPSを要求）」にチェックします。

完了したら、生成されたURLをコピーしてSave（保存）をクリック

次に、RUNTIME, BUILD AND CONNCETIONS SETTINGS（ランタイム、構築、接続設定）を展開し、Runtime environment variables（ランタイム環境変数）までスクロールダウンします。環境変数として2つの電話番号をいずれもE.164の国際形式で設定する必要があります。例えば、81355551234（日本）または14155550101（米国）とします。


* YOUR_VONAGE_NUMBER：あなたのVonageバーチャル番号にあたりVonageダッシュボードから購入可能です
* YOUR_PHONE_NUMBER：テストに使用する個人の電話番号です

Next（次へ）をクリックすると、設定は完了です。次はコードです！

ソースコードにInline Editor（インラインエディタ）、Runtime（ランタイム）に最新のNode.jsを選択し、プラットフォームが指定するAPIが有効になっている事を確認してください。

インラインコードエディタには、Express.jsのリクエストオブジェクトとレスポンスオブジェクトを使用して生成された定型関数が表示されます。これを私たちの関数に置き換えてみます。関数名を変更した場合、Entry point（エントリポイント）も更新する必要があることに注意してください。


音声を活用したVonageアプリケーションを作成
---------------------------------------
Vonage APIアプリケーションは、Vonageのエンドポイントに接続し、Vonage APIを使用するために必要なセキュリティおよび設定情報を保持します。作成された各Vonageアプリケーションは複数の機能をサポートすることができますが、今回は音声機能のみ必要となります。

それではVonageダッシュボードにログインして頂いた上で作成を進めて下さい。Your applications -（あなたのアプリケーション） > Create a new application(新しいアプリケーションを作成)に移動します。

音声機能をオンにし、生成したCloud Functions URLをAnswer URLフィールドに入力します。私の場合、次のようになります。https://europe-west2-my-proxy-calling-project.cloudfunctions.net/proxy-call（ヨーロッパのリージョンを利用）

今のところ、イベントのWebフックは実装しませんので、フィールドにはhttp://example.com/eventを使用してください。

完了したらGenerate new application（新しいアプリケーションを生成）をクリックします。

次のページでは、アカウントで利用可能なバーチャル番号のリストが表示されます。このアプリケーションで利用したい番号の横にあるLink（リンク）ボタンをクリックします。この電話番号は、アプリケーションをテストする際に電話を掛ける対象となりますので、ローカルの電話番号をご利用される事を推奨します。また、リストが表示されない場合や、適切な番号が見つからない場合は、追加で番号を購入可能です！

ランタイム環境で設定した番号と異なる番号をリンクした場合は、Cloud Console（クラウドコンソール） UIでYOUR_VONAGE_NUMBERの値を更新する事を忘れないで下さい。

コールフローのコントロール
---------------------------------------
Vonageアプリケーションを設定すると、バーチャル番号に電話が掛かってくる度にVonageはあなたのAnswer URLにGETリクエストを行います。VonageはCall Control Object([NCCO＝Nexmo Call Control Object](https://qiita.com/Noboru_Goto/items/718b9fae1201f1ca325d))が返されることを想定し、コールフローがどのように実行されるべきかを定義します。

NCCOは、1つまたは複数のアクションを含む有効なJSON配列で記述します。この例では、いくつかの異なるものを使用します。

* 通話中に音声合成メッセージを再生するtalk（トーク）アクション
* DTMFトーン（ボタン押下）を検知してユーザー入力を取り込むinput（入力）アクション
* 発信者と着信者を接続するためのconnect（接続）アクション


クラウド関数を構築
---------------------------------------
3つのケースがありますので、それに応じて3種類のNCCOを返す必要があります。

以下の3つのケースに対応：

1. 第三者からVonage番号に電話をかける：あなたの電話番号に接続
2. あなたがVonage番号に電話を掛ける
　2.1. DTMFペイロードがまだ提供されていない：DTMF入力を捕捉します
　2.2. DTMFペイロードが利用可能：DTMFペイロード（相手先電話番号）に通話を接続します

Google Cloud Consoleに戻り、定型コードを以下のように置き換えます。

各セクションを確認
---------------------------------------
1. 電話を受ける：コーラーを接続

まず、誰かがあなたのバーチャル番号に電話をかけた場合、その電話はあなたの実際の電話番号に接続されるようにしたいと思います。これはconnect（接続）アクションと、オプションとして発信者に接続中であることを知らせるtalk（トーク）アクションを使用することで実現します。

この場合、以下のNCCOを返す必要があります。

このユースケースでは、上記のスニペットで十分ですが、必要に応じて、これらのアクションをさらに設定することができます。NCCO Reference（リファレンス）にアクセスして、利用可能なすべてのオプションをご覧ください。

2. 電話をかける
次に、Vonage番号に電話をかけ、携帯電話のキーパッド（DTMF入力）で相手先の番号を入力し、入力した番号に接続される場合について説明します。

この場合2つの段階があります。

2.1 DTMF入力を認識

まず、数字を取り込むためのinput（入力）アクションを含むNCCOを返す必要があります。さらに、指示を含めるためにtalk（トーク）アクションを追加します。

talk（トーク）アクションは前のステップのものと同じで、これもオプションです。

input（入力）アクションは['dtmf']型である必要があります。音声認識も可能です。このアクションについては、NCCO Reference(リファレンス)を参照してください。

また、デフォルトのDTMF Input Settings（ DTMF入力設定）を変更して、電話番号の取り込みに適した設定にする必要があります。

* timeOutは、呼び出し元の最後のアクションからeventUrlに送信されるまでの秒数です。デフォルトでは3ですが、少し余裕を持たせるために最大の10にしておきます。

* maxDigitsは、ユーザーが押すことのできる桁数で、デフォルトでは4桁です。15桁にすると、Vonageが電話番号に使用しているフォーマットであるE.164国際形式の電話番号に対応します。例えば、英国の電話番号は447700900123のような形式です。

* submitOnHashにより、#キーを押した後に、発信者のアクティビティをeventUrlに送信することができます。#が押されない場合、timeOut秒後に結果が送信されます。デフォルトではFalseなので、必ずtrueに設定してください。

2.2 DTMFインプットにコールを接続
数字が捕捉されると、VonageはリクエストボディにDTMFペイロードを持つエンドポイントに、別のリクエスト（デフォルトでPOST）をします。次に、あなたが宛先番号に接続されるように、connect（接続）アクションとともに2番目のNCCOが返される必要があります。

このCall Control Object（コールコントロールオブジェクト）は、宛先番号を動的に設定する以外は、最初のオブジェクトと同様です。req.body.dtmf.digitsにはDTMFペイロードが含まれます。DTMF Capturing Results（DTMF捕捉結果）の詳細については入力Webhook Reference（Webフックリファレンス）を参照してください。

完成
---------------------------------------
最後に、すべてのパーツを1つにまとめます！これまで説明してきた3つのスニペットを最初の関数にはめ込むと、次のようなコードになります。

準備ができたら、DEPLOY（導入）をクリックします。導入に1分ほどかかるかもしれませんが、我慢してください。関数の横に緑色のチェックマークが表示されたら、テスト準備完了です！

通話転送サービスが利用できるようになりましたので、さっそく電話してみましょう！さらに、友人にあなたのバーチャル番号を鳴らしてもらうと、両方の通話をテストできます。


次にやるべきことは？
---------------------------------------
おめでとうございます！あなたはたった1つの小さなGoogle Cloud Functionでプロキシコールサービスを構築することができました。

さらに進む準備はできていますか？通話録音が必要なユースケースはありますか？複数の番号でサービスを利用したいですか？音声とDTMFの両方の入力が必要ですか？

以下のリソースをどのように拡張できるか考えてみてください。あなたの取り組みや考えをぜひお聞かせください。


リソース
---------------------------------------
[音声APIの概要](https://developer.vonage.com/voice/voice-api/overview)
[NCCOリファレンス](https://developer.vonage.com/voice/voice-api/ncco-reference)
[音声API Webフックリファレンス](https://developer.vonage.com/voice/voice-api/webhook-reference)
[音声APIリファレンス](https://developer.vonage.com/api/voice?theme=dark)
[自動音声認識](https://developer.vonage.com/voice/voice-api/guides/asr)
[DTMFシグナル](https://developer.vonage.com/voice/voice-api/guides/dtmf)
[Google Cloud Functions](https://cloud.google.com/functions)
[環境変数の使用](https://cloud.google.com/functions/docs/configuring/env-var#cloud-console-ui)

開発者様向け
---------------------------------------
【アカウント作成】　無料でVonage APIをお試しいただけます。テストクレジット付与中！
[Video API (tokbox)](https://tokbox.com/account/user/signup)
[Video API 以外のAPI](https://dashboard.nexmo.com/sign-up)

【デベロッパーセンター】　Vonage APIの使い方についてはこちらをご覧ください。
[Video API (tokbox)](https://tokbox.com/developer/)
[Video API Tools（開発・デバッグツール）](https://tokbox.com/developer/tools/)
[Video API 以外のAPI](https://developer.vonage.com/)

連絡先
---------------------------------------
Vonage Japan合同会社
Mail: sales-japan@vonage.com
URL: https://www.vonagebusiness.jp/communications-apis/

#vonage #コミュニケーションapi #cpaas