如果没有人接听,请转发twilio呼叫语音邮件

时间:2015-12-08 00:12:23

标签: twilio

我喜欢在我的twilio设置上提出一些建议,以解决我试图解决的问题。

概述:

我们系统中的每个用户都配置了一个twilio电话号码,可以发送给任何人与他们联系。

如果personA通过配置的twilio电话号码联系我们系统中的用户(userB),我们希望将它们与userB连接(如果可用)。如果userB不可用,我们希望将personA指向语音邮件。换句话说,我们希望确保我们能够控制语音邮件体验和语音邮件本身,以便我们可以将其存储在我们的系统中,而不是将语音邮件留在用户B的设备上。

当前解决方案:

  • PersonA的来电被添加到队列中。同时,系统拨出userB。
  • 要求UserB按1接听电话。从UserB显式输入的原因是检测UserB是否可用于应答呼叫。 (例如,如果对UserB的呼叫转到他们的个人语音邮件,则不会发生明确的数字输入,告诉我们他们无法回答。)
  • 如果UserB未在指定的时间内输入1,则会将PersonA定向到语音信箱。
  • 如果UserB按1,则修改对UserB的调用(通过twilio rest api)以拨打PersonA所在的队列以连接UserB和PersonA。

当前解决方案的问题:

在此解决方案中,何时转移personA对语音邮件的呼叫的控制权由对UserB的调用结果控制,这似乎不是最理想的。例如,我们可能根本无法呼叫UserB。在这种情况下,personA将无限期地留在队列中。

在这种情况下我想要发生的事情是轮询队列中的人员A以检查队列中的时间,并且如果队列中的时间大于阈值,则将呼叫转移到语音邮件。但是,似乎不可能准确地知道呼叫在队列中无人值守的时间,因为:

  • 即使主叫方正在收听等待音乐,队列中的通话状态仍为in-progress。这与PersonA的电话回复的状态相同。

  • 如果UserB拨入队列,则当桥接方断开连接时,呼叫才会出列,而且PersonA呼叫的呼叫状态不会发生变化,表明他们已连接到UserB。

问题

  • 我是否理解为什么我无法轮询呼叫队列以将呼叫转移到语音邮件是否正确?
  • 我是否应该将PersonA召集到会议中,如果UserB可用,请将他/她连接到PersonA所在的会议?
  • 如果我使用会议设置,那么最简单的方法是检测PersonA在会议中等待的时间,以便在UserB从未加入会议时将PersonA的呼叫转移到语音邮件?< / LI>

1 个答案:

答案 0 :(得分:14)

Twilio开发者传道者在这里。

我认为你可能在队列中有一些过于复杂的东西。您实际上可以提供消息并在原始呼叫中收集,而无需自己拨出电话并最终连接两个电话。

以下是:

您的来电TwiML应如下所示:

<Response>
  <Dial action="/call_complete" timeout="30">
    <Number url="/whisper">
      ONWARD DIAL NUMBER
    </Number>
  </Dial>
</Response>

在连接两个呼叫之前,为<Number>名词提供URL将播放该URL的TwiML内容。您可以在此处使用<Gather>来确保用户已接听电话,而不是他们自己的语音信箱系统:

/whisper

<Response>
  <Gather numDigits="1" timeout="10" action="/gather_result">
    <Say voice="alice">You are receiving a call, press any key to accept</Say>
  </Gather>
  <Hangup/>
</Response>

/gather_result需要确定是否按下了某个键。如果它被按下,那么我们将进入调用,我们可以使用空响应,因为这会将控制权返回到原始<Dial>。如果没有按下任何数字,我们会挂断此端,这会导致原始<Dial>完成并指向其action属性。 (我不确定你使用的语言是什么,但这里有一些Rubyish伪代码)

/gather_result

<Response>
  if params["Digits"] and params["Digits"].empty?
    <Hangup/>
  end
</Response>
/call_complete操作结束后,

<Dial>将被调用。如果此时呼叫状态为“已完成”或“已应答”,则用户已接听电话并正确回应耳语,我们可以挂机。如果是其他任何内容,我们会将呼叫重定向到我们的语音邮件记录器。

/call_complete

<Response>
  if params["DialCallStatus"] == "completed" or params["DialCallStatus"] == "answered"
    <Hangup/>
  else
    <Say voice="alice">The call could not be answered this time, please leave a message</Say>
    <Record action="/record_complete" />
  end
</Response>

最后,您的/record_complete操作可以使用录制网址执行任何操作并挂断电话。

/record_complete

<Response>
  <Hangup/>
</Response>

这可以通过Twimlets实现,如in this blog post所述。如果这有帮助,请告诉我。

相关问题