【问题标题】:asterisk silence detection on connected call已连接呼叫上的星号静音检测
【发布时间】:2016-04-06 00:42:18
【问题描述】:

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

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

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

知道如何实现这个目标吗?

【问题讨论】:

    标签: signal-processing asterisk voip audio-processing


    【解决方案1】:

    星号中没有这样的功能

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

    但是这种拨号方案不适合新手,对不起

    【讨论】:

      【解决方案2】:

      在 Asterisk 13 中,您可以使用TALK_DETECT dialplan 功能:

      概要

      当 Asterisk 检测到静音或正在通话时发出通知 频道。

      说明

      TALK_DETECT 函数在它应用的通道上启用事件 到。这些事件可以通过 AMI、ARI 和可能的其他方式发出 监听内部通知的 Asterisk 模块。

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

      [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 事件,并在其中一个通道停止通话时收到 ChannelTalkingStop 事件。然后,您的外部应用程序可以查看事件之间是否存在 3 秒的间隔,并采取相应的措施。

      【讨论】:

      • 伟大的提示马特,但我需要选择音频块,这里的问题是,监视器文件在呼叫完成之前不可用。我怎样才能得到它?
      • 如果你需要实时的音频,那么直接使用Monitor是不合适的。相反,您可以使用 ChanSpy 将该音频转发到其他位置。如果您想要的是音频文件,您可以将间谍频道发送到 Record 应用程序中。当您的事件使用我提到的谈话检测事件触发时,您将挂断间谍通道并检索它创建的文件。
      • 谢谢马特,这正是我想要的。答案已接受
      • 嗨,马特,有一个问题,我们可以在接收频道上应用 TALK_DETECT 吗?与上述解决方案一样,发起者正在检测中,但不是接收者
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多