Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

日本語読み上げ対応。FluentdからTwilioの電話APIを操作する「fluent-plugin-twilio」を使って電話を掛けてみた

Twilio(トゥイリオ)という話題の電話APIサービスをご存じでしょうか。
これをFluentdに組み込むプラグイン「fluent-plugin-twilio」を作成・公開しました。
Boundioという電話APIサービスが廃止となり、行き場を失っていた方にも朗報です。

fluent-plugin-twilio
https://github.com/y-ken/fluent-plugin-twilio
Fluentd Output plugin to make a call with twilio.

Twilioとは

Web APIを利用し、電話を掛けたり、受けることの出来るサービスです。
TwiMLというXML言語を用い、大変自由度の高い動作を定義することが出来ます。
文字列として渡した漢字を含む日本語から、音声合成をして読み上げる機能も備わっています。

Twilioの料金(2013年5月現在)

初期費用はかかりません。
電話番号維持の月額490円に加えて、通話料の実費のみで使えます。

  • 固定電話宛通信料 9円/分
  • 携帯電話宛通信料 19円/分

より詳細な情報は 料金-Twilio for KDDIウェブコミュニケーションズ をご参照ください。

必要な情報

まずはTwilioにサインアップし、以下の情報を控えてください。

  • 発信用の電話番号
    日本であれば +81 を含めた11桁の数字です。
  • ACCOUNT SID(34文字)
  • AUTH TOKEN(32文字)

プラグインのインストール

fluentdのインストール方法に合わせて入れます。

システムインストールの場合

$ sudo gem install fluent-plugin-twilio

td-agentを利用している場合

$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-twilio

設定ファイル

先ほどTwilioのダッシュボードで控えた情報を、設定ファイルに記述します。
from_numberには、登録時に取得した発信用電話番号を指定します。

td-agent.conf (fluentd.conf)

<source>
  type http
  port 8888
</source>

<match notify.call>
  type twilio
  account_sid     ACCOUNT_SID
  auth_token      AUTH_TOKEN
  from_number     +81312345678
</match>

電話を掛ける

さぁ、先ほどの設定をデーモン再起動の上反映させたら、電話を掛けてみましょう。
XXXXXXXXXXの所には、掛けたい電話番号を指定てください。

$ curl http://127.0.0.1:8888/notify.call -F 'json={"number":"+81XXXXXXXXXX","message":"佐藤さん、お昼ご飯の時間ですよ。"}'

いかがでしょうか?
少々片言ですが、十分聞き取れますよね。

プラグイン作成時にハマった所

外部アクセス可能なXMLを指定しないと動かない

Twilioを利用して架電する時、外部からアクセスできるXMLのURLを指定する必要があります。
外部公開サーバが必要となると利用の敷居が高まるため、Twilioがtwimletsというサービスを公式提供しています。今回はそのサービスを利用してこの問題を解決しました。
https://www.twilio.com/labs/twimlets/echo

日本語の読み上げ

いつのまにか対応していました。Sayにlanguage属性を付与することで動きます。
但し現在は男性の声はまだ無く、女性の声のみ対応しているようです。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say voice="woman" language="ja-jp">ようこそ。漢字もOKです。</Say>
</Response>

まとめ

Fluentdと組み合わせて、電話APIをどのように使うかはあなたのアイディア次第!!
例えば電話を用いた実在確認をするのも容易ですし、システム監視・アラートシステムに組み込むのも良いですよね。
新しい使い方を見いだしたら是非、ブログ記事にして広めていきましょう。