提问人:Laulito 提问时间:11/2/2023 更新时间:11/2/2023 访问量:25
如何准备numpy.ndarray将其传递给librosa.display.waveshow()?
How can I prepare a numpy.ndarray to pass it to librosa.display.waveshow()?
问:
在我的代码中,我正在阅读一个列表,该列表存储了 44100 个第二波音频文件的样本,如下所示:
with open("./test.csv", "r") as csv_file:
reader = csv.reader(csv_file, quoting=csv.QUOTE_NONE)
rows = list(reader)
audiofile = rows[12]
如果我打印文件:
print(audiofile)
我得到这个结果:
' 0.06585693', ' 0.06663513', ' 0.066467285', ' 0.06716919', ' 0.06765747', ' 0.06770325', ' 0.06803894', ' 0.068481445', ' 0.06854248', ' 0.06918335', ' 0.06915283', ' 0.0693512', ' 0.07003784', ' 0.07008362', ' 0.06993103', ' 0.070632935', ' 0.07072449', ' 0.07104492', ' 0.07159424', ' 0.071395874', ...
等等。这意味着列表“audiofile”包含波形文件的所有 44100 个浮点样本,就像需要的那样。
现在,在使用 librosa waveshow 显示信号之前,我需要将数据放入 numpy.ndarray 中。
我在堆栈溢出上找到了这个解决方案:将列表元素转换为数组,建议使用 asarray(),但不知何故没有成功......
我是这样试的:
with open("./test.csv", "r") as csv_file:
reader = csv.reader(csv_file, quoting=csv.QUOTE_NONE)
rows = list(reader)
audiofile = rows[12]
temp_list = audiofile
myarray = np.asarray(temp_list)
当我像这样打印数据类型时
print(type(myarray))
我得到:
<class 'numpy.ndarray'>
所以这似乎是对的。当我像这样打印数组时:
print(myarray)
我得到:
[' 0.06585693' ' 0.06663513' ' 0.066467285' ... ' 0.010253906' ' 0.011354681' ' 0.011835733']
所以 np.asarray() 似乎是合适的。但是,如果我现在运行:
librosa.display.waveshow(myarray)
我不知何故收到此错误:
回溯(最近一次调用最后一次): 文件“/Users/abc/Desktop/Project Python Audio/Datenbankzugriff.py”,第 76 行,在 librosa.display.waveshow(myarray) 文件“/Users/abc/Desktop/Project Python Audio/.venv/lib/python3.11/site-packages/librosa/display.py”,第 2029 行,在 waveshow 中 util.valid_audio(y, mono=False) 文件“/Users/abc/Desktop/Project Python Audio/.venv/lib/python3.11/site-packages/librosa/util/utils.py”,第 300 行,valid_audio raise ParameterError(“音频数据必须是浮点型的”) librosa.util.exceptions.ParameterError:音频数据必须是浮点型
这让我感到惊讶,因为数据是浮点型的......如何正确地预处理我的波形样本,以便将它们传递给 librosa.display.waveshow()?
答:
所以事实证明,由于我的代码中的一个错误,我用多个数组填充了列表,这些数组具有这样的符号
] " [
在它们内部,从而引发列表被误认为是字符列表而不是浮点数。修复了此问题,如此线程中的建议:
让 librosa.display.waveshow() 函数使用以下代码:
with open("./test.csv", "r") as csv_file:
reader = csv.reader(csv_file, quoting=csv.QUOTE_NONE)
rows = list(reader)
audiofile = rows[12]
temp_list = audiofile
temp_list = [(str(i).replace('"', '')) for i in temp_list]
temp_list = [(str(i).replace("]", "")) for i in temp_list]
temp_list = [float(str(i).replace("[", "")) for i in temp_list]
myarray = np.asarray(temp_list, dtype=np.float32)
librosa.display.waveshow(myarray)
plt.show()
上一个:使用 python 实现贪婪算法
评论