
AWS LambdaでPythonを使ったプロンプト呼び出しによる音声合成
所要時間:2 分
ネクスモ Voice APIは、起動可能な通話シナリオに大きな柔軟性を提供しますが、これを実行するには、多くの場合、APIと複数のインタラクションを行う必要があります。シナリオによっては、ビジネスロジックから1つのAPIコールを呼び出すだけで、Voice APIとの一連のインタラクションを呼び出したい場合があります。これは、サーバーレスアプリケーションを構築し、それを呼び出してVoice APIとのインタラクションを処理させるのに理想的なシナリオです。
この例では、受信者にメッセージを再生し、キーパッドに数字を入力するよう依頼する音声合成テキストコールのかけ方を紹介します。これは、Nexmoが提供していた非推奨のTTSプロンプトAPIに非常に似ていますが、より柔軟性があります。
現在のところ、アプリケーションは電話番号を呼び出し、最初のメッセージを再生し、ユーザーが指定したピンを入力するのを待ちます。
3回目の試行で正しいPINを入力できなかった場合、通話はメッセージなしで終了する。
PINの入力に成功すると、別のメッセージが流れ、通話が終了します。通話が終了すると、Webhookに通話のトランザクションIDとPIN入力の結果がコールバックされます。
前提条件
このチュートリアルでは、次のことを行う:
AWSアカウントが必要(Lambdaの無料ティアで実行できる)
以下の AWS CLIツールと Chaliceがインストールされ、設定されていること
Nexmo Voice Applicationsを作成し、秘密鍵をローカルファイル名
private.keyという名前のローカルファイルに保存します。
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.
配備
自分のAWSアカウントに機能をデプロイする:
まず、Gitリポジトリをローカル・マシンにクローンする:
git clone https://github.com/nexmo-community/voice-ttsprompt-lambda.git
フォルダに切り替える:
cd voice-ttsprompt-lambda
機能をAWSにデプロイする:
chalice deploy
関数がデプロイされると以下の出力が表示されるので、実行ポリシーを追加することを「Y」で確認してください。
Initial creation of lambda function.
Updating IAM policy.
The following actions will be added to the execution policy:
dynamodb:PutItem
logs:PutLogEvents
dynamodb:CreateTable
logs:CreateLogStream
dynamodb:GetItem
logs:CreateLogGroup
Would you like to continue? [Y/n]: y
Creating deployment package.
Initiating first time deployment...
Deploying to: api
https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/最後の行は、新しくデプロイした関数のベースURLです。 chalice url
セットアップ
最初のデプロイ時にAWSの設定のほとんどをChaliceが行ってくれるので、設定する必要はほとんどありません。ただし、通話状態を保存するためのDynamoDBテーブルを作成する必要があります。これは、関数の /setupへのHTTP GETリクエストで行います。
呼び出し
新しい関数を呼び出すには、ベースURLへのHTTP POSTリクエストの最後に /callを末尾につけることで、新しい関数を呼び出すことができます。以下のパラメータを渡す必要があります。
| Parameter | Value | Example |
|---|---|---|
| to | The number to be called in e.164 format | 14155550100 |
| from | The Nexmo number on your account to use for CallerID | 14155550101 |
| text | The initial message played to the called party | "Enter your pin" |
| pin_code | The PIN that the user should enter | 1234 |
| callback | The URL on your server where the result should be sent | http://example.com/callback |
| callback_method | The HTTP method used for your callback webhook | GET or POST |
| bye_text | The message to be played on a successful pin entry | "Thank you, goodbye" |
| failed_text | The message to be played on an incorrect pin with retry | "Incorrect, try again" |
認証
LambdaアプリケーションはNexmoの認証情報を保持せず、関数を呼び出すときに渡され、そのリクエストにのみ使用されます。
私たちのライブラリを使ってNexmo JWTを生成し、それをリクエストヘッダに入れる方法と、秘密鍵とapplicationIDをcURLリクエストの一部として投稿する方法です。JWT認証方法を使用することをお勧めします。
cURL (秘密鍵認証)
関数をデプロイしたときに指定されたURLと一致するように編集する。
curl -X "POST" "https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/call" \
--data-urlencode "private_key=`cat private.key`" \
-d "app_id=684027bc-a2e7-48b1-b4bd-adc02324e09c" \
-d "to=447970513607" \
-d "from=447520616161" \
-d "text='Enter the PIN'" \
-d "pin_code=1234" \
-d "callback=https://2bwz8nkbmfgc.runscope.net/callback" \
-d "callback_method=post" \
-d "bye_text='Thank You'" \
-d "failed_text='Try again'" パイソン(JWT)
関数をデプロイしたときに指定されたURLと一致するように編集してください。
Nexmo pythonライブラリが必要です。 pip install nexmo
# you need the Nexmo client lib to generate your JWT
import nexmo
import requests
client = nexmo.Client(application_id=APP_ID, private_key=PRIVATE_KEY, key='dummy', secret='dummy')
headers = client._Client__headers()
data = {
'to': 'TO_NUMBER',
'from': 'CALLERID_NUMBER',
'text': 'Enter the pin',
'pin_code' : '1234',
'callback' : 'https://example.com/callback',
'callback_method' : 'post',
'bye_text' : 'thankyou',
'failed_text' : 'try again'
}
response = requests.post("https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/call", json=data, headers=headers)どちらのメソッドでも、応答はトランザクションID('tid')を含むJSONオブジェクトとなり、これが呼び出しの参照となり、結果を含むコールバックで使用される。
回答例 { "tid": "6a2827c9-4c68-46fc-b179-115f055dc0eb" }
コールバック
呼び出しが完了すると、Lambda関数は呼び出し時に指定したWebhookにコールバック要求を行う:
| Parameter | Value | Example |
|---|---|---|
| to | The number called in e.164 format | 14155550100 |
| tid | The transaction ID | 6a2827c9-4c68-46fc-b179-115f055dc0eb |
| status | The result | ok |
次のようなステータス値が返される可能性がある:
ok通話が完了し、ユーザーが正しいPINを入力した場合。failed通話は完了したが、正しい暗証番号の入力に失敗した。error通話が完了しませんでした
次のステップ
このコードを修正して、ユーザーがピンを再試行する回数などのパラメータを調整することができます。 voiceNameを変更することもできます。
各呼び出しの詳細はAWS DynamoDBに保存されますが、要件に応じてこれらのエントリを時々クリーンアップすることができます。
