如何使用python规范原始音频文件

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

我正在通过机器人进行音频流式传输。我正在使用python,并将流结果保存在.raw文件中。当我尝试重现文件时,它非常嘈杂。我需要规范化原始音频并将新清洗的音频保存在ndarray中,并将其保存到新的原始文件中。

[我看到,如果我将原始文件导入到audacity,然后应用归一化效果,则噪声将被消除,并且音频是完全可听的。(在Audacity归一化中,我将Normalize maximun振幅设置为-1.0 dB)

这是原始数据的内容(out_1_2.raw是包含我在Audacity中导入的音频的文件)

A = np.fromfile('out_1_2.raw', dtype='int16')
print(A.shape)
print("A MAX --> "+ str(max(abs(A))))

此代码的输出是:

(1638400,)
[    0     0  7168 16560     0     0  1024 16561     0     0]
A MAX --> 32704

[在将out_1_2.raw导入Audacity并应用如上所述的归一化效果后,我从Audacity导出了新的可听波到新的原始文件(out_1_2_normalized.raw),结果文件包含以下内容:

B = np.fromfile('out_1_2_normalized.raw', dtype='int16')
print(B.shape)
print("B MAX --> "+ str(max(abs(B))))

此代码的输出是:

(1638400,)
[     0 -16384 -22494  16316      0   8192  17813  16318      0  24576]
B MAX --> 32767

我希望知道用于此转换的算法是什么,因此可以将其应用到我的python代码中。如果我需要从零开始实现算法,或者有可以使用的python库。

这里是raw audio file的样本

python audio normalization
1个回答
0
投票

您的wav信号是16位数字信号,范围为-32768至+32767。归一化后得到的最大值告诉我您正在归一化以使峰值等于范围的最大值。为了用numpy做到这一点,通常可以简单地做到:


not_normalized_signal = np.array([np.random.randint(-32768, 32767) for sample in range(16)], np.int16)  # Just a random 16 sample signal in the wav range with appropriate type.
print(not_normalized_signal.max())

normalized_signal = np.array([(not_normalized_signal / np.max(np.abs(not_normalized_signal))) * 32767], np.int16)

print(normalized_signal.max())

归一化首先将信号除以其最大绝对值。这会将其投影到[-1,1]空间,然后乘以wav范围的最大值,将其投影回去。最后,我创建了一个具有适当dtype的新数组,以确保我们仍然有一个有效的16位wav数组。

我希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.