最近项目有相关回铃音检测需要,网上找了一圈,各种信息参差不齐,最后也算弄成了。这里直接给出实操教程。
用到的模块是mod_spandsp,默认编译时会预装的,之前检测DTMF的文章里也有用到这个模块。
conf/autoload_configs/spandsp.conf.xml的descriptors节点下面增加中国信号音的相关配置
<!-- China -->
<descriptor name="cn">
<tone name="标准回铃音">
<element freq1="450" freq2="0" min="900" max="1100"/>
<element freq1="0" freq2="0" min="900" max="4100"/>
<element freq1="450" freq2="0" min="900" max="1100"/>
<element freq1="0" freq2="0" min="900" max="4100"/>
</tone>
<tone name="标准忙音1">
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="300" max="400"/>
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="300" max="400"/>
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="300" max="400"/>
</tone>
<tone name="标准忙音2">
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="250" max="350"/>
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="250" max="350"/>
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="250" max="350"/>
</tone>
<tone name="三短一长错误音">
<element freq1="450" freq2="0" min="50" max="150"/>
<element freq1="0" freq2="0" min="50" max="150"/>
<element freq1="450" freq2="0" min="50" max="150"/>
<element freq1="0" freq2="0" min="50" max="150"/>
<element freq1="450" freq2="0" min="50" max="150"/>
<element freq1="0" freq2="0" min="50" max="150"/>
<element freq1="450" freq2="0" min="300" max="500"/>
<element freq1="0" freq2="0" min="300" max="500"/>
</tone>
</descriptor>
450是中国信号音频率,min和 max 和持续时间的最小和最大,可根据实际情况增加更多的顺序,最后一定要以静音结束,不然会一直循环报告信号事件
PS:descriptors节点名后面加上 debug-level="2" 可开启信号音检测详情,可根据详情调整或新增新情况
一般收到媒体事件(CHANNEL_PROGRESS_MEDIA)时,就可以开启检测了
API方式: spandsp_start_tone_detect uuid cn
diaplan方式:bridge里面增加前置参数 {execute_on_media=spandsp_start_tone_detect cn}
一般通道应答后,就可以关掉了,节省资源
API方式:spandsp_stop_tone_detect uuid
diaplan方式:bridge里面增加前置参数{execute_on_answer=spandsp_stop_tone_detect}
当检测到设置的各种tone时,控制台下会输出
DETECTED TONE: TONE_NAME
TONE_NAME就是配置里面相应的NAME(标准回铃音、标准忙音1等等)
相应的产生DETECTED_TONE事件,里面的Detected-Tone变量值就是TONE_NAME
愉快的去玩耍吧。