Un método común para agregar reverberación a las señales de voz (método 1)

 Use el paquete python (pyroomacoustic) para agregar reverberación al habla clara.

Pyroomacoustics es un paquete de software diseñado para desarrollar y probar rápidamente algoritmos de procesamiento de matrices de audio. El contenido del paquete se puede dividir en tres componentes principales:

1. La interfaz intuitiva orientada a objetos de Python puede crear rápidamente diferentes escenarios de simulación que involucren múltiples fuentes de sonido y micrófonos en salas 2D y 3D;

2. Fast C ++ implementa el modelo de fuente de imagen y el trazado de rayos de salas poliédricas generales, generando efectivamente respuestas de impulso de sala y simulando la propagación entre fuentes y receptores;

3. Implementaciones de referencia de algoritmos populares para STFT, formación de haces, radiogoniometría, filtrado adaptativo, separación de fuentes de sonido y eliminación de ruido de un solo canal.

Este experimento utiliza principalmente el paquete piroacústico para realizar la respuesta de impulso de la sala (RIR) para agregar reverberación a la señal de voz limpia.

1. El caso de un micrófono:

Tamaño de la habitación: 7×5×4 (largo×ancho×alto, unidad: metro);

Posición de la persona: (1, 1);

Posición del micrófono: (2, 2);

Número de micrófonos: 1;

La distancia entre la persona y el micrófono: 1.414 metros;

Tiempo de reverberación T60: 550ms;

Los resultados de la simulación se muestran en la siguiente figura:

 estilo de la habitación

La vista superior de la sala, donde: el círculo sólido es la posición de la persona y el símbolo de la cruz es la posición del micrófono 

 

 Forma de onda de dominio de tiempo de respuesta de impulso de habitación

 2. El caso de tres micrófonos:

Tamaño de la habitación: 7×5×4 (largo×ancho×alto, unidad: metro);

Posición de la persona: (1, 1);

Posición central del conjunto de micrófonos: (2, 2);

Número de micrófonos: 3;

La distancia entre la persona y el conjunto de micrófonos: 1.414 metros;

Tiempo de reverberación T60: 550ms;

Los resultados de la simulación se muestran en la siguiente figura:

 La vista superior de la sala, donde: el punto sólido es la posición de la persona, las tres cruces representan las posiciones de los tres micrófonos y los tres micrófonos forman una matriz de micrófonos

 Formas de onda de dominio de tiempo de respuesta de impulso de sala para tres micrófonos

3. Situación de seis micrófonos:

Tamaño de la habitación: 7×5×4 (largo×ancho×alto, unidad: metro);

Posición de la persona: (1, 1);

Posición central del conjunto de micrófonos: (2, 2);

Número de micrófonos: 6;

La distancia entre la persona y el conjunto de micrófonos: 1.414 metros;

Tiempo de reverberación T60: 550ms;

Los resultados de la simulación se muestran en la siguiente figura:

 La vista superior de la sala, donde: el punto sólido es la posición de la persona, las seis cruces representan las posiciones de los seis micrófonos y los seis micrófonos forman una matriz de micrófonos

Formas de onda de dominio de tiempo de respuesta de impulso de sala para seis micrófonos 

 El programa se muestra en la siguiente figura:

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)

Supongo que te gusta

Origin blog.csdn.net/qq_42233059/article/details/126444994#comments_28075875
Recomendado
Clasificación