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

问题描述 投票:0回答:1

在我的代码中,我正在读取一个存储 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', ...

等等。这意味着“音频文件”列表包含波形文件的所有 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 floating-point wav librosa
1个回答
0
投票

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

] ” [

在它们内部,从而导致列表被误认为是字符列表而不是浮点数。修复了这个问题,就像这个线程中的建议一样:

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()
© www.soinside.com 2019 - 2024. All rights reserved.