连接呼叫上的星号静音检测

asterisk silence detection on connected call

如果我的问题对你没有意义,提前道歉。 我是 asterisk 的新手,我想做的是编写一个拨号计划,它可以连接 2 个软 phone 端点(VoIP 客户端端点),然后尝试检测正在进行的通话中的静音。我可以使用以下拨号计划拨打电话

exten = 100, 1, Answer() 
same =  100, n, Monitor()
same =  100, n, Dial(SIP/client1,15) 

当我拨 100 时,它会呼叫 client1,我正常接收到,现在通话正在进行,现在我将两端的麦克风(呼叫者和被呼叫者)静音,呼叫仍在进行。每个频道的录音正在正确创建。现在我需要在检测到静音 3 秒时触发一个事件,并且我需要获取该音频块直到静音。

知道如何实现这个 objective 吗?

asterisk中没有这样的功能

您可以创建自己的 c/c++ 应用程序或使用 ChanSpy 附加另一个通道并使用 SilenceDetect 命令 + UserEvent 命令。

但是这样的拨号方案不适合新手,抱歉

在 Asterisk 13 中,您可以使用 TALK_DETECT 拨号规则功能:

Synopsis

Raises notifications when Asterisk detects silence or talking on a channel.

Description

The TALK_DETECT function enables events on the channel it is applied to. These events can be emited over AMI, ARI, and potentially other Asterisk modules that listen for the internal notification.

请记住,TALK_DETECT 仅查找来自来自 通道设备端(即读取端)的音频。因此,如果我们想为两个通道引发事件,我们需要将其应用于每个通道。例如,以下将通过在出站通道上使用 pre-dial 处理程序将通话检测应用于两个通道:

[default]

exten => 100,1,Answer()
 same => n,Set(TALK_DETECT(set)=)
 same => n,Monitor()
 same => n,Dial(SIP/client1,15,b(default^apply_talk_detect^1)) 
 same => n,Hangup()

exten => apply_talk_detect,1,NoOp()
 same => n,Set(TALK_DETECT(set)=)
 same => n,Return()

使用这个,当其中一个频道停止通话时,您应该得到 AMI 事件 ChannelTalkingStart event when talking is detected, and ChannelTalkingStop 事件。然后,您的外部应用程序可以查看事件之间是否存在三秒间隔,并采取相应的措施。