给语音信号加混响的常用方法(方法一)

2023-11-02

 使用python包(pyroomacoustic)给干净语音加混响。

Pyroomacoustics是一款旨在快速开发和测试音频阵列处理算法的软件包。包的内容可分为三个主要组成部分:

1、直观的Python面向对象接口,可快速构建2D和3D房间中涉及多个声源和麦克风的不同仿真场景;

2、快速c++实现一般多面体房间的镜像声源模型和光线追踪,有效地产生房间脉冲响应和模拟源与接收机之间的传播;

3、STFT、波束成型、测向、自适应滤波、声源分离和单通道去噪的流行算法的参考实现。

本次实验主要是用pyroomacoustic包实现房间脉冲响应(RIR)来给干净的语音信号加混响。

一、一个麦克风的情况:

房间尺寸:7×5×4(长×宽×高,单位:米);

人的位置:(1,1);

麦克风位置:(2,2);

麦克风数量:1个;

人与麦克风的距离:1.414米;

混响时间T60:550ms;

模拟的结果如下图所示:

 房间样式

房间俯视图,其中:实心圆点为人的位置,十字符号为麦克风位置 

 

 房间脉冲响应时域波形

 二、三个麦克风的情况:

房间尺寸:7×5×4(长×宽×高,单位:米);

人的位置:(1,1);

麦克风阵列圆心位置:(2,2);

麦克风数量:3个;

人与麦克风阵列的距离:1.414米;

混响时间T60:550ms;

模拟的结果如下图所示:

 房间俯视图,其中:实心圆点为人的位置,三个十字符号代表三个麦克风位置,三个麦克风组成麦克风阵列

 三个麦克风的房间脉冲响应时域波形

三、六个麦克风的情况:

房间尺寸:7×5×4(长×宽×高,单位:米);

人的位置:(1,1);

麦克风阵列圆心位置:(2,2);

麦克风数量:6个;

人与麦克风阵列的距离:1.414米;

混响时间T60:550ms;

模拟的结果如下图所示:

 房间俯视图,其中:实心圆点为人的位置,六个十字符号代表六个麦克风位置,六个麦克风组成麦克风阵列

六个麦克风的房间脉冲响应时域波形 

 程序如下图所示:

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from scipy.signal import fftconvolve
import IPython
import pyroomacoustics as pra
import soundfile as sf
#/****************************/
# 创建一个尺寸为(7,5)的矩阵房间
corner = np.array([[0, 0], [7, 0], [7, 5], [0, 5]]).T
#corner = np.array([[0, 0], [3.15, 0], [3.15, 3.15], [0, 3.15]]).T
room = pra.Room.from_corners(corner)
'''
corner: 房间的四个角。`pra.Room.from_corners()`的函数文档中表示四个角的声明顺序必须逆时针。
'''

plt.figure(1)
fig, ax = room.plot()
ax.set_xlim([-1, 10])
ax.set_ylim([-1, 10])
plt.show()
#/***********************************/
plt.figure(2)
corner = np.array([[0, 0], [7, 0], [7, 5], [0, 5]]).T  # 房间的长宽为7米,5米
#corner = np.array([[0, 0], [3.15, 0], [3.15, 3.15], [0, 3.15]]).T
room = pra.Room.from_corners(corner)
#room.extrude(3.)  # 高为3米的房间
room.extrude(4.)  # 高为4米的房间
fig, ax = room.plot()
ax.set_xlim([-1, 10])
ax.set_ylim([-1, 10])
ax.set_zlim([-1, 4])
plt.show()
#/********************************/

audio, sr = sf.read('HPYJY01.wav')
corners = np.array([[0, 0], [7, 0], [7, 5], [0, 5]]).T
#corners = np.array([[0, 0], [3.15, 0], [3.15, 3.15], [0, 3.15]]).T
room1 = pra.Room.from_corners(corners, fs=sr,
                              max_order=3,
                              materials=pra.Material(0.2, 0.15),# 0.2,0.15 / 0.45,0.33
                              ray_tracing=True, air_absorption=True)
room1.add_source([1, 1], signal=audio)  # 人的位置
'add microphone'
#添加麦克风M表示麦克风数量
R = pra.circular_2D_array(center=[2.,2.], M=1, phi0=0, radius=0.3)
#R = pra.circular_2D_array(center=[2.,2.], M=1, phi0=0, radius=0.0)
# 人和麦克风距离是[(2-1)^2+(2-1)^2]开根号 = 根号下(2) = 1.414m
room1.add_microphone_array(pra.MicrophoneArray(R, room1.fs))
fig, ax = room1.plot()
ax.set_xlim([-1, 10])
ax.set_ylim([-1, 10])
#/********************************/
room1.image_source_model()
fig, ax = room.plot(img_order=3)
# fig.set_size_inches(18.5, 10.5)

#/***********************************/
room1.plot_rir()
fig = plt.gcf()
fig.set_size_inches(20, 10)
# t60 = pra.experimental.measure_rt60(room1.rir[0][0], fs=room1.fs, plot=True)
# print(f"The RT60 is {t60 * 1000:.0f} ms")
plt.show()
room1.simulate()
sf.write('HPYJY_wav.wav', room1.mic_array.signals.T, samplerate=sr)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给语音信号加混响的常用方法(方法一) 的相关文章

