Twilioでメッセージ録音システムを構築してみます。
音声メニューに従ってメッセージを録音します。
前提条件
公開サーバ環境
- (参考) Amazon Linux環境の構築
- キーペアの作成 (新規): http://qiita.com/tcsh/items/59303d9506ca7d13f744
- インスタンスの作成 (Public): http://qiita.com/tcsh/items/ae8f1f0d706237327c5a
Webサーバ + PHP環境
- PHP (5.4以上を想定)
- Twilio PHP SDK
(参考) Twilioで番号入力を受け付けてみる (AmazonLinux + nginx + php-fpm):
Twilioのアカウント
- Twilioのアカウントを保有していること。
- Twilioの電話番号
- Twilioの認証情報 (ACCOUNT SID / AUTH TOKEN)
0. 事前準備
0.1. Twilioアカウント情報の設定
Twilioの「はじめよう」画面から以下の情報を取得して変数に格納します。
-
ACCOUNT SID
-
AUTH TOKEN
-
電話番号
TWILIO_ACCOUNT_SID='ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
TWILIO_AUTH_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
TEL_TWILIO_ORIGIN=<Twilioで取得した電話番号>
0.2. ファイル置き場の作成
DIR_HTML='/usr/share/nginx/html'
DIR_TWIML="${DIR_HTML}/sysadm/xml"
DIR_PHP_SCRIPT="${DIR_HTML}/php"
URL_PHP_SCRIPT=$(echo ${DIR_PHP_SCRIPT} | sed "s|${DIR_HTML}||" )
sudo mkdir -p ${DIR_TWIML} ${DIR_PHP_SCRIPT} \
&& ls ${DIR_TWIML} ${DIR_PHP_SCRIPT}
1. メッセージ録音アプリケーションの作成
1.1. アプリケーションディレクトリの作成
DIR_TWILIO_APP="${HOME}/app/twilio-record-app" \
&& echo ${DIR_TWILIO_APP}
APP_NAME=$(echo ${DIR_TWILIO_APP} | sed 's|^.*/||') \
&& echo ${APP_NAME}
mkdir -p ${DIR_TWILIO_APP} \
&& cd ${DIR_TWILIO_APP}
1.2. composerのインストール
cd ${DIR_TWILIO_APP} \
&& mkdir bin \
&& curl -sS https://getcomposer.org/installer | \
php -- --install-dir=bin --filename=composer
#!/usr/bin/env php
All settings correct for using Composer
Downloading...
Composer successfully installed to: /Users/taro/app/twilio-php/composer.phar
Use it: php bin/composer
1.3. Twilio PHP SDKの導入
参考: https://jp.twilio.com/docs/php/install
cd ${DIR_TWILIO_APP} \
&& ./bin/composer require twilio/sdk
Using version ^4.2 for twilio/sdk
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing twilio/sdk (4.2.1)
Downloading: 100%
Writing lock file
Generating autoload files
ls ${DIR_TWILIO_APP}/vendor/twilio/sdk/Services/Twilio.php > /dev/null 2>&1 \
&& echo $?
0
Twilio PHPライブラリファイルの位置を変数に取り込みます。
FILE_LIB_TWILIO="vendor/twilio/sdk/Services/Twilio.php" \
&& ls ${FILE_LIB_TWILIO} > /dev/null 2>&1 \
&& echo $?
0
1.4. Twilioで録音受付をするスクリプトの作成
FILE_PHP_SCRIPT='announce-record.php'
cat << ETX
FILE_PHP_SCRIPT: ${FILE_PHP_SCRIPT}
ETX
cat << EOF > ${FILE_PHP_SCRIPT}
<?php
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
?>
<Response>
<?php echo "<Say language=\"ja-jp\">お客さまは、" . \$_REQUEST['Digits'] . "を押されました。</Say>" ?>
<?php if (\$_REQUEST['Digits'] == '1') { ?>
<Say language="ja-jp">ビープおんのあとに、20秒以内で、ご契約についてのメッセージをおねがいします。終了したら、シャープボタンを押してください。</Say>
<Record
method="GET"
maxLength="20"
finishOnKey="#"
action="${URL_PHP_SCRIPT}/${APP_NAME}/thankyou.php"
/>
<Say language="ja-jp">録音できませんでした。</Say>
<?php } elseif (\$_REQUEST['Digits'] == '2') { ?>
<Say language="ja-jp">ビープおんのあとに、20秒以内で、料金についてのメッセージをおねがいします。終了したら、シャープボタンを押してください。</Say>
<Record
method="GET"
maxLength="20"
finishOnKey="#"
action="${URL_PHP_SCRIPT}/${APP_NAME}/thankyou.php"
/>
<Say language="ja-jp">ろくおんできませんでした。</Say>
<?php } else { ?>
<Say language="ja-jp">ありがとうございました。</Say>
<?php } ?>
</Response>
EOF
cat ${FILE_PHP_SCRIPT}
動作確認をします。
php ${FILE_PHP_SCRIPT} > announce-record.xml \
&& xmllint announce-record.xml --noout \
&& echo $? \
&& rm announce-record.xml
PHP Notice: Undefined index: Digits in /home/ec2-user/app/twilio-record-app/thankyou.php on line 5
PHP Notice: Undefined index: Digits in /home/ec2-user/app/twilio-record-app/announce-record.php on line 6
PHP Notice: Undefined index: Digits in /home/ec2-user/app/twilio-record-app/announce-record.php on line 16
0
1.5. 録音完了後にメッセージを伝える処理するスクリプトの作成
FILE_PHP_SCRIPT='thankyou.php'
MSG_THANKYOU='ごれんらく、ありがとうございました。'
cat << ETX
FILE_PHP_SCRIPT: ${FILE_PHP_SCRIPT}
MSG_THANKYOU: ${MSG_THANKYOU}
ETX
cat << EOF > ${FILE_PHP_SCRIPT}
<?php
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
?>
<Response><Say language="ja-jp">${MSG_THANKYOU}</Say></Response>
EOF
cat ${FILE_PHP_SCRIPT}
動作確認をします。
php ${FILE_PHP_SCRIPT} > thankyou.xml \
&& xmllint thankyou.xml --noout \
&& echo $? \
&& rm thankyou.xml
0
2. Webサーバの公開ドキュメントディレクトリにスクリプトを配置
sudo cp -R ${DIR_TWILIO_APP} ${DIR_PHP_SCRIPT}/ \
&& cat ${DIR_PHP_SCRIPT}/${APP_NAME}/${FILE_PHP_SCRIPT}
3. スクリプトの動作確認
ブラウザでアクセスしてみましょう。
- http://<ホスト>/php/twilio-record-app/announce-record.php
- http://<ホスト>/php/twilio-record-app/thankyou.php
'404 Not Found'が表示されなければOKです。
4. TwiMLファイルの作成
4.1. TwiMLファイルの作成
FILE_TWIML="${APP_NAME}.xml"
MSG_SAY='。ようこそ。ごけいやくの型は、1番とシャープを。料金のおといあわせは、2番とシャープを。そのほかのごようのかたわ、9番とシャープを、おしてください。'
MSG_ERROR="番号がわかりませんでした。ありがとうございました。"
MAX_LENGTH_RECORD='20'
cat << ETX
FILE_TWIML: ${FILE_TWIML}
MSG_SAY: ${MSG_SAY}
MSG_ERROR: ${MSG_ERROR}
MAX_LENGTH_RECORD: ${MAX_LENGTH_RECORD}
ETX
cat << EOF > ~/${FILE_TWIML}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather action="${URL_PHP_SCRIPT}/${APP_NAME}/announce-record.php"
method="GET">
<Say language="ja-jp">${MSG_SAY}</Say>
</Gather>
<Say language="ja-jp">${MSG_ERROR}</Say>
</Response>
EOF
cat ~/${FILE_TWIML}
xmllint ~/${FILE_TWIML} -noout
4.2. Webサーバの公開ドキュメントディレクトリにTwilioMLファイルを配置
TwilioMLを配置場所は、GETで取得できる環境であれば良いのでS3上でもかまいませんが、今回は上記の公開Webサーバ上に配置します。
sudo cp ~/${FILE_TWIML} ${DIR_TWIML}/ \
&& cat ${DIR_TWIML}/${FILE_TWIML}
4.3. TwilioMLファイルへのアクセス確認
ブラウザで http://<ホスト>/sysadm/xml/twilio-record-app.xml にアクセスして、XMLが表示されればOKです。
5. Twilioの設定変更
- ログイン: http://twilio.kddi-web.com
- 画面: 'Voice, SMS & MMS' > '電話番号: 'https://jp.twilio.com/user/account/voice-sms-mms/phone-numbers
- 電話番号のリンクをクリックします。
- ポップアップで「音声通話」タブを選択します。
- Request URLにTwiML(XMLファイル)のURLを貼り付けます。
- 例: http://username:password@<ホスト名>/sysadm/xml/twilio-record-app.xml
- username:passwordには、ベーシック認証のユーザ名(例:sysadm)とパスワード(例:#userPass123)を記述します。
- URLを貼り付けた欄の右のプルダウンから'HTTP GET'を選択します。
- 「保存」ボタンをクリックします。
6. 電話アプリの動作確認
-
Twilioから割り当てられた電話番号に電話します。
- twilio-record-app.xmlに記述したメッセージが流れます。
-
番号を入力します。
-
アナウンスに従って、メッセージを録音します。
- しばらく待つ、もしくは#キーを押します。
-
thankyou.phpに記述したメッセージが流れて、電話が切れます。
7. Twilioのログ確認
- ログイン: http://twilio.kddi-web.com
- 画面: https://jp.twilio.com/user/account/log/calls
- 録音データが存在することを確認します。