如何在Python中正确模拟录音中的对讲机无线电噪声,并将其添加到干净的音频中。

问题描述 投票:1回答:0

我有很多音频文件,是来自无线电通讯,来自 https:/www.liveatc.net . 我的目的是模拟这些类型的音频(想想飞机,AM广播等)的通信背景噪声,并将其应用于清洁数据。

我最初的想法是分析这些嘈杂的音频文件,并找到他们的标准差,然后应用高斯白噪声与所有文件的平均标准差(他们都是相对相似的,手段接近0)。然而,由于我正在寻找的干净音频是在不同的音量下,可能还有更多需要考虑的因素等等。目前的尝试是将随机的文件应用到干净的语音文件中,白噪声严重淹没了干净的语音。我如何能够从文件中模拟噪声并应用于其他数据?

我确保我所有的文件都是.wav格式,帧率为16000 khz。我已经附上了一些伪代码,我已经尝试做这样的事情,但我正在寻找其他的想法things来考虑。

import numpy as np
import matplotlib.pyplot as plt
import wave
from pydub import AudioSegment, effects
from Pathlib import Path

# get lists of standard deviations and means for all noisy radio-comms files
std_devs = []

for file in Path(audio_files_dir).iterdir():
    audio = AudioSegment.from_file(file)
    audio = audio.set_frame_rate(16000)
    print(file)
    print(audio.frame_rate)
    samples = audio.get_array_of_samples() # sample's amplitudes
    samples = np.array(samples) # cast to numpy array
    std_dev_samples = np.std(samples) # get std_dev of the samples
    std_devs.append(std_dev_samples)
    means.append(mean_samples)


# mean of all standard deviations, will use this to create white noise
print(sum(std_devs) / len(std_devs))
avg_std_devs = sum(std_devs) / len(std_devs)

# taking a clean audio file and prepping it for adding white noise
audio_signal_pydub = AudioSegment.from_file(audio_file_path)
samples = audio_signal_pydub.get_array_of_samples() # take audio signal and turn it into an array of amplitudes
samples = np.array(samples) # turn it into numpy array
print(samples.shape)


# plotting for pydub
time = np.linspace(0, audio_signal_pydub.duration_seconds, num = len(samples)) # create time for x axis in seconds
plt.figure(1)
plt.title("Plot with pydub")
plt.plot(time, samples)
plt.show()


noise = np.random.normal(0, avg_std_devs, samples.shape) # array of white noise with std dev equal to average of the several ATC files
signal_w_noise = samples + noise
plt.figure(1)
plt.title("Plot signal with gaussian white noise")
plt.plot(time, signal_w_noise)
plt.show()

# turn the signal with noise array back into an audio segment for export
new_audio_segment = audio_signal_pydub._spawn(data = signal_w_noise)
print(new_audio_segment)

new_audio_segment.export(r"new_audio.wav", format = 'wav')


python python-3.x signal-processing waveform pydub
© www.soinside.com 2019 - 2024. All rights reserved.