需求说明

含有嘟嘟音的录音.wav
这一段录音中含有忙音, 需要在呼叫的时候实时检测出来

解决方案1: 使用tone_detect检测忙音

在拨号方案中增加如下语句:

  1. <action application="tone_detect" data="busy 450 r 0 hangup 'normal_clearing' 4"/>

如果看到下面的日志,证明忙音检测生效了:

2019-04-09 20:45:45.705350 [DEBUG] switch_ivr_async.c:3625 TONE busy HIT 1/4 2019-04-09 20:45:46.405304 [DEBUG] switch_ivr_async.c:3625 TONE busy HIT 2/4 2019-04-09 20:45:47.065338 [DEBUG] switch_ivr_async.c:3625 TONE busy HIT 3/4 2019-04-09 20:45:49.505367 [DEBUG] switch_ivr_async.c:3625 TONE busy HIT 4/4 2019-04-09 20:45:49.505367 [DEBUG] switch_ivr_async.c:3631 TONE busy DETECTED

但是该方案只是根据单一频率进行检测, 会存在误判情况. 比如会将拨号音当作忙音给检测出来, 从而导致误挂断.
如果需要更加精确的判断, 则需要使用spandsp中的频率检测.

解决方案2: 使用spandsp检测忙音

参考网址: https://blog.csdn.net/HanJiezZ/article/details/106921979

下面的内容部分从上面的网址摘抄, 感谢原作者, 下面是他的版权声明: 版权声明:本文为CSDN博主「HanJiezZ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/HanJiezZ/article/details/106921979

spandsp配置中国标准忙音

  1. <descriptor name="cn">
  2. <tone name="cn_busy_tone">
  3. <element freq1="450" freq2="0" min="300" max="400"/>
  4. <element freq1="0" freq2="0" min="300" max="400"/>
  5. <element freq1="450" freq2="0" min="300" max="400"/>
  6. <element freq1="0" freq2="0" min="300" max="400"/>
  7. <element freq1="450" freq2="0" min="300" max="400"/>
  8. <element freq1="0" freq2="0" min="300" max="400"/>
  9. </tone>
  10. </descriptor>

开启和关闭忙音检测

在振铃阶段即可开启忙音检测, 命令如下:
spandsp_start_tone_detect uuid cn

在接通后, 即可关闭忙音检测:
spandsp_stop_tone_detect uuid**

如果需要通话全程都进行忙音检测, 则不需要执行关闭命令.

控制台输出

当检测到设置的各种tone时,控制台下会输出
DETECTED TONE: TONE_NAME
TONE_NAME就是配置里面相应的NAME(cn_busy_tone)
相应的产生DETECTED_TONE事件,里面的Detected-Tone变量值就是TONE_NAME

事件输出

当检测到忙音之后, 会获取到相应的DETECTED_TONE事件,如下:

  1. Detected-Tone: cn_busy_tone
  2. Event-Name: DETECTED_TONE
  3. Core-UUID: 5859d2de-ccec-11dc-aab0-69b2875ec123
  4. FreeSWITCH-Hostname: abacus
  5. FreeSWITCH-IPv4: <myip>
  6. FreeSWITCH-IPv6: 127.0.0.1
  7. Event-Date-Local: 2008-01-27%2017%3A19%3A30
  8. Event-Date-GMT: Sun,%2027%20Jan%202008%2016%3A19%3A30%20GMT
  9. Event-Date-timestamp: 1201450770979522
  10. Event-Calling-File: switch_ivr_async.c
  11. Event-Calling-Function: tone_detect_callback
  12. Event-Calling-Line-Number: 1098
  13. Unique-ID: xxxyyyzz

该事件仅供参考, 是根据官网信息手工改造而成, 不是真实事件, 会存在一定误差.

参考资料

拨号音:(450Hz,-10±3dBm0,连续)——“嗡…”的连续音。
忙音:(450Hz,-10±3dBm0,0.35s on/0.35s off)——“嘟,嘟,嘟…”短促音(响0.35秒,断0.35秒)。
拥塞音:(450Hz,-10±3dBm0、0.7s on/0.7s off)——这是一种“嘟,嘟…”的短音(响0.7秒,音隔0.7秒)。拥塞音有点像忙音,但比忙音声音要长,它表示程控交换机因某种原因机线拥塞不通。
呼入等待音:(450Hz,-20±3dBm0、0.4s on/4.0s off)——在用户登记了“呼叫等待”服务项目后,如果该用户正与对方通话时,又有第三者呼叫该用用,则该用户在受话器中会听到一种微弱的信号音,这种信号是“嘟…”的短促音(响0.4秒,音隔0.4秒,再响0.4秒)。它表示有第三者在呼叫,提醒该用户是否要与第三者通话。
特种拨号音: (450Hz,-10±3dBm0,0.4s on/0.04s off)这是一种“嘟,嘟…”的一短一长的声音,当用户的电话中登记了某种程控电话服务项目后,摘机听到的拨号音就是这种特种拨号音,用以提醒该用户。这种拨号音不妨碍该用户打电话,只要在规定产时间(5秒)内拨号即可。
二次拨号音:(400Hz,-10±3dBm0、连续)
回铃音:(450Hz,-10±3dBm0,1.0s on/4.0s off)——“嘟,嘟…”的断续音(响1秒,断4秒)表示用户拨叫的对方电话已接通,正在振铃。
空号音:(450Hz,-10±3dBm0、0.1s on/0.1s off/0.1s on/0.1s off/0.1s on/0.1s off/0.4s on/0.4s off)--“嘟、嘟、嘟-”的450赫的三短一长音(短音为0.1秒,间断0.1秒,长音为0.4秒)
三方通话提醒音:(950Hz,-20±3dBm0、0.4s on/10.0s off)
催挂音:(950HZ 0.4dB)——当用户用完电话,没有挂机或话机手柄没有放好时,程控电话局会发出一种由小逐渐变大的连续音(950HZ),提醒该用户把话机挂好。