githubとvonageで電話音声案内を作ろう！

こんにちは、キン担ラボの本橋です。

この記事はvonageアドベントカレンダーの12/1に向けて書きました。

https://qiita.com/advent-calendar/2024/vonage

せっかく初日を取らせていただいたのでvonageについて説明します。

vonageはクラウドベースのコミュニケーション機能をAPIとして提供するCPaaS（Communications Platform as a Service）です。Webサイトやモバイルアプリケーションに、音声通話、SMS、ビデオ通話、チャット、AI、認証などの機能を容易に統合できます。

今回はそんなvonageで電話の自動音声応答を手軽に作って試す手順を組み立ててみました。

ざっとまとめると以下の３つの手順でIVRが構築できます。

1. NCCOという書式のJSONを作って、
1. github gistに配置して、
1. vonageから読み込ませる

今回は手順を軽量化するためにgithub gistを使いました。

手順1をkintoneなどで自動化して、手順2をAWSなどで自前でホスティングすれば概ね音声案内システムを構築できてしまうというお手軽さです。

kintoneを使ってNCCOを書く、という記事は以前noteに書きました。こちらもよろしければご一読ください。

https://note.com/motohasystem/n/n56aa37a29c61


ところでvonageで日本国内の電話番号を発行するのはちょっとばかり手間がかかります。ここでは発行できている前提で進めます。ご了承ください。


# NCCOを作る

サンプルを置いておきます。お試しということで、このまま使っていただけます。

```
[
  {
    "action": "talk",
    "text": "こんにちは、NCCOのサンプルです",
    "language": "ja-JP",
    "style": "2"
  } ,
  {
    "action": "talk",
    "text": "こんなふうにおしゃべりできます",
    "language": "ja-JP",
    "style": "3"
  } ,
  {
    "action": "talk",
    "text": "いろいろな音声を喋らせて遊んでください。",
    "language": "ja-JP",
    "style": "4"
  } 
]
```

NCCOの書き方については、まずざっと概要を掴みたい方はこちらの記事が分かりやすいかと思います。

https://zenn.dev/kwcplus/articles/415e3c6fbd96af

より詳細を知りたくなったら公式リファレンスをどうぞ。

https://developer.vonage.com/en/voice/voice-api/ncco-reference

ここまでで『NCCOを記述したJSONファイルが用意できました！』という体で進みます。


# vonageから読めるヘッダでGithub gistにホスティングする

さきほどのjsonファイルをサンプルとしてgistにアップロードしました。

[NCCOサンプル](https://gist.githubusercontent.com/motohasystem/20cf817a5389a7e13fb0a22944930c35/raw/9cfd93907a98cb0b89a52d5a3a567dcbc3673862/01_ncco_sample.json)

このままgistのURLを使うとレスポンスの Content-Type が text/plain で返ってきてしまいます。vonageでは application/json が必要で、このままだとエラーが発生して呼び出しが話し中になります。

ヘッダ問題を解決するためにCDNを使いましょう。

今回は [raw.githack.com](https://raw.githack.com/) を使いました。

https://raw.githack.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/cf7d07a1-022d-543f-ceaa-e328457097ec.png)

**Paste GitHub, Bitbucket, GitLab or sourcehut URL here** とプレースホルダーされているテキストエリアにgithub gistのRAWのURLをそのままペーストしてください。

するとこんなURLが得られます。

> https://gistcdn.githack.com/motohasystem/20cf817a5389a7e13fb0a22944930c35/raw/9cfd93907a98cb0b89a52d5a3a567dcbc3673862/01_ncco_sample.json

試しにcurlでヘッダを確認してみます。

```powershell
curl -i https://gistcdn.githack.com/motohasystem/20cf817a5389a7e13fb0a22944930c35/raw/9cfd93907a98cb0b89a52d5a3a567dcbc3673862/01_ncco_sample.json
```

```
HTTP/1.1 200 OK
Date: Fri, 29 Nov 2024 07:03:37 GMT
Content-Type: application/json; charset=utf-8
（後略）
```

Content-Typeヘッダが application/json となっていれば成功です。

# vonageにアプリケーションを作成してNCCOを登録する

ではvonageのコンソールから設定していきましょう。

### アプリケーションの作成

サイドメニューの「アプリケーション」から、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/7bb9eb45-712b-40d6-f6f2-6626ca2470b7.png)

「＋新しいアプリケーションを作成する」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/bc8f4490-4458-30e7-8826-5e8a926dbbf2.png)

わかりやすく実験用ですよという名前をつけて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/7ca38a86-2740-6d1e-8f97-4be94db73aa1.png)

機能の「音声」ラジオボタンを有効化して、回答URLはGETメソッドのまま先程のCDNのURLを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/25ff7c5e-8629-415b-3dcc-ada66fc0326c.png)

画面下の「新しいアプリケーションの生成」をクリックして準備完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/533b59d7-72e8-616d-da3a-ecd7c7e6d59e.png)

ここまででvonage上の「アプリケーション」が作成されました。最後はアプリケーションに電話番号を割りあててあげます。

### 電話番号を割り当てる

さきほど作成したアプリケーションを開いて、画面下の方に並んでいる電話番号を割り当てましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13915/bb6320ca-9d5d-6795-ac92-977c69b4d474.png)

これで準備完了です！　さぁ割り当てた電話番号に電話をかけてみてください。書いたNCCO通りに合成音声で応答してくれましたか？

無事に応答が聞こえてきた方はおめでとうございます！　これで完了です。もしツーッツーッと話し中になってしまっていたとしたら、どこか設定手順に間違いがあったのかもしれません。

例えばgistのURLは編集すると変わってしまいます。登録したURLをブラウザで開いてみて確認するなど、思いつくところをよーく確認してみてください。

ここまで成功できたら、次はNCCOの機能一覧を眺めながら作りたい自動応答システムを妄想してみてください。間違いなく楽しいですよ。

最後まで読んでいただき、ありがとうございました！