0

我有以下结构。我想遍历子文件夹(机器、枪击)并处理 .wav 文件并在每个类别中构建 mfccresult 文件夹和其中的 .csv 文件。我有以下代码,并且 MFCC 文件夹在已经形成的 MFCC 文件夹中不断形成。

parent_dir = 'sound'
for subdirs, dirs, files in os.walk(parent_dir):

    resultsDirectory = subdirs + '/MFCC/'
    if not os.path.isdir("resultsDirectory"):
        os.makedirs(resultsDirectory)
    for filename in os.listdir(subdirs):
        if filename.endswith('.wav'):
            (rate,sig) = wav.read(subdirs + "/" +filename)
            mfcc_feat = mfcc(sig,rate)
            fbank_feat = logfbank(sig,rate)
            outputFile = resultsDirectory + "/" + os.path.splitext(filename)[0] + ".csv"
            file = open(outputFile, 'w+')
            numpy.savetxt(file, fbank_feat, delimiter=",")
            file.close()
4

2 回答 2

0
for subdir,dirs,files in os.walk(parent_dir):
 for folder in next(os.walk(parent_dir))[1]:
  resultsDirectory= folder + '/MFCC'
  absPath = os.path.join(parent_dir, resultsDirectory)
  if not os.path.isdir(absPath):
    os.makedirs(absPath)
 for filename in os.listdir(subdir):
  print('listdir')
  if filename.endswith('.wav'):
    print("csv file writing")
    (rate,sig) = wav.read(subdir + "/" +filename)
    mfcc_feat = mfcc(sig,rate)
    fbank_feat = logfbank(sig,rate)
    print("fbank_feat")
    outputFile =subdir + "/MFCC"+"/" + os.path.splitext(filename)[0] + ".csv"
    file = open(outputFile, "w+")
    numpy.savetxt(file, fbank_feat, delimiter=",")
    file.close()

此处 csv 文件存储在子目录中,而不是每个类别的 mfcc 文件夹中。我对输出路径文件有疑问。

于 2019-11-13T10:48:54.920 回答
0

你用的是什么版本的python?不确定这是否在过去发生了变化,但os.walk不返回“subdirs”作为元组的第一个,而是返回 dirpath。有关 python 3.6 的信息,请参见此处

我不知道您的绝对路径,但是当您将路径sound作为相对参考传递时,我假设它是您运行 python 代码的目录中的一个文件夹。例如,假设您正在运行这个文件(我们称之为 mycode.py)

/home/username/myproject/mycode.py

你有一些子目录:

/home/username/myproject/sound/

所以:

resultsDirectory = subdirs + '/MFCC/'

如您上面的代码中所写,将解析为:

/home/username/myproject/sound/MFCC/

因此,将输入您的第一个 if 语句,因为这不是现有目录。从而创建一个新目录:

/home/username/myproject/sound/MFCC/

从那里,你拿

filename in os.listdir(subdirs)

这似乎也是对这个函数的输出的误解。os.listdir()将返回目录而不是文件。看到这里的人。

因此,现在您正在遍历以下目录:

/home/username/myproject/sound/

在这里,我假设您已经制作了图表中的一些目录。所以我假设你有:

/home/username/myproject/sound/machine_sound /home/username/myproject/sound/gun_shot_sound

或类似的规定。

因此永远不会输入 if 语句,因为您的目录名称不以“.wav”结尾。

即使它确实进入了,您仍然会遇到问题,因为filename实际上等于machine_sound在第一个循环中,并且gun_shot_sound在第二次循环中。

也许您正在使用其他一些wav库,但是调用了内置的 pythonwave并且您需要wave.open()在文件上调用 not wav.read(). 有关文档,请参见此处。

我不确定你试图通过调用来实现什么,但你可以在这里os.path.splitext(filename)[0]阅读它。不过,你最终会得到与在这种情况下相同的东西,所以和。machine_soundgun_shot_sound

因此,您的输出文件将导致:

/home/username/myproject/sound/MFCC/machine_sound.csv

在第一个循环中,并且

/home/username/myproject/sound/MFCC/gun_shot_sound.csv

第二次通过。

因此,总而言之,我不确定当您说“MFCC 文件夹在已形成的 MFCC 文件夹中不断形成”时发生了什么,但在您理解自己的代码并有任何希望之前,您肯定需要阅读大量内容修复它以做你想做的事。假设您阅读了我提供的链接,您应该能够做到这一点。祝你好运!

此外,您在我编辑的代码中几乎没有错别字,包括非常重要的空白字符。您应该清理它并确保您的代码在此处发布之前运行,然后仔细检查您的复制/粘贴操作没有导致任何错误。如果您稍微整理一下演示文稿,人们会更愿意提供帮助。

于 2019-11-08T14:14:24.263 回答