【问题标题】:Incorrect ndarray being written to csv不正确的 ndarray 被写入 csv
【发布时间】:2021-07-09 00:24:02
【问题描述】:

我正在尝试为项目生成音频数据集。为此,我正在使用 Librosa 循环播放我的音频文件(45 秒 mp3 剪辑)并将 3 条数据写入 csv。一个是每个剪辑(字符串)的标签,第二个是作为浮点时间序列的音频,第三个是采样率。为此,我正在创建 3 的字典并写入 csv。浮点时间序列是一个 ndarray。当我打印长度时,它返回一个值 992250。当它写入文件时,它写入 7 个值(前 3 个和最后 3 个,中间有一个 '...' 元素。当我在另一个文件中读取文件时验证了这一点函数加载到数据框中。我可以帮助解决这个问题吗?谢谢。

我应该补充一点,我首先尝试创建一个数据框并在此版本之前使用 df.to_csv()。两者都不起作用,它们都有相同的问题。我也在网上查了其他选项,貌似Numpy数组可以直接写入csv?但我还需要每一行都有标签(下面的'ragam')和'sr'。

with open('audio_data.csv', 'w') as f:
  writer = csv.DictWriter(f, fieldnames=headers)
  writer.writeheader()

  for i, file in enumerate(flst):
    if file.endswith(".mp3"):
        audio, sr = librosa.core.load(os.getcwd() + folderpath + "/" + file)
        print(type(audio))
        print(str(len(audio)))
        ragam = file.split(sep='-')[0]
        elem = {
            'ragam': ragam,
            'audio': audio,
            'sr': sr
        }

        writer.writerow(elem)
        print("Completed: " + str(i + 1) + " of " + str(total) + " ...")

我决定将增量附加到 csv,因为它是一个大型数据集,我想尝试保留任何进展,以防中途出现故障。这是一个输出示例。

Loading audio data ...
/usr/local/lib/python3.7/dist-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.
  warnings.warn("PySoundFile failed. Trying audioread instead.")
<class 'numpy.ndarray'>
992250
Completed: 1 of 5 ...

【问题讨论】:

  • CSV 文件是一种糟糕的音频存储方式。它将比未压缩的 .WAV 大 10 倍,后者已经相当大了。只需编写一个函数,从包含音频文件(以及带有元数据的可选 CSV 文件)的文件夹中加载音频数据集。
  • 是的,确实如此。在我实施以下建议后立即实现。我已经有了我的小 mp3 剪辑形式的数据集。第一次使用音频。至少可以说很有趣。

标签: python numpy export-to-csv librosa


【解决方案1】:

方法writerow 将字典elem 中的每个复杂对象转换为其字符串表示形式,这就是您获得此意外输出的原因。

一个简单的解决方法是将np.array 转换为list,即使用

elem = {
    'ragam': ragam,
    'audio': audio.tolist(),
    'sr': sr
}

通过这种更正,输出看起来不错,但列表保存为字符串,因此很难恢复读取输出 csv 的初始数组。

另一种方法是将所有内容保存为 JSON,因为 JSON 本身支持列表和字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2023-03-12
    相关资源
    最近更新 更多