[Twilio+Python] Twilio API を使用し電話をかけて音声を流す

[Twilio+Python] Twilio API を使用し電話をかけて音声を流す

Twilio API を使用して Python アプリケーションから電話をかけ音声を流す手順です。 自分で用意したサンプル音声を再生する例として今回は Amazon S3 と AWS Lambda 、 Amazon API Gateway を使用する方法を紹介します。
  • Twilio アカウントが作成済みで Account SID と Account Token がある想定です
  • 自動読み上げ音声を再生し、次に登録した mp3 を再生する例です

参考ページ: https://www.twilio.com/docs/voice/quickstart/python

作業環境

バージョン

OS: Windows 11 (23H2)
Python: 3.11.9
twilio-python: 9.4.6

データと API の準備

音声データと、 Twilio が発信する内容を決めるための TwiML を返す API を用意します。TwiML について詳しくは こちら

まず音声について、今回は mp3 を Amazon S3 に配置して使用します。(公開された URL によってアクセスできるようになっていれば、なんでもよいです。)バケットを作成し、サンプル mp3 をアップロードします。この音声は、自動読み上げ音声のあとに再生する想定です。アップロードが完了したら、公開範囲を適切に設定し、 URL を取得します。

https://****.amazonaws.com/test.mp3

次に、 TwiML 形式の text/xml を返却する AWS Lambda 関数を作成します。 <Say voice="woman">****</Say> で自動読み上げ音声の内容を指定します。 日本語には非対応です。 <Play>****</Play> で再生する音声の URL を指定します。

lambda_function.py

import json

def lambda_handler(event, context):
    xml_response = """<?xml version="1.0" encoding="UTF-8"?>
    <Response>
        <Say voice="woman">Twilio Voice Test</Say>
        <Play>https://****.amazonaws.com/test.mp3</Play>
    </Response>"""

    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "text/xml"
        },
        "body": xml_response
    }

最後に、 Amazon API Gateway で REST API を作成し、 AWS Lambda 関数にアクセスできるようにします。

https://****.amazonaws.com/default/test-twilio-voice
S3 バケットに直接 xml を置く方法での検証結果

S3 バケットに直接 xml を置いてその URL にアクセスする方法も試しましたが、この方法ではエラーとなり正しく再生されませんでした。

原因と考えられるものは下記のとおりですが、詳しくは調査中です。

  • 海外からのアクセス権限の問題
  • GET メソッド以外でも text/xml が正しく返却される必要がある

Python の Twilio ライブラリをインストールする

ローカルに Python プロジェクトを作成し、 pip で twilio-python をインストールします。 twilio-python は Python での Twilio API 操作を簡略化できるライブラリです。

$ pip install twilio

Twilio API を使用し電話をかける

電話をかける Python スクリプトを作成します。

main.py

from twilio.rest import Client

account_sid = "****" # Account SID 
auth_token = "****" # Auth Token 
client = Client(account_sid, auth_token)

call = client.calls.create(
    url="https://****.amazonaws.com/default/test-twilio-voice",  # Amazon API Gateway のエンドポイント URL
    from_="****",  # Twilio で購入した番号
    to="****",  # 発信先の電話番号
)

print(call.sid)

作成したスクリプトを実行します。

$ python main.py

発信先の電話番号に電話がかかり、自動音声が流れ、その後サンプル音声が流れることを確認します。

おわりに

Twilio API を使用することで、簡単に音声発信を実装することができることが分かりました。

前回、 サーバー通知を SMS で自動配信する Web アプリケーションの作成については こちら

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.