为定制数据集准备音频数据

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

我想创建一个定制的音频数据集。首先,我需要准备音频数据,以便其组织良好。为了测试和调试我的代码,我使用了一个包含 6 个 WAV 文件的文件夹,名为 WAV_Folder。

我想为所有这 6 个 WAV 文件创建 3 个列表。一份文件名列表、一份文件样本数据列表和一份文件采样率列表(默认为 44,1 kHz)。

这是对应的代码:

import librosa
import sys, os, os.path
from os.path import isfile, join
from pathlib import Path
import glob 
import csv 
import wave

wavnames = [] # list with all of the audiofile's names 
wavsamples = [] # list of lists with all of the audiofile's sample values 
wavsamplerates = [] # list with all of the audiofile's samplerates (default: 44,1 kHz)
path = '/Users/abc/Desktop/WAV_Folder' # folder with all the data to put inside the dataset
pathlist = Path(path).glob('**/*.wav')

def sampled_audiofile(audiofile):
    list_audiosamples_for_one_file = []
    y,sr = librosa.load(audiofile,sr=44100)
    list_audiosamples_for_one_file.append(y)
    return list_audiosamples_for_one_file

for path in pathlist:
    wavnames += pathlist
    path_in_str = str(path)
    wavdata = sampled_audiofile(path_in_str)
    wavsamples += wavdata
    with wave.open(path_in_str, "rb") as wave_file:
        samplerate = []
        value = wave_file.getframerate()
        samplerate.append(value)
        wavsamplerates += samplerate 

如果我接着写

print(wavnames)

我得到:

“/Users/abc/Desktop/Python 音频项目/dataset_creator.py” [PosixPath('/Users/abc/Desktop/WAV_Folder/WAV_NUMBER3.wav'), PosixPath('/Users/abc/Desktop/WAV_Folder/WAV_NUMBER2.wav'), PosixPath('/Users/abc/Desktop/WAV_Folder/WAV_NUMBER6 .wav'), PosixPath('/Users/abc/Desktop/WAV_Folder/WAV_NUMBER5.wav'), PosixPath('/Users/abc/Desktop/WAV_Folder/WAV_NUMBER4.wav')]

这是有问题的,因为名称很长,而且总是缺少一个元素(在本例中为 WAV_NUMBER1.wav) - 我如何修改我的代码,以便

print(wavnames)

将导致:

WAV_NUMBER1
WAV_NUMBER2
WAV_NUMBER3
WAV_NUMBER4
WAV_NUMBER5
WAV_NUMBER6

另外两个列表(wavsamples 和 wavsamplerates)总是以某种方式覆盖自己 - 如果我运行:

print(wavsamples)

我刚刚明白

[数组([2.3782253e-05, 2.0563602e-05, 1.6212463e-05, ..., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00], dtype=float32)]

所以它只是显示一个音频文件的一个数组的样本,而不是代表 6 个音频文件的 6 个数组。

我对第三个也是最后一个列表也有同样的问题。如果我跑步:

print(wavsamplerates)

我得到:

[44100]

似乎我混淆了我的循环/迭代,并且列表/数组一路覆盖了自己......但是由于我是一个使用Python编码的初学者,所以我无法真正破译我哪里出错了以及为什么。如果有人可以帮助我修复我的三个列表,我将不胜感激,因为我认为代码的一般方法还不错。

python audio dataset wav librosa
1个回答
0
投票

事实证明,我正在覆盖我的数组,因为我没有正确集成我的 .append() 。请参阅下面的代码,了解我昨天的原始问题的正确解决方案。

我还找到了关于大文件名问题的一个很好的解决方案。在我的原始代码中,我一直打印整个 posixpath,但现在它只是文件的名称。检查下面的代码。可能对其他人也有帮助。

import numpy as np 
import pandas as pd 
import librosa
import sys, os, os.path
from os.path import isfile, join
from pathlib import Path
import glob
import csv 
import wave

wavnames = [] # list with all of the audiofile's names 
wavsamples = [] # list of lists with all of the audiofile's sample values 
wavsamplerates = [] # list with all of the audiofile's samplerates (default: 44,1 kHz)
path = '/Users/abc/Desktop/WAV_Folder' # folder with all the data to put inside the dataset

def list_files(pfad):
    files = []
    for name in os.listdir(pfad):
        if os.path.isfile(os.path.join(pfad, name)):
            if name.endswith('.wav'):
                files.append(name)
    return files 

wavnames = list_files(path)

files = librosa.util.find_files(path, ext=['wav']) 
files = np.asarray(files)
for y in files: 
    wavsamples += librosa.load(y, sr = 44100)  
    ypathstring = str(y)
    with wave.open(ypathstring, "rb") as wave_file:
        samplerate = []
        value = wave_file.getframerate()
        samplerate.append(value)
    wavsamplerates += samplerate 
© www.soinside.com 2019 - 2024. All rights reserved.