目前我使用的代码:
import sys
import soundfile as sf
import pyloudnorm as pyln
f = open( "c:\\temp\\wav_analysis.txt", "w" )
data, rate = sf.read(sys.argv[1]) # load audio (with shape (samples, channels))
meter = pyln.Meter( rate ) # create BS.1770 meter
loudness = meter.integrated_loudness(data) # measure loudness
'''output analysis data'''
for i in range(1, len(data)):
if abs(data[i]) > 0.4:
f.write(str( i / rate ) + "," + str(abs(data[ i ])) + "\n")
WAV文件是作为一个参数传入的,它被读入,然后分析所有“数据”的响度。
我不想这样,我想分析100毫秒的数据窗口(即一次4410个样本,同时将窗口移动50毫秒,从而创建大量的响度值)。
有没有一种方法可以调用meter.integrated_loundess(),使它能够做到这一点?
或者我需要创建一组从“data”派生的4410个值的长数据数组,然后将它们逐一馈送给meter.integrated_loudness()吗?
(The“”“输出分析数据”“”下面的内容只是保持器。我希望将其替换为所需内容。)
编辑:参见下面的“切片”答案。另外,请记住,通过反复试验,我发现Integrated_Loudness要求数据至少为17640个样本长(IidoEe. 400ms at 44100)。
编辑2:在随机搜索其他东西,我遇到了这个网站:https://pysoundfile.readthedocs.io/en/0.8.0/
在那里,这个代码片段正是我最初寻找的快速获得WAV文件的RMS值:
import numpy as np
import soundfile as sf
rms = [np.sqrt(np.mean(block**2)) for block in
sf.blocks('myfile.wav', blocksize=1024, overlap=512)]
不仅速度快得多,而且也不受我用meter.integrated_loudness碰到的“0. 4秒”窗口限制的限制。
1条答案
按热度按时间dced5bon1#
如果我没理解错你的问题,也许你可以像下面这样对数据进行切片: