プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

Twilio 試した(1/3):電話(音声通話)機能を使ってみました

今の作業場から引っ越すことになりました。 新しい作業場では、新たにフレッツ光を引く予定です。それはそれでいいのですが、ふとその時、電話とFAXどうしようか?と思い立ちました。

田舎なんで会議やセミナーとかの連絡がまだまだ FAX でやってきます。 なので、 FAX なしで仕事するのは現実的に無理だと思ってます。

素直にフレッツ光にひかり電話をつけて、プリンタ複合機のFAXを使えばいいのですが、なんだかなー、と思ってしまいます(安いとはいえ出費もありますしね)。 そんなこんなことをもやもやと思っていたある日、ふとしたきっかけで、ずいぶんまえに Twilio という電話サービスのAPI(であってる?)があるよと聞いたのを思い出しました。

twilio.kddi-web.com

「FAXも使えるならいいかもねー」と軽い気持ちで調べると、なんと、β扱いですが、FAXが使えるではありませんか!

俄然、試してみたくなりました。もっと調べると、電話番号一つが月額 100円(税抜)なので、FAXと電話で2つ電話番号を持っても、ひかり電話よりも安い! 仕事用の電話番号は一度公開してみたかったのですが、いままでは自宅兼用なので公開するわけにもいかなかったこともあり、電話番号もお安く持てるかも。 Twilio の電話(音声通話)も魅力がありますねー。

ということで、 Twilio を試す理由ができました 。何をやりたいのか整理して、試してみたので、いろいろとメモっときます。今回は3本立てです。

Twilio 試した(1/3):電話(音声通話)機能を使ってみました - プログラマーのメモ書き

Twilio 試した(2/3):FAX 送信を試しました - プログラマーのメモ書き

Twilio 試した(3/3):FAX 受信と通知を試しました - プログラマーのメモ書き

やりたいこと

そんなこんなで、あれこれ思案すると、とりあえず下記のようなことがやりたいことだなとなりました。

  • Twilio で FAX と電話(音声通話)用に電話番号を二つ契約する
  • 電話は常に留守電にしておいて、必要があれば用件を入れてもらう
  • 電話に着信があったら通知(メール?slack?)を飛ばす
  • 留守電聞いて、必要に応じてこちらから折り返し電話する
  • FAXは受信したら、通知を飛ばす
  • FAXの送信は多少手間かかっても送れればOK

いまでも、仕事の電話のやり取りはほぼ携帯でやってるので、大事な電話は基本的に携帯にかかってきます。 で、仕事場にかかってくるのは一時的な電話がほとんどなので、こういう運用でも問題ないかなと思います。 このあたりの事情は個人個人で違うところだと思います。

まずは、電話(音声通話)から試していきます。

Twilio の無料アカウントにサインアップ

一番最初に Twilio の無料アカウントを申し込みます。

この無料アカウントがあると、トライアル用に電話番号が一つ使えるようになり、普通の家の電話や携帯電話に電話を掛けたり、FAXを流したりできます。 まあ、トライアルアカウントなので、事前に通話先の電話番号を登録しておかないといけないとか制限はありますが、テストには十分です。

ということで、無料アカウントを申し込んで、電話番号を一つ発行します。

実は、この電話番号の発行の部分で最初ずいぶんと躓きました。 結論から言うと、無料アカウント申し込み後、コンソールにログインした直後は、何もない状態なので、ここで最初にプロジェクトを作成して、そのプロジェクト内で電話番号を取得する、という作業になります。

ですが、Twilio のチュートリアル的な資料では、そのプロジェクトを作る、という部分が抜けていました。

jp.twilio.com

ま、タイミングが悪かったんでしょうかね。 電話番号を取得して、気を取り直して試していきます。あ、電話番号の取得の説明などはあちこちにあるので省いときます。

(補足)

Twilio さんの名誉のために補足です。無料サインアップのページにある動画を見たら、プロジェクトを作るという話が出てきてました。 先にこっち見てれば気づいたのになー。

電話の着信

Twilio の電話番号は、着信があった場合にどういう動作をするのか?というのをいくつかの方法で指定することができます。 今回は、 TwiML という XML 形式で動作を定義できるものがあるので、それを使います。

TwiML の作成

コンソールから、Runtimeを選び、下のほうにある TwiML Bins を選びます。

f:id:junichim:20181109104927p:plain

