speexsdp消除回声

 这是testecho.c样例的程序。

初始化函数:

SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length);
可以看头文件说明:配置frame_size贞大小10-20ms,filter_length滤波长度100-500ms

比如采样频率是16K,frame_size就是160-320,filter_length就是1600-8000

filter_length调大,达到稳定时间越长。

SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate)

sampling_rate是实际采样频率,比如16K

使用参考

make && ./testecho 麦克输入.pcm 喇叭输出(远端传来的).pcm 消回声数据.pcm

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "speex/speex_echo.h"
#include "speex/speex_preprocess.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//主要是配置NN,TAIL
#define NN 240
#define TAIL 2400

int main(int argc, char **argv)
{
   FILE *echo_fd, *ref_fd, *e_fd;
   short echo_buf[NN], ref_buf[NN], e_buf[NN];
   SpeexEchoState *st;
   SpeexPreprocessState *den;
   int sampleRate = 16000;

   if (argc != 4)
   {
      fprintf(stderr, "testecho mic_signal.sw speaker_signal.sw output.sw\n");
      exit(1);
   }
   echo_fd = fopen(argv[2], "rb");
   ref_fd  = fopen(argv[1],  "rb");
   e_fd    = fopen(argv[3], "wb");

//    echo_fd = fopen("talk_spk.pcm", "rb");
//    ref_fd  = fopen("talk_mic.pcm",  "rb");
//    e_fd    = fopen("talk_out.pcm", "wb");

   st = speex_echo_state_init(NN, TAIL);
   den = speex_preprocess_state_init(NN, sampleRate);
   speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate);
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_STATE, st);

   int tmpseti;
   float tmpsetf;
//    int echo_sppress_level = -200;
   tmpseti = 0;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_GET_DENOISE, &tmpseti);
//    speex_preprocess_ctl(den, SPEEX_PREPROCESS_GET_DENOISE, &tmpseti);
   printf("SPEEX_PREPROCESS_GET_DENOISE = %d\n", tmpseti);
   tmpseti = -40;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &tmpseti);
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_GET_NOISE_SUPPRESS, &tmpseti);
   printf("SPEEX_PREPROCESS_GET_NOISE_SUPPRESS = %d\n", tmpseti);

   tmpseti=0;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_AGC, &tmpseti);
   tmpseti=sampleRate;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_AGC_LEVEL, &tmpseti);
   tmpseti=1;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_DEREVERB, &tmpseti);
   tmpsetf=20.0;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &tmpsetf);
   tmpsetf=20.0;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &tmpsetf);


   tmpseti = -40;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS, &tmpseti);
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_GET_ECHO_SUPPRESS, &tmpseti);
   printf("SPEEX_PREPROCESS_GET_ECHO_SUPPRESS = %d\n", tmpseti);

   tmpseti = -40;
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE, &tmpseti);
   speex_preprocess_ctl(den, SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE, &tmpseti);
   printf("SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE = %d\n", tmpseti);

   while (!feof(ref_fd) && !feof(echo_fd))
   {
      fread(ref_buf, sizeof(short), NN, ref_fd);
      fread(echo_buf, sizeof(short), NN, echo_fd);
      speex_echo_cancellation(st, ref_buf, echo_buf, e_buf);
      speex_preprocess_run(den, e_buf);
      fwrite(e_buf, sizeof(short), NN, e_fd);
   }
   speex_echo_state_destroy(st);
   speex_preprocess_state_destroy(den);
   fclose(e_fd);
   fclose(echo_fd);
   fclose(ref_fd);
   return 0;
}

效果(工具Audacity):

语音文件参考链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/450080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码签名的等级有哪些?怎么申请?

代码签名有OV,EV两种安全等级的证书&#xff0c;其中OV代码签名证书与EV代码签名证书的主要区别有以下几点&#xff1a; 1. 验证深度&#xff1a; - OV代码签名证书&#xff1a;进行组织验证&#xff0c;即证书颁发机构&#xff08;CA&#xff09;会验证申请者的公司或组织的真…

笔记本电脑已接通电源但未充电怎么办?这里提供8个解决办法

序言 你的笔记本电脑即使插上电源也不会充电吗?虽然大多数情况下,当充电适配器未正确连接时会发生这种情况,但在其他情况下,过时的BIOS或电池驱动程序损坏可能是原因。无论原因是什么,如果笔记本电脑已插入电源但未充电,你可以尝试以下修复程序。 检查笔记本电脑适配器…

视频怎么转成文字?不妨试试这三款AI神器!

在数字化时代&#xff0c;视频内容日益丰富&#xff0c;但有时我们希望能够轻松提取视频中的文字信息&#xff0c;以便快速浏览、编辑或搜索。这时&#xff0c;一款高效、准确的视频转文字应用就显得尤为重要。面对市面上众多的选择&#xff0c;究竟哪款应用能够脱颖而出&#…

SSL---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.SSL-VPN概述 SLL VPN是一种基于HTTPS&#xff08;即支持SSL的HTTP协议&#xff09;的远程安全接入技术。它充分利用了SSL协议提供的基于证书的身份认证、数据加密和消息完整性验证机制&#…

xss.haozi.me靶场“0x00-0x0A”通关教程

君衍. 一、靶场介绍二、第一关 0x00 不做限制三、第二关 0x01 文本闭合标签绕过四、第三关 0x02 双引号闭合绕过五、第四关 0x03 过滤括号六、第五关 0x04 编码绕过七、第六关 0x05 注释闭合绕过八、第七关 0x06 换行绕过九、第八关 0x07 删除标签十、第九关 0x08 多加空格绕过…

