DTMFは、電話のキーを押したときの音です。各キーは低い音のグループから1つ、高い音のグループから1つ、合わせて2つの音を同時に鳴らし、受け手のシステムがその組み合わせを数字として読み取ります。名前のとおり「デュアルトーン・マルチ周波数(dual-tone multi-frequency)」です。Bellが1963年にTouch-Toneとして導入し、周波数は今もITU-T勧告Q.23で定められています。
それから60年以上たった今も、DTMFは発信者が口座番号を入力したり、メニューを飛ばしたり、暗証番号を打ったりする手段であり、ソフトウェアが他のソフトウェアの電話メニューを操作する手段でもあります。そして「昨日まで数字が通っていたのに」という問い合わせの定番でもあります。VoIP通話では、トーンの運び方が3通りあるからです。このガイドでは、トーンの仕組み、3つの伝送方法、数字が届かない原因、そして電話に出る側やかける側がAI音声エージェントになったときに何が変わるかを説明します。電話フローを担当するエンジニアとコンタクトセンターのチーム向けです。
(Bad Bunnyの「DtMF」をお探しですか?『DeBÍ TiRAR MáS FOToS』に入っている曲です。ページ違いですが、名盤です。)
DTMFの周波数
キーパッドは4×4のマス目です。行ごとに低い周波数、列ごとに高い周波数が割り当てられ、キーを押すとその行と列の音が同時に鳴ります。
| 1209 Hz | 1336 Hz | 1477 Hz | 1633 Hz | |
|---|---|---|---|---|
| 697 Hz | 1 | 2 | 3 | A |
| 770 Hz | 4 | 5 | 6 | B |
| 852 Hz | 7 | 8 | 9 | C |
| 941 Hz | * | 0 | # | D |
5を押すと770 Hzと1336 Hz、#を押すと941 Hzと1477 Hzが鳴ります。4列目のA〜Dは軍用や通信網の機器で使われたもので、一般の電話機にはほとんどありません。実際に扱うのは0〜9、*、#の12キーです。
1つではなく2つの音を使うのがうまいところです。人の声や音楽が、これらの組から低い周波数1つと高い周波数1つだけに同時にエネルギーを集中させることはめったにないので、デコーダーはキー操作と声を区別できます。規格は2つの音の長さや音量差にも制限を設けており、回線上で誰かが話していても誤検出はまれです。
今の通話でDTMFはどう運ばれるか
銅線の固定電話では、DTMFは線に流れる音声そのものでした。IP通話には3つの方式があり、両端がどれか1つで合意する必要があります。
| 方式 | 数字の運ばれ方 | 失敗しやすい点 |
|---|---|---|
| インバンド音声 | トーンが他の音と同じように通話音声に混ざる | 圧縮コーデックやパケットロスでトーンが歪み、数字の取りこぼしや二重検出が起きる |
| RTPイベント(RFC 4733 / 2833) | RTPストリーム内のtelephone-eventパケットが数字と長さを伝える | 片方がイベントを送り、もう片方が音声しか聞いていない |
| SIP INFO | シグナリング経路上のSIP INFOメッセージが音声とは別に数字を運ぶ | INFOを通さないプロキシや通信事業者、音声とのタイミングのずれ |
RFC 4733は2006年にRFC 2833を置き換えましたが、PBXや通信事業者の設定には今も「RFC 2833」と書かれていることが多くあります。同じ選択肢です。このRFCは存在理由を一文で説明しています。低ビットレートの音声コーデックは「自動認識に十分な精度でこれらのトーンを再現できる保証がない」。ほとんどの電話で使われる8 kHzのG.711はトーンをきちんと運びますが、G.729のような低ビットレートのコーデックではうまくいかないことがよくあります。
安全な既定値はRTPイベントです。どのコーデックでも崩れず、デコードが必要な音ではなく正確な数字そのものを運び、ほとんどの通信事業者とプラットフォームが対応しています。たとえばLiveKitの電話スタックは、DTMFをtelephone-event/8000イベントとして送ります。
DTMFの数字が届かない原因
VoIP通話でキー入力が効かないとき、原因はたいてい次のどれかです。
- 方式の不一致。 通信事業者はRFC 4733のイベントを送っているのに、受け側がインバンド音声しかデコードしていない、またはその逆です。通話の両方の区間で、SDPのオファーとアンサーにあるDTMFモードを確認してください。
- 圧縮された音声。 低ビットレートのコーデックにトランスコードする区間があると、インバンドのトーンが壊れます。その区間をRTPイベントに切り替えるか、G.711のままにしてください。
- 数字の二重化。 ゲートウェイがトーンを音声とイベントの両方で送り、受け側が両方を数えると、「1234」が「11223344」になります。
- 聞くだけのメディアストリーム。 ストリーミングAPIの中には、特定のモードでしかキー入力を転送しないものがあります。たとえばTwilio Media Streamsは、双方向ストリームでのみ
dtmfメッセージを送ります。 - タイムアウト。 発信者が数字の間で間を空けると、システムが途中までの入力を送信してしまいます。Twilioの
<Gather>は既定で5秒待ち、#で送信します。最後に#を押すよう案内し、桁数がわかっているなら指定してください。
一番早いテストは、本物の電話を本番の通信事業者経由で使うことです。電話をかけて全部のキーを押し、同じ数字が続く番号も入力してみてください。ブラウザのソフトフォンやSIPのテスト用クライアントは、公衆網の携帯電話とは違う方式で合意することがよくあります。
DTMFとAI音声エージェント
音声エージェントは「料金については1を押してください」というメニューを多く置き換えつつありますが、キーパッドがなくなることはありません。エージェントは2つの方向でDTMFを扱います。発信者がエージェントに向けてキーを押す場合と、エージェントが他社のシステムに向けてキーを押す場合です。
発信者のキー入力を受け取る
話すより打ちたい人もいますし、口で言うより打つほうが簡単な番号もあります。16桁の口座番号を雑音の多い回線で読み上げるのは音声認識の試験ですが、同じ番号をキーパッドで打てば16回の曖昧さのない入力です。よいエージェントは、メニューなしに同じ会話の中で両方を受け付けます。
キー入力をエージェントでうまく扱うためのルールがいくつかあります。
- 入力が終わるまで待つ。 発信者は会員番号を一気に打ちます。最初の数字のあとにエージェントが返事をすると、残りの入力にかぶってしまいます。Cartesia Managed Agentsは発信者の手が止まるまで数字をまとめ、1つのキー入力のターンとしてモデルに渡します。モデルが「話された」のではなく「打たれた」入力だとわかるようにラベルも付けます。
- キー入力で割り込めるようにする。 話の途中で打ち始めた発信者は、エージェントに黙ってほしいと思っています。Managed Agentsでは、キー入力は発話と同じようにエージェントの返答を止めます。
- 秘密情報はモデルから遠ざける。 カード番号や暗証番号の全桁をエージェント経由で集めないでください。PCIの範囲内にとどまる決済回線へ転送し、トークンや結果だけを戻します。詳しくは銀行向けガイドを参照してください。
- 何を押すか伝える。 「会員番号を入力し、最後に#を押してください」は「会員番号をお知らせください」よりうまくいきます。発信者が両方の方法を使えるとわかるからです。
Managed Agentsでは、Twilio経由の通話とエージェントのWebSocketでキー入力がエージェントに届きます。独自のクライアントをWebSocketにつなぐ場合は、キー入力を1つずつdtmf_inputイベントとして転送します。
{ "type": "dtmf_input", "digit": "5" }
有効な数字は0〜9、*、#です。SIPトランクを含むそれ以外の電話経路では、キー入力に頼るフローを作る前にテスト通話をして、エージェントに届いていることを確認してください。
トーンを送って他社の電話メニューを操作する
もう1つの方向は、エージェントがキーを押す場合です。保険会社や薬局、取引先に電話をかける発信型エージェントは、毎回最初の1分を相手のIVRの中で過ごします。Cartesiaを使って医療機関の代わりに保険者への電話を処理しているSuperDialが、エージェントにIVRの操作機能を組み込んだのもこのためです。
Managed Agentsでは、send_dtmfシステムツールをオンにします(PlaygroundのToolsページではSend keypad tones)。メニューが入力を求めたときに、エージェントが12#のように1つ以上のトーンを送れるようになります。
{
"config": {
"system_tools": {
"send_dtmf": {}
}
}
}
電話メニューは辛抱強い人間向けに作られているので、エージェントにふるまい方を教えておきます。
- 案内を最後まで聞いてから押す。 案内が終わるまで入力を受け付けないメニューは多く、目当ての選択肢は最後にあることがよくあります。
- わかっている経路はプロンプトに書く。 「Acme Healthでは、2、4の順に押し、医療機関のNPIを入力して最後に#を押す」。IDは動的変数で通話ごとに埋められます。
- 操作中は話さない。 回線上の声は、トーンや音声を聞いているメニューを混乱させることがあります。このツールはエージェントが読み上げることなくトーンを送ります。
- 人が出たときに備える。 担当者が電話に出たら、エージェントはメニュー操作から会話に切り替える必要があります。その切り替えをプロンプトに書いておきます。
全体が動くか確かめるには、他の電話フローと同じシナリオを流します。IVRテストのガイドでは、スクリプト化したキー入力経路と、結果でエージェントを評価する方法を説明しています。
Cartesiaの役割
Cartesiaは、音声エージェントを動かす音声モデルを作っています。音声合成のSonicと音声認識のInkです。Managed Agentsはこれらをホスト型のエージェントにまとめ、Cartesiaの電話番号、Twilio、または自社のSIPトランクで電話に応答します。send_dtmfと転送も組み込まれています。エージェントの通話料金は1分あたり0.06ドルで、playgroundで作成して自分の電話からかけてみることができます。
固定のキー入力メニューだけが必要なら、TwilioのようなCPaaSや既存のPBXで十分です。エージェントが真価を発揮するのは、発信者が話すことと打つことを混ぜるとき、あるいは自社の発信が他社のメニューを通り抜けなければならないときです。