表示された画面の+(プラス)のボタンを押すと、TwiMLの作成画面が表示されます。

f:id:junichim:20181109104945p:plain

まずは、FRIENDLY NAME にこの TwiML の名前を入れます。 そして、下側のTwiMLの部分に、着信があったら音声で応答するように動作を書きます。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-JP"> こんにちは </Say>
</Response>

これでOKです。 画面下部に『create』のボタンがあるので、これを押して TwiML の完成です。

電話番号の設定

次に、取得した電話番号にたいして着信があったときに、上記で定義した TwiML が実行されるように指定します。

Phone Numbers を選び、 Active Numbers を選択すると、購入している電話番号の一覧が表示されます。

f:id:junichim:20181109105018p:plain

電話番号をクリックすると設定画面が表示されます。

f:id:junichim:20181109105036p:plain

次のように設定します。

  • 受け付ける着信』:『Voice Calls』
  • 構成内容:『Webhooks, TwiML Bins, Functions, ・・・』
  • 通話着信時:『TwiML』、隣のドロップダウンリストより、さきほど作成した TwiML の名前を指定

簡単ですね。これで準備OKです。

電話をかけてみる

さっそく、電話をかけてみると、着信後『Twilio をご利用いただきありがとうございます。・・・』とういトライアルアカウントですよ、ということを知らせるメッセージが流れます。

そのあと、『こんにちは』とTwiMLで指定した文字が読み上げられます。 音声は合成なので、若干不自然ですがまあ十分かと思います。

着信を録音する

これで TwiMLを使って着信時に動作させる要領がわかったので、次に電話の着信があったら、録音してみたいと思います。

TwiML を下記のようにします。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-JP">録音します。録音が終了したらシャープを押してください。</Say>
  <Record action="https://handler.twilio.com/twiml/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
</Response>

録音の場合、気をつけない点があります。 録音が終了すると、自動的に指定されたURLにリクエストが飛びます(上記の action属性です)。 actionが指定されていない場合のデフォルトは、同じ TwiML です。で、呼び出し後も通話は継続されます。 ということで、同じ録音のTwiMLが呼ばれるため、こちらから切らない限り、何度も録音が繰り返されることになります。

ドキュメントにもしっかり書いてありました。

TwiML™ Voice: <Record> - Twilio

ということで、今回は録音が終わったら電話を切るという TwiML を呼び出すという方法をとります。

こういう電話を切るための TwiML を作成し

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Hangup/>
</Response>

このURLを さきほどの録音用の TwiML のactionで指定しておきます。

録音させてみる

実際に電話をかけると、メッセージがながれます。適当に話してシャープを押すと録音されます。

録音した音声は、コンソールから『Programable Voices』、『通話』、『コールログ』とたどると

f:id:junichim:20181109101839p:plain

のように、ログのところに、メッセージを再生するボタンがあるので、確認できます。 ここをクリックすると、録音メッセージがちゃんと再生され、さきほど録音した自分の声が流れました。

ここまでできれば、あとはactionの先を通知処理のURLにすればよいだけです。 こちらは後述するFAX受信時の通知を流用しようと思うので、まずはそちらを試します。

ということで、FAXのお試しの記事へ続きます。

wsltty 1.9.3 インストール

こちらに書いたように、WSL をインストールしたので、wsltty も再インストールします。

wsltty のインストールそのものは、過去にもやったように、最新版をダウンロードしてきて、 インストーラからインストールすればOKです(この記事を書いた時点で 1.9.3 でした)。

で、今回はまったのが、ショートカットからの起動でした。

最初に起動するとエラーメッセージが表示されます。 エラーメッセージの画面を取り損ねたのですが、下記の issue ページの画像とほぼ同じでした。

Unable to use after updating to 1.8.0 · Issue #64 · mintty/wsltty · GitHub

で、これって、 WSL が複数のディストリビューションを扱えるようになったため、既定のディストリビューションを設定でき、その設置がされていないため表示されるようです。 ちょうど、こちらの記事でそのことが指摘されています。何度かインストール・アンインストールを繰り返していたので、 それが理由かもしれません。

ということで、windows のコマンドプロンプトから

wslconfig /s ubuntu

としてデフォルトを設定してやれば、wslttyのショートカットから問題なく呼び出せるようになります。 あとは、以前の記事と同じく、日本語設定やフォントサイズ設定をしてやればOKです。

にしても、微妙に問題が起きるなー。

