音声信号に残響を加える一般的な方法(方法1)

 Python パッケージ (pyroomacoustic) を使用して、きれいな音声に残響を追加します。

Pyroomacoustics は、オーディオ アレイ処理アルゴリズムを迅速に開発およびテストするために設計されたソフトウェア パッケージです。パッケージの内容は、次の 3 つの主要なコンポーネントに分けることができます。

1. 直感的な Python オブジェクト指向インターフェイスにより、2D および 3D ルームの複数の音源とマイクを含むさまざまなシミュレーション シナリオを迅速に構築できます。

2. Fast C++ は、一般的な多面体部屋の画像ソース モデルとレイ トレーシングを実装し、部屋のインパルス応答を効果的に生成し、ソースと受信機間の伝播をシミュレートします。

3. STFT、ビームフォーミング、方向探知、適応フィルタリング、音源分離、シングルチャネルノイズ除去などの一般的なアルゴリズムのリファレンス実装。

この実験では主にパイルーム音響パッケージを使用して室内インパルス応答 (RIR) を実現し、クリーンな音声信号に残響を追加します。

1. マイクの場合:

部屋の広さ:7×5×4(長さ×幅×高さ、単位:メートル)。

人の位置: (1, 1);

マイク位置: (2, 2);

マイクの数: 1;

人とマイクの間の距離: 1.414 メートル。

残響時間 T60: 550ms;

シミュレーション結果を次の図に示します。

 部屋のスタイル

部屋の上面図。黒丸は人の位置、×印はマイクの位置です。 

 

 室内インパルス応答タイムドメイン波形

 2.マイクが 3 つの場合:

部屋の広さ:7×5×4(長さ×幅×高さ、単位:メートル)。

人の位置: (1, 1);

マイクアレイの中心位置: (2, 2);

マイクの数: 3;

人とマイクアレイの間の距離: 1.414 メートル。

残響時間 T60: 550ms;

シミュレーション結果を次の図に示します。

 部屋の上面図。実線の点は人の位置、3 つの十字は 3 つのマイクの位置を表し、3 つのマイクはマイク アレ​​イを形成します。

 3 つのマイクの室内インパルス応答時間領域波形

3. 6 つのマイクの状況:

部屋の広さ:7×5×4(長さ×幅×高さ、単位:メートル)。

人の位置: (1, 1);

マイクアレイの中心位置: (2, 2);

マイクの数: 6;

人とマイクアレイの間の距離: 1.414 メートル。

残響時間 T60: 550ms;

シミュレーション結果を次の図に示します。

 部屋の上面図。実線の点は人の位置、6 つの十字は 6 つのマイクの位置を表し、6 つのマイクがマイク アレ​​イを形成します。

6 つのマイクの室内インパルス応答時間領域波形 

 プログラムを次の図に示します。

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)

おすすめ

転載: blog.csdn.net/qq_42233059/article/details/126444994#comments_28075875