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

How can I prepare a numpy.ndarray to pass it to librosa.display.waveshow()?

提问人:Laulito 提问时间:11/2/2023 更新时间:11/2/2023 访问量:25

问:

在我的代码中,我正在阅读一个列表,该列表存储了 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()?

python numpy 浮点 wav librosa

评论


答:

0赞 Laulito 11/2/2023 #1

所以事实证明,由于我的代码中的一个错误,我用多个数组填充了列表,这些数组具有这样的符号

] " [

在它们内部,从而引发列表被误认为是字符列表而不是浮点数。修复了此问题,如此线程中的建议:

ValueError:无法将字符串转换为浮点数: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()