mozikeru.com

和歌山在住。1児の父。IoTエンジニア。各種ご相談承ります。

Twilioでインバウンド着信の冒頭に無音を挿入したい

Twilioを使ってインバウンドの電話を受けてメッセージを発話する際にメッセージの先頭に無音をはさみたかったのですが、当初考えていた方法では想定通りの動作をせず、ちょっと戸惑いました。その後の解決策と合わせてメモを残しておきます。
 
発話時の無音自体は、TwiMLでは<Pause length="秒数"/>を使うことで実現できます。
今回の要件では電話がかかってきて最初のメッセージ発話の前に数秒の無音を挟むことで「貯め」を作り、利用者の注意を引きつけたかったので、TWiMLの動詞の先頭(<Response>のすぐあと)にPauseを入れました。
 
イメージとしてはこんな感じです。
【最初の実装】
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Pause length="3"/>
        <Say language="ja-jp" loop="0">メッセージ内容</Say>
</Response>

 

Say動詞の前に3秒のPauseを入れることで、着信後3秒の無音が入った後にメッセージ内容が発話される想定です。


ところが、上記のTWiMLで実装した番号に電話をかけると、電話が繋がってから無音が発生するのではなく、コール音自体が長く鳴ってしまいました。つまり電話が繋がるまでの時間がPauseのlength秒分伸びてしまいます。
 
色々悩んだ末以下の実装で一応要件通りの動作を実現することが出来ました。
 
【採用した実装】
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp"></Say>
    <Pause length="3"/>
        <Say language="ja-jp" loop="0">メッセージ内容</Say>
</Response>
Pauseの前にメッセージの無い、空のSayを一つ挟んでいます。


確かにTwiMLのPauseの説明を見てみると、下記の記述があります。
「<Pause> が TwiML 文書の最初の動詞である場合、Twilio は指定された秒数待機した後、通話に応答します。」 
なるほど、そういう事なんですか。。


とりあえず、TwiMLの冒頭での待機を実装する場合、Pauseの前に空の(実際には動作しない)動詞を挟むことで回避出来るようです。
 
また、逆にPauseを敢えて先頭に持ってくることでコール音を長くする事が出来る事もわかりました(そんな要件に出くわすことが今後あるのかは不明ですが…)