2017-05-24 89 views
1

我们有一个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话说完

“如果这是正确按1,否则按3”

服务挂断。

我们如何保持过程相同并接受早期用户输入?

如果早期接受用户输入是不可能的,有没有办法防止挂断并再次提示?

+0

没有你的agi脚本的代码,你无法回答你的问题。 – arheops

回答

0

我们切换到亚马逊的波莉服务来产生声音文件和使用,以星号方法Playback(filename)代替agi()extensions_custom.conf内从挂断,如果用户输入文本过早停止呼叫。

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

编辑:找到一个替代Read()它可以让我们玩的是可以打断soundbites,所以我们现在有Read()playback()呼叫的组合和可以控制声音文件可以通过这种方式,用户可以跳过。该服务不再挂断用户,我们不再使用agi()来电。

-2

了解这一行:

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. 

之后,它由于某种原因,工作像waitexten和变革的延伸。我不知道是谁和为什么添加到代码中,你可以问维护者。

因此,只需阅读您使用的文件,而不是垃圾邮件问题。

+0

有没有必要有任何经验,只需要一般的编程经验来阅读代码。完整的命令列表以及他们通过此页面可以获得的功能https://www.voip-info.org/wiki/view/Asterisk+AGI – arheops

+0

正确设置 - 删除所有代码,设置变量,改为使用该变量问题之前你的阅读命令。这样,即使用户不听信息,你也会得到结果。 – arheops

+0

我的意思是流式传输以及之后的所有其他人员。我很抱歉,我不是在为你做你的工作。您至少已阅读过有关AGI的那一页。 – arheops

-1

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

-1

得到的那个例子Asterisk Dialplan不能认真地用密集的TextToSpeech创建动态服务。

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

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