2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ABCD+Wトーン対応!DTMFトーンの送受信をNode.jsで試してみた

Last updated at Posted at 2025-05-20

2024年5月、TwilioからDTMF(プッシュ信号)に関するアップデートが発表されました。

Changelog: DTMF Support for A, B, C, D, and W tones

これにより、Play動詞で A〜Dw/W のDTMFトーンが正式にサポートされるようになりました。 これまで 0〜9*# しか使っていなかった方にとっては、思わぬ発見かもしれません。
実は自分もTwilioを5年以上使っていますが、このDTMFに数字以外の入力ができることを全く知りませんでした。今回のアップデートをきっかけに、実際に数字以外のDTMFトーンを送受信するサーバーをExpressで構築し、試してみました。
ちなみに、2025年5月20日時点のTwilio Programmable Voice Javascript sdkでは未対応です。
現時点で対応しているのは、

  • 動詞の digits 属性(TWIML)
  • の sendDigits 属性(TWIML)
  • Call Resource の SendDigits パラメーター(REST API)
  • Twilio Studio の Say/Play ウィジェット内の Digits
  • Twilio Studio の Make Outgoing Call ウィジェット内の Send digits  

構成と目的

今回は以下のようなシンプルな構成で検証を行います。

  • Twilio APIから電話を発信(curl)
  • /make-call エンドポイントでDTMFを自動送信
  • /incoming-call 側でDTMFの入力を受け取り、ログに出力

事前準備

  • Twilioアカウント
  • 電話番号を2個購入済み
  • Node
  • ngrok
  • curl

Node.js (Express) 実装

コード

まずはExpressサーバーをセットアップします。

npm init -y
npm install express body-parser
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));

// Twilioからの発信時にDTMFトーンを自動送信
app.post('/make-call', (req, res) => {
  res.type('text/xml');
  res.send(`
    <Response>
      <Pause length="3"/>
      <Play digits="0923712w3WABCD#"/>
    </Response>
  `);
});

// 着信時にDTMF入力を促す
app.post('/incoming-call', (req, res) => {
  res.type('text/xml');
  res.send(`
    <Response>
      <Gather action="/dtmf-handler" method="POST" numDigits="20" finishOnKey="#">
        <Say>DTMFトーンを入力してください。最後にシャープを押してください。</Say>
      </Gather>
      <Say>入力がありませんでした。</Say>
    </Response>
  `);
});

// DTMFを受信した際の処理
app.post('/dtmf-handler', (req, res) => {
  const digits = req.body.Digits;
  const callSid = req.body.CallSid;
  console.log(`[DEBUG] CallSid: ${callSid}, DTMF received: ${digits}`);
  res.type('text/xml');
  res.send(`
    <Response>
      <Say>入力されたDTMFは ${digits} でした。</Say>
    </Response>
  `);
});

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

サーバーの起動

このサーバをnpmで起動します。

npm start or node server.js

ngrokを使って公開します。

node http 3000 --subdomain=testsubdomain

Twilio側の設定

次にTwilioコンソールで着信する電話番号に、上記のサーバで構築したTwiMLのURLを設定します。

  1. Twilioコンソールにアクセス
  2. Phone Numbers→Manage→Active Numbersで今回受電で使う電話番号をクリック
  3. Configureタブ
  4. A Call Comes inをWebhookで設定、URLにNgrokのURL+サーバで作った「/incoming-call」を入れる
htttps://<subdomain>.jp.ngrok.io/incoming-call

SCR-20250520-nqnm.png


電話を発信

curlコマンド

TwilioのREST APIを使って電話を発信し、指定エンドポイントにアクセスさせます。

curl -X POST https://api.twilio.com/2010-04-01/Accounts/<account_sid>/Calls.json \
  --data-urlencode "To=+8150XXXXXXX" \
  --data-urlencode "From=+8150YYYYYYY" \
  --data-urlencode "Url=https://your-ngrok-url.ngrok.io/make-call" \
  -u <account_sid>:<your_auth_token>
パラメータ 説明
To 電話の架電先番号 +8150XXXXXXX(Twilioの電話番号#1)
From 電話のかけ元番号 +8150YYYYYYY(Twilioの電話番号#2)
Url TwimlのURL https://<subdomain>.jp.ngrok.io/make-call

DTMFトーンの種類と意味

トーン 説明
A〜D 特殊な音声通信機器制御、レガシーPBXや軍用装置向けに設計されたトーン
w 0.5秒の待機を意味するポーズ
W 1秒の待機を意味するポーズ

これらのトーンを組み合わせることで、より複雑なIVRシナリオや、レガシー機器とのインターフェースを構築することが可能になります。


実行結果

DTMFトーンを送信後、受信側のログに以下のように表示されます。

[DEBUG] CallSid: CAxxxxxxxxxxxxxxxx, DTMF received: 09237123WABCD#

また、音声ガイダンスで「入力されたDTMFは 09237123WABCD# でした」と返されます。


使用頻度とユースケースについて

Twilioユーザーの多くは 0〜9*# のトーンで十分なケースがほとんどです。
しかし、以下のような場面では A〜Dw/W トーンが必要になるそうです。

  • 特殊なIVRメニューの制御
  • 古いPBXや独自開発の音声装置との接続
  • ハードウェアデバイスやゲート制御機器へのコマンド送信
  • システムの応答速度に合わせたDTMF送信の調整

実際の使用頻度は高くないかもしれませんが、「既存システムとの連携」や「特定のプロトコル要件」に直面したときに、このアップデートが非常に重要になる場面があります。

もしあなたの業務で、レガシーIVRやハードウェア制御機器と接続するような場面があれば、今回のアップデートが突破口になる可能性があります。


まとめ

  • TwilioがPlay動詞でのABCD/Wトーン送信に対応
  • Node.js + Expressで送受信の実装は容易
  • 特定の業務や既存システムとの接続において、この機能が有効に活用できる

今まで使ったことがない方も、検証環境でぜひ一度試してみることをおすすめします。


関連リンク

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?