WSL (Ubuntu) で apt-get update が失敗する

BoW (Bash on Ubuntu on Windows) が 1709 から Windows Subsystem for Linux になりました。 β版扱いがなくなって、インストールもいろいろと簡単になったようです。

こちらの記事で触れたように、OSを再セットアップしたので、WSLも改めてインストールしてみました。 インストールそのものは、たくさんの紹介記事(例えば、これとか)があるので割愛します。

ここでは、インストール後に、 パッケージを更新しようとしたら、サーバーに接続できなくて、はまったので、そこのところをメモ書きにしときます。

環境

  • Windows 10 Pro, 1803

パッケージの更新エラー

Ubuntuの場合

mor@DESKTOP-H6IEJF9:~$ sudo apt-get update

とすればよいはずですが、

Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
  Connection failed [IP: 91.189.91.23 80]
Err:2 http://archive.ubuntu.com/ubuntu bionic InRelease
  Connection failed [IP: 91.189.88.152 80]
Err:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
  Connection failed [IP: 91.189.88.162 80]
Err:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
  Connection failed [IP: 91.189.91.23 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic/InRelease  Connection failed [IP: 91.189.88.152 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease  Connection failed [IP: 91.189.88.162 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease  Connection failed [IP: 91.189.91.23 80]
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease  Connection failed [IP: 91.189.91.23 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.
mor@DESKTOP-H6IEJF9:~$

のようにエラーになります。 しばらくこのエラーが何のためかわからなくてちょっと苦労しました。

結論から言えば、インストールしているウィルス対策ソフト(Kaspersky Internet Secuity 2019)が原因でした。 でも、なんで苦労したかというと、タスクバーからウィルス対策ソフトを一時停止しても、

f:id:junichim:20181106124112p:plain

だめで、別途設定が必要だったため、なかなかわからなかったという次第です。

エラー対策方法

具体的に、次のようにすればパッケージ更新時のエラーを回避できます。

Kaspersky のアプリケーションを開きます。

f:id:junichim:20181106124405p:plain

左下にある歯車のアイコン(設定)を押し、『詳細』タブを開きます。

f:id:junichim:20181106124512p:plain

表示された画面から『ネットワーク』を選びます。

f:id:junichim:20181106124540p:plain

『ネットワークポート』の『設定したネットワークポートを監視する』の『選択』リンクをクリックします。

f:id:junichim:20181106124627p:plain

ネットワークポート画面で、HTTP(80)を選択して、右クリックして、『無効にする』を選択します。

f:id:junichim:20181106124707p:plain

この状態になればOKです。

WSL(ubuntu)を起動して、 apt-get update をやってみると、問題なく動作します。

mor@DESKTOP-H6IEJF9:~$ sudo apt-get update
Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [8570 kB]
Get:6 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [192 kB]
Get:7 http://security.ubuntu.com/ubuntu bionic-security/main Translation-en [75.2 kB]
Get:8 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [93.1 kB]
Get:9 http://security.ubuntu.com/ubuntu bionic-security/universe Translation-en [51.1 kB]
Get:10 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [1440 B]
Get:11 http://security.ubuntu.com/ubuntu bionic-security/multiverse Translation-en [996 B]
Get:12 http://archive.ubuntu.com/ubuntu bionic/universe Translation-en [4941 kB]
Get:13 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [151 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic/multiverse Translation-en [108 kB]
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [423 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/main Translation-en [159 kB]
Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [7028 B]
Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/restricted Translation-en [3076 B]
Get:19 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [572 kB]
Get:20 http://archive.ubuntu.com/ubuntu bionic-updates/universe Translation-en [153 kB]
Get:21 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [5708 B]
Get:22 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse Translation-en [3176 B]
Get:23 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [2852 B]
Get:24 http://archive.ubuntu.com/ubuntu bionic-backports/universe Translation-en [1200 B]
Fetched 15.8 MB in 55s (284 kB/s)
Reading package lists... Done
mor@DESKTOP-H6IEJF9:~$ 

あとは、apt-get upgrade も問題なく動きます。

mor@DESKTOP-H6IEJF9:~$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
(略)

いや、これわかりにくいですね。 あ、apt-get update が終わったら、元の設定(監視を有効にする)に戻しておきます。

(参考)

下記の記事でやっと解決法を見つけました。

WSL - Apt get update issue · Issue #3367 · microsoft/WSL · GitHub