
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という名前のローカルファイルに保存します。
配備
自分の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に保存されますが、要件に応じてこれらのエントリを時々クリーンアップすることができます。