随机推荐

  • HyperLogLog(关于基数统计)

    写在前面 今天在复习Redis的一种在Redis 2 8 9 版本更新的结构的时候 知道了这个数据结构是基于一种优秀的算法HyperLogLog 基数统计算法 简单来说就是统计集合中的元素数量 但是对比set有了很大的优化 就去了解了一下这
  • Lemmings4

    See also Lemmings1 Lemmings2 and Lemmings3 Although Lemmings can walk fall and dig Lemmings aren t invulnerable If a Lem
  • ARouter原理剖析及手动实现

    简介 最近可能入了魔怔 也可能是闲的蛋疼 自己私下学习了ARouter的原理以及一些APT的知识 为了加深对技术的理解 同时也本着热爱开源的精神为大家提供分享 所以就带着大家强行撸码 分析下ARouter路由原理和Android中APT的使
  • U-Boot 启动流程详解

    文章目录 链接脚本 u boot lds 详解 Uboot启动流程 链接脚本 u boot lds 详解 要分析 uboot 的启动流程 首先要找到 入口 找到第一行程序在哪里 程序的链接是由链接脚本来决定的 所以通过链接脚本可以找到程序的
  • linux驱动模块编译Makefile

    该Makefile最好是和hello c同样的路径 obj m hello o 表示编译生成的模块 前缀hello必须和 c文件相同 all make C lib modules shell uname r build M PWD modu
  • /bin/sh: 1: nvcc: not found Makefile:89: recipe for target 'obj/convolutional_kernels.o' failed

    在测试YOLO时出现 nvcc gencode arch compute 30 code sm 30 gencode arch compute 35 code sm 35 gencode arch compute 50 code sm 50
  • 高性能内存分配器 jemalloc 基本原理

    Netty 内存管理的实现并不是一蹴而就的 它也是参考了 jemalloc 内存分配器 今天我们就先介绍 jemalloc 内存分配器的基本原理 为我们后面的课程打好基础 背景知识 jemalloc 是由 Jason Evans 在 Fre
  • [Warning] ‘typedef‘ was ignored in this declaration解决

    首先先展示一下问题是怎么样的 出现了 typedef was ignored in this declaration的问题 下面提供解决方案及原因 原因 在于使用结构体的时候没有使用别名 解决方案 1 去掉typedef 2 在结构体后面加
  • elementui tree怎样设置默认勾选

    在树形菜单数据里面设置一个唯一的字段 这里我的就是id字段 然后设置node key为那个唯一字段 然后用default checked keys绑定一个数组 这个数组里面就是需要勾选的菜单所对应的的id 比如我这里的是9 这样运行之后菜单
  • echarts使用结合时间轴timeline动态刷新案例

    1 echarts简介 ECharts 一个使用 JavaScript 实现的开源可视化库 可以流畅的运行在 PC 和移动设备上 兼容当前绝大部分浏览器 IE8 9 10 11 Chrome Firefox Safari等 底层依赖轻量级的
  • unity的UGUI的mask(遮罩)的使用

    之前我写过一篇博客关于UGUI的优化 其中提到了Mask的使用会增加性能的消耗 但是在一些情况下 使用这个会有奇效 比如小地图 Minimap 的开发 这篇博客介绍一下UGUI中的Mask的使用方法 很简单的 首先创建一个 Image 给他
  • 【PHP发送邮件】PHP实现发送邮件

    PHP发送邮件 Thinkphp直接使用 其他框架修改使用 1 安装 composer require phpmailer phpmailer 2 填写配置表 配置文件mail php
  • MQTT协议介绍

    1 MQTT协议简介 MQTT Message Queuing Telemetry Transport 消息队列遥测传输 是一个轻量的发布 订阅模式消息传输协议 是专门针对低带宽和不稳定网络环境的物联网应用设计的 特点 1 开放消息协议 易
  • Spring Data HelloWorld(三)

    在 Spring Data 环境搭建 二 的基础之上 我们改动 定义个一个接口 继承Repository类 咱们先实现一个根据名字查询 package org springdata repository import org springd
  • Python开发篇——添加mysqlclient

    最近使用mysql8 0 于是我就尝试用Django的框架 但是执行poetry add mysqlclient却出现了错误 python3 7 dison dison X450LD workstation project script s
  • Kuberneters企业级容器云平台落地实践之二

    九 日志中心 1 filebeat安装 Filebeat 是一个用于转发和集中日志数据的轻量级传送器 作为代理安装在您的服务器上 Filebeat 监控您指定的日志文件或位置 收集日志事件 并将它们转发到Elasticsearch或 Log
  • Linux下装载Qt

    Linux下装载Qt 官网文件下载Qt 本官网地址 http download qt io archive qt 5 9 5 9 6 https www qt io offline installers 将文件放置Linux目录下 将随意一
  • 6.SpringBoot Web开发-webjars&静态资源映射规则(欢迎页和角标favicon.ico替换)

    文章总结 作为一个后端开发 在Springboot中怎样引入需要的js依赖以及常用的静态资源映射呢 SpringBoot已经给做好了自动化配置 使用时只需要按照默认的配置去放相应的文件 就可以快速上手 1 创建SpringBoot web项
  • ArrayList,List 的区别;

    List 的区别 6 数组 数组 内存中是连续存储的 索引速度非常快 赋值与修改元素也很简单 但不 利于动态扩展以及移动 ArrayList 因为数组的缺点 就产生了 ArrayList ArrayList 使用该类时必须进行引用 同时继承
  • 给语音信号加混响的常用方法(方法一)

    使用python包 pyroomacoustic 给干净语音加混响 Pyroomacoustics是一款旨在快速开发和测试音频阵列处理算法的软件包 包的内容可分为三个主要组成部分 1 直观的Python面向对象接口 可快速构建2D和3D房间