当前位置: 首页 > article >正文

Freeswitch使用media_bug能力实现回铃音检测

利用freeswitch的media bug能力来在智能外呼时通过websocket对接智能中心的声音检测接口,来实现回铃音检测,来判断用户当前是否已响应,拒接,关机等。

1.回铃音处理流程

2.模块源码目录结构

首先新建一个freeswitch的源码的src/application目录下新建一个子目录mod_ringback_check,目录结构如下:

     mod_ringback_check:

            conf/autoload_configs/ringback_check.conf.xml

           mod_ringback_check.h

           mod_ringback_check.cpp --主要的media_bug代码

          light_websocket_client.cpp --用于websocket链接

          light_websocket_client.hpp

         Makefile --c++编译文件

        test_ringback_press.sh -->压测脚本

3.源码解析

3.1配置文件(ringback_check.conf.xml)

 首先将配置文件放置在模块的conf/autoload_configs目录下,这样安装时,会将该文件复制到freesswitch的conf/autoload_configs目录下。

<configuration name="ringback_check.conf" description="mod_ringback_check configuration">

<settings>

  <param name="ai_center_url" value="wss://xxx.xxx.xxx:8080/xxxx"/>

</settings>

</configuration>

通过xml配置文件的方式,配置智能中心对应的websocket地址,加载ringback_check模块时将ai_center_url读取到对应的全局静态变量中。

3.2 头文件(ringback_check.h)

typedef struct {

        CWebsocket*      cli; //websocket对象

        switch_core_session_t *session; //freeswitch session对象

        vector<uint8_t> audio_data; //发送给智能中心的语音流数据

        int data_len;  //数据流长度

 } ringback_check_info_t;

static struct {

    char *ai_center_url; //智能中心websocket地址

} global;

定义全局struct对象

3.3回铃音media_bug处理程序(mod_ringback_check.cpp)

3.3.1 引入的头文件

#include <switch.h>

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <string>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <time.h>

#include "ringback_check.h"

#include "light_websocket_client.hpp"

using namespace ringbackcheckws;

#define RINGBACK_PRIVATE "mod_ringback_check_bug"

3.3.2读取xml文件的结构

static switch_xml_config_item_t instructions[] = {

    /* parameter name        type                 reloadable   pointer                         default value     opt


http://www.kler.cn/a/508239.html

相关文章:

  • Ubuntu VPS 上 Docker 部署 Nginx 服务器详细教程
  • Lora理解QLoRA
  • 构建一个简单的深度学习模型
  • Re78 读论文:GPT-4 Technical Report
  • java spring,uName,kValue,前端传值后端接不到
  • Linux操作命令之云计算基础命令
  • [创业之路-249]:《华为流程变革:责权利梳理与流程体系建设》核心内容
  • 【GIS系列】打造3维GIS数字孪生效果系统:Cesium+Mapbox+SpringBoot完美实现解析
  • Spring Boot--@PathVariable、@RequestParam、@RequestBody
  • 如何使用 Go语言操作亚马逊 S3 对象云存储
  • 【Cesium入门教程】第一课:Cesium简介与快速入门详细教程
  • 机器学习——集成学习、线性模型、支持向量机、K近邻、决策树、朴素贝叶斯、虚拟分类器分析电动车数据集Python完整代码
  • boss直聘 __zp_stoken__ 分析
  • 【Unity3D】远处的物体会闪烁问题(深度冲突) Reversed-Z
  • 【Go】Go Gorm 详解
  • Ardupilot开源无人机之Geek SDK进展2024
  • ThinkPHP 8的一对多关联
  • 花样贪吃蛇
  • (即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力
  • DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图
  • vue v-if和key值的注意的地方
  • 跨站请求伪造(CSRF)介绍
  • 多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)
  • redis做为缓存,mysql的数据如何与redis进行同步呢?
  • c#函数式编程
  • 微信小程序码生成