精通 Python 装饰器:代码复用与功能增强技巧

精通 Python 装饰器&#xff1a;代码复用与功能增强技巧 引言装饰器基础装饰器的定义基本装饰器的实现方法理解 符号的用法简单装饰器示例代码 使用装饰器增强函数功能日志记录性能测试事务处理小结 装饰器进阶应用管理用户认证缓存机制的实现参数化装饰器的创建和应用多个装饰…

Android中单例模式正确实现方式

1. 饿汉模式 -线程安全 在类加载时进行实例化&#xff0c; 线程安全&#xff0c;但会导致类加载时间变长。饿汉模式如果使用过多&#xff0c;可能会对App启动耗时带来不利影响。 2. 懒汉模式 -线程不安全 没有加锁&#xff0c; 因此线程不安全。 3. 两次判空 加同步锁 -线程不…

JVM-3

HotSpot虚拟机对象 我在网上看了很多相关的文章&#xff0c;发现在创建对象和对象的结构中内容都不太一样&#xff0c;一些关键字也很不同&#xff0c;于是我通过参考《深入理解Java虚拟机》这本书&#xff0c;自己总结了一篇。 1.对象的创建 当JVM收到一条创建对象的字节码…

基于DiT,支持4K图像生成,华为诺亚0.6B文生图模型PixArt-Σ来了

这个模型和 Sora 一样采用了 DiT 框架。 众所周知&#xff0c;开发顶级的文生图&#xff08;T2I&#xff09;模型需要大量资源&#xff0c;因此资源有限的个人研究者基本都不可能承担得起&#xff0c;这也成为了 AIGC&#xff08;人工智能内容生成&#xff09;社区创新的一大阻…

C++的学习

代码练习 输入一个字符串&#xff0c;统计其中大写字母、小写字母、数字、空格以及其他字符的个数 #include <iostream>using namespace std;int main() {cout << "请输入一个字符串" << endl;string str;getline(cin,str);int capital 0;int l…

蜂窝物联:智慧水产养殖解决方案

一、系统介绍 集约化水产养殖水质在线监控系统是面向水产养殖集约、高产、高效、生态、安全的发展需求&#xff0c;基于智能传感、无线传感网、通信、智能处理与智能控制等物联网技术开发的&#xff0c;集水质环境参数在线采集、无线传输、智能处理、预警信息发布、决策支持、…

功能测试转自动化测试好不好转型?

手工测试做了好多年&#xff0c;点点点成了每天必须做的事情。但是随着自动化测试趋势的日渐明显&#xff0c;以及受到薪资、技能的双重考验&#xff0c;掌握自动化测试成为了必备技能。 手工转自动化测试&#xff0c;不是一蹴而就的。“预先善其事&#xff0c;必先利其器”&a…

如何看待Linux桌面操作系统的火速增长

文章目录 1. 使用过Linux桌面操作系统吗&#xff1f;Linux系统有什么优势&#xff1f;对于Linux桌面操作系统份额的火速增长怎么看呢认为未来Linux会主导桌面操作系统吗&#xff1f; #如何看待Linux桌面操作系统的火速增长&#xff1f; 1. 使用过Linux桌面操作系统吗&#xff…

LeetCode 707. 设计链表 (JAVA)

1.题目 2. 思路分析 1.我们要设置一个虚拟头节点&#xff0c;因为这个虚拟头节点对于增加节点操作和删除节点操作都很方便。 2.仔细读题&#xff0c;题目中说链表中的节点下标是从0开始的。也就是说第一个节点下标为0。 3.增加节点和删除节点的操作我们都要获取到它前一个的节…

AI交互数字人助力传统景区数字化升级

AI交互数字人在游客体验提升方面具有重要作用。传统景区可以将AI交互数字人以一体机、小程序等形式&#xff0c;与景区游客进行面对面实时交流&#xff0c;为游客提供导览讲解、景区路线指引、文创产品推荐等智能服务&#xff0c;AI交互数字人针对性的为游客提供“吃住行游购娱…

【LeetCode: 289. 生命游戏 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

神经科常用的5个脑卒中风险评估量表,医生必备!

脑卒中俗称中风&#xff0c;包括缺血性脑卒中和出血性脑卒中。脑卒中风险评估的相关量表&#xff0c;是神经科医生临床常用的量表类型。 常笑医学整理了神经科常用的5个脑卒中风险评估量表&#xff0c;包括Essen脑卒中风险评分量表(ESRS评分)、卒中预测工具-Ⅱ&#xff08;SPI…

Jmeter-使用http proxy代理录制脚本

Jmeter-使用http proxy代理录制脚本 第1步&#xff1a;打卡jmeter工具新增1个线程组 第2步&#xff1a;给线程组添加1个HTTP请求默认值 第3步&#xff1a;设置下HTTP请求默认值第4步&#xff1a;在工作台中新增1个----HTTP代理服务器 第5步&#xff1a;设置HTTP代理服务器 …

一款好用的AI工具——边界AICHAT

目录 一、简介二、注册及登录三、主要功能介绍3.1、模型介绍3.2、对话模型历史记录3.3、创作中心3.4、AI绘画SD3.5、文生图3.6、图生图3.7、线稿生图3.8、艺术二维码3.9、秀图广场3.10、AI绘画创作人像辅助器 一、简介 人工智能&#xff08;AI&#xff09;是一门研究、开发用于…