如何准备一个numpy.ndarray将其传递给librosa.display.waveshow()?

mnemlml8  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(115)

在我的代码中,我阅读了一个列表,其中存储了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'包含了wave文件的所有44100个浮点样本,就像期望的那样。
现在,在我可以用librosa waves显示信号之前,我需要如何将数据放入numpy. ndarray中。
我在这里找到了这个解决方案Convert list elements into array,它建议使用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)


我得到了这个错误:
Traceback(most recent call last):File“/Users/abc/Desktop/Project Python Audio/Datenbankzugriff.py“,line 76,in librosa.display.waveshow(myarray)File“/Users/abc/Desktop/Project Python Audio/.venv/lib/python3.11/site-packages/librosa/display.py”,line 2029,in waveshow util.valid_audio(y,mono=False)File“/Users/abc/Desktop/Project Python Audio/.venv/lib/python3.11/site-packages/librosa/util/utils.py”,line 300,在valid_audio中引发参数错误(“音频数据必须是浮点”)librosa.util.exceptions.参数错误:音频数据必须是浮点
这让我很惊讶,因为数据是浮点的.我如何正确地预处理我的波形样本,然后将它们传递给librosa.display.waveshow()?

0pizxfdo

0pizxfdo1#

原来是因为代码中的一个错误,我用多个数组填充了列表,这些数组有这样的符号
]“[
在它们里面,因此引发了列表被误认为是字符列表而不是浮点数。修复了这个问题,如在这个线程中建议:
ValueError: could not convert string to float: id
使用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()

字符串

相关问题