如果呼叫者提前输入号码,Asterisk 会挂断

Asterisk hangs up if caller inputs number early

我们有一个提示用户输入的 Asterisk IVR 系统设置

在我们的扩展文件中,我们有以下内容:

[englishprocess]
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,Set(TIMEOUT(digit)=2)
exten => s,n,agi(mstts.agi,"Please enter your ID number followed by pound.",en-US)
exten => s,n,Read(APCODE,,666)
exten => s,n,agi(mstts.agi,"Your ID Number is",en)
exten => s,n,SayDigits(${APCODE})
exten => s,n,agi(mstts.agi,"If this is correct press, 1, otherwise, press, 3",en-US)
exten => s,n,Read(CHECK,,1)
exten => s,n,GotoIf($["${CHECK}" = "3"]?englishprocess,s,1)
exten => s,n,Set(MYADDR=${CURL(webserviceaddress.php?idnum=${APCODE})})
exten => s,n,agi(mstts.agi,${MYADDR},en-US)
exten => s,n,Hangup()

问题是,如果用户在文本到语音提示完成之前输入他们的 ID,或者如果他们在完成说之前按 1

"If this is correct press, 1, otherwise, press, 3"

服务挂了

我们如何才能保持流程不变并接受早期用户输入?

如果无法提前接受用户输入,是否有办法防止挂断并再次提示?

查看这一行:

print "STREAM FILE $file \"$keys\"\n";

https://www.voip-info.org/wiki/view/stream+file

 Usage: STREAM FILE <filename> <escape digits> [sample offset]

Send the given file, allowing playback to be interrupted by the given digits, if any.

Use double quotes for the digits if you wish none to be permitted.

If sample offset is provided then the audio will seek to sample offset before play starts.

Remember, the file extension must not be included in the filename.

之后由于某种原因,它像 waitetexten 一样工作并更改扩展名。我不知道是谁以及为什么将其添加到代码中,您可以询问维护者。

所以只阅读您使用的文件,而不是垃圾邮件问题。

我们切换到 Amazon 的 Polly 服务来生成声音文件,并使用星号方法 Playback(filename) 而不是 extensions_custom.conf 内的 agi() 来阻止呼叫挂断,如果用户过早输入文本。

虽然服务忽略了提前输入的输入,但至少它不会挂断。更好的解决方案是接受早期输入。如果我找到替代方案,我会更新它。

编辑:找到了一个替代的Read() which lets us play soundbites that can be interrupted, so we now have a mix of Read() and playback()调用,可以控制用户可以通过这种方式跳过哪些声音文件。该服务不再挂断用户,我们也不再使用 agi() 电话。

agi(mstts.agi,"text",[language],[intkey],[speed]):

如果用户输入任何内容,脚本将停止并转到该扩展名,则使用 intkey。我不知道它是否适用于您的情况,但值得一试。

exten => _X,1,agi(mstts.agi,"You just pressed ${EXTEN}. Try another one please.",en,any) 尝试在语言后使用 ,any 看看是否可行。我从 https://github.com/zaf/asterisk-mstts

得到了那个例子

Asterisk Dialplan 不能认真使用以创建具有密集 TextToSpeech 的动态服务。

  • 首先,如果您不使用缓存或不使用 MRCP 连接器,延迟可能会成为一个问题。
  • 其次,因为这种方式不支持bargein(https://www.w3.org/TR/voicexml20/#dml4.1.5),你失去了随时与DTMF(或语音)交互的方式。

要创建语音门户,您可能需要一个 VoiceXML 解释器。你有两种方法在 Asterisk 中创建这个服务:Voximal 一个商业应用程序 运行ning 和 Asterisk,或者 VoiceGlue 一个免费的 GPL 死项目(你可以 运行 它在旧的 Asterisk 上)。