gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:31:03 27 4
gpt4 key购买 nike

我正在通过机器人进行音频流式传输。我正在使用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的示例

最佳答案

您的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(np.max(np.abs(not_normalized_signal)))

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

print(np.max(np.abs(normalized_signal)))


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

我希望这有帮助!

关于python - 如何使用python规范原始音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57925304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com