1
/
5

【Twilio】AMDで留守番電話を検知する【株式会社ライトコード】

はじめに

入社2年目のみやです。未経験新卒で入社して1年が経ち、他のメンバーのサポートもありプロジェクトの一員としてサービスの開発保守に取り組むことができています。今回は最近実装したTwilioのAMDという留守番電話機能を用いた留守番電話の検知に関してアウトプットも兼ねてご紹介いたします。

前提

  • Twilioを用いて、電話をかける方法を知っていることを前提に説明します
  • コードはphpでの紹介になります(他の言語を使っている方にも参考になると思います)

留守番電話検知の必要性

Twilioを用いることで、プログラムで自動で電話をかけることができます。
電話をかけた相手が電話に出た時と出なかった時で後続の処理を変えたい場合があります。
この時問題になるのが、何も特別な設定をしないと留守番電話が応答(「電話に出ることができません。発信音の後に…」のようなメッセージが流れるあれです)したときと人間が応答した時の判別がつかないことです。
一般的には人間が応答した時と留守番電話が応答した時の処理は分けたいことが多いと思います。
このように人間が応答した時と留守番電話が応答した時を判別したい時に考えられる対処法が主に2つあります。

    • "Human Detection"(人間検知)

応答したら応答者に通話を繋ぐためにキーパットから数字を入力するようお願いするメッセージを流し、入力された数字により判断する方法です。
人間が応答した場合は数字が入力されますが、留守番電話が応答した場合は数字が押されないので判別することができます。

    • "Answering Machine Detection"(留守番電話検知)

Twilioが提供しているAMD(Answering Machine Detection 以後AMD)という留守番電話検出機能を用いて、機械的に応答者が人間か留守番電話かを判断する方法です。
AMDによって、応答者の声のトーンや発話パターンから自動的に判断できます。

開発しているサービスの性質上、AMDを導入することになりましたので、本記事では留守番電話検知の方を紹介します。
本記事では詳しく説明はしませんが、人間検知の方はSay動詞(公式)で数字を入力するようにメッセージを流し、Gather動詞(公式)を用いて、入力された数字を収集して分岐させるイメージです。
簡単にコード例を以下に記載しました。

<?php

use Twilio\Rest\Client;
use Twilio\TwiML\VoiceResponse;

$accountSid = 'XXX';// twilioのAccount SID
$authToken = 'XXX'; // twilioのAuth Token

$twilio = new Client($accountSid, $authToken);

$url = 'XXX';// 入力結果を送信するURL
$response = new VoiceResponse();
$gather = $response->gather(['action' => $url]);
$gather->say('通話をお繋ぎします。数字の1を入力してください。', ['language' => 'ja-JP']);
$response->say('数字が入力されませんでした。通話を終了します。', ['language' => 'ja-JP']);

$receiverNum = 'XXX';// 発信先電話番号
$senderNum = 'XXX';// 発信元電話番号
$twilio->calls->create($receiverNum,$senderNum,["twiml" => $response]);

上記コードの説明
発信先が電話に出ると、「通話をお繋ぎします。...」のメッセージが流れます。メッセージに応じて応答者が数字を入力すると、入力された内容とともに$urlにリクエストが送られます。
リクエスト先でリクエストパラメータ"Digits"から入力された数字を受け取り、受け取った数字に応じて新たなメッセージを流すなど処理を分岐させることができます。
数字が入力されないと、「数字が入力されませんでした。...」のメッセージが流れ、電話が切断するようにしているので、留守番電話が応答した時は自動で電話が終了することができます。

簡単ですが以上が人間検知についての説明でした。では、ここから本題のAMDの説明に入ります。
サービスの内容によっては、人間検知の方が有用になる場合があると思いますので、適宜判断してください。

AMD

前述した通り、AMD(Answering Machine Detection: 公式)はTwilioが提供している留守番電話検出機能です。
公式によると、AMDは以下の2つの側面から成り立っているようです。

    • "tone detection"(トーン検出)

ビープ音やビジートーン(話中音)、ファックス音、トーン信号などを検出する

    • "voice activity detection / human speech detection"(発話区間検出 / 人間発音検出)

人間の発話を周りのノイズから切り離す。また、タイミング、パターン、周波数の情報を分析して検出する。

これらの能力を用いて、応答者の音声を自動的に判別してくれているようです。

AMDを導入するにあたって注意すべき点

AMDを導入する際にいくつか気をつけなければならない点があります。

1. 料金がかかる
AMDを有効にした通話1回あたり、 $.0075の追加料金が発生します(2024/4/16時点の公式参照)。ただし、通話がつながった場合(留守番電話が応答しても)のみ料金が発生するそうです。2024/4/16時点で$.0075は1.16円です。

2. 判定の正確性は100%ではない
公式発表によるとデフォルトの設定だと、正確性は約90%です(公式)。

(3. 判定に少し時間がかかる)
応答者が電話に出てから、平均して4秒以内に判定結果を返します(公式)。開発時に触っていた経験からしても、4秒以内では結果が返ってくる印象です。括弧をつけたのは、非同期的にAMDを判定することができるので、この点は無視することができるからです(後述します)。

AMD導入実装のポイント

ある通話に対して、AMDを有効にしたい場合は、Calls APIのパラメータMachineDetection=>"Enable"と設定して、通話を作成するだけです。この設定だけで、その通話に対してAMD判定を行ってくれます。
AMD判定に関して、主に2つの実装方法がありますので順に紹介していきます。

1. 同期的にAMD判定を行う
AMDの判定結果が出るまで次の動作が行われないような実装例です。

記事の続きは下のリンクをクリック!

https://rightcode.co.jp/blogs/46476


エンジニア積極採用中です!

現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!

採用ページはこちら:https://rightcode.co.jp/recruit

社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life

社長と一杯飲みながらお話しませんか?(転職者向け)

特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk

もっとワクワクしたいあなたへ

現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!

ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。

有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。

  • もっと大きなことに挑戦したい!
  • エンジニアとしてもっと成長したい!
  • モダンな技術に触れたい!

現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?

ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。

  • ライトコードの魅力を知っていただきたい!
  • 社風や文化なども知っていただきたい!
  • 技術に対して熱意のある方に入社していただきたい!

一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。

【コーポレートサイト】https://rightcode.co.jp/

【採用募集】https://rightcode.co.jp/recruit(こちらからの応募がスムーズ)

【wantedlyぺージ】https://www.wantedly.com/companies/rightcode

株式会社ライトコードからお誘い
この話題に共感したら、メンバーと話してみませんか?
株式会社ライトコードでは一緒に働く仲間を募集しています

同じタグの記事

今週のランキング

調枝 寛之さんにいいねを伝えよう
調枝 寛之さんや会社があなたに興味を持つかも