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

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(使用前将#替换为@)

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

  • Python动态导入脚本,需要有其__name__ == "__main__"代码才能被调用

    当从另一个脚本导入 python 脚本时 我想要受经典保护的脚本代码 if name main 要运行 我怎样才能运行该代码 我想做的是从 python 脚本动态更改模块 然后导入现有脚本 该脚本应该看到所做的更改并运行其 main 像Py
  • python的_random是什么?

    如果你打开random py看看它是如何工作的 它的类Random子类 random Random import random class Random random Random Random number generator base
  • Python - 包和设置文件

    我有一个 python 包 需要从我的项目目录中提取设置 这是我的项目当前的结构 Project bin mypackage package files Project myproject project files start py se
  • SMTPAuthenticationError: (535, b'5.7.8 用户名和密码在 Django 生产中不被接受?

    我在 Heroku 上部署了一个 Django 应用程序 在其中一节中 我使用 SMTP Gmail 设置向用户发送电子邮件 当我在本地运行项目时 电子邮件发送成功 但在 Heroku 上部署的项目上却发送失败 我在 Stackoverfl
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • ValueError:在 R 中使用 keras 模型时在用户代码中

    我正在尝试使用 R 在 R 中运行一维 CNNkeras包裹 我正在使用以下代码 library MASS library keras Create some data data Boston data lt Boston create a
  • 如何使用泛型类型的构造函数

    如何使用 python 泛型类型的构造函数 T typing TypeVar T class MyClass typing Generic T def init self initialValue typing Iterable self
  • 如何抑制 pyinstaller 生成的可执行文件窗口中的所有警告

    我已经使用 pyinstaller 从 python 文件生成了可执行文件 该程序按其应有的方式工作 但在我想隐藏的窗口中出现了一条警告消息 当 python 文件在 IDE 中运行时 以下行会抑制所有警告消息 warnings filte
  • Python3.1中的视图?

    Python3 1中的视图到底是什么 它们的行为方式似乎与迭代器类似 并且它们也可以具体化为列表 迭代器和视图有何不同 据我所知 视图仍然附加到创建它的对象上 对原始对象的修改会影响视图 来自docs http docs python or
  • 如何在树莓派上更新到最新的 python 3.5.1 版本?

    我昨天拿到了 Raspberry Pi 我已经在尝试用它来编写代码了 我有一个计划在其上运行的程序 但它仅与 Python 版本 3 5 0 或 3 5 1 兼容 并且我在互联网上找到的所有内容似乎都已经过时 与 Python 2 有关 或
  • 尝试修复我的功能

    我正在开发一个函数 我必须返回一个元组 其中第一个参数是最大数字的 str 第二个参数是 int 列表 这是示例以及我为该函数编写的内容 投票 G G N G C G 1 3 0 1 您必须将最大值的位置映射到正确的一方 parties N
  • 多线程写入文件

    前几天刚开始使用 python 对多线程的整个概念还很陌生 我在多线程时写入文件时遇到问题 如果我按照常规方式执行此操作 它会不断覆盖正在写入的内容 使用 5 个线程写入文件的正确方法是什么 不降低性能的最佳方法是在所有线程之间使用队列 每
  • 仅对某些行的不同大小的两个 pandas 数据帧的列进行求和

    我有两个 pandas 数据框 如下所示 df1 n column1 0 5 0 0 0 1 6 0 0 0 2 7 0 0 0 3 8 0 0 0 4 9 0 0 0 5 10 0 0 0 df2 n column2 0 6 0 1 0
  • 安排 Asyncio 任务每 X 秒执行一次?

    我正在尝试创建一个 python 不和谐机器人 它将每隔 X 秒检查一次活跃会员 并根据会员的在线时间奖励积分 我正在使用 asyncio 来处理聊天命令 这一切都正常 我的问题是找到一种方法来安排每隔 X 秒异步检查一次活动成员 我已经阅
  • python 函数返回 javascript date.getTime()

    我正在尝试创建一个简单的 python 函数 它将返回与 javascript 相同的值new Date getTime 方法 如所写here http www w3schools com js js dates asp javascrip
  • 在字典理解中为 locals() 添加下标失败并出现 KeyError [重复]

    这个问题在这里已经有答案了 我对 Python 的奇怪行为感到困惑locals 基本上我想从字典中获取一个项目locals 在字典理解中 但它失败了 这是一个非常基本的事情 所以 gt gt gt foo 123 gt gt gt bar
  • Networkx 中 Louvain 分区的可视化

    请帮助我更改 Louvain 聚类算法结果的可视化 我从网站上获取了代码https github com taynaud python louvain https github com taynaud python louvain我可以重写
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • 将 pandas 数据框中的多列更改为日期时间

    我有一个 13 列和 55 000 行的数据框 我正在尝试将其中 5 行转换为日期时间 现在它们返回类型 对象 我需要转换这些数据以进行机器学习 我知道如果我这样做 data birth date pd to datetime data b
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla

随机推荐

  • 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房间