0

我正在编写一个 python shell 脚本,该脚本可以选择在指定目录中的单个 .wav 文件或所有 .wav 文件上执行一个函数(将一组方法从 2D numpy 数组写入数据文件)。

例如,

> myscript.py --file=audio.wav --data="data.tab"

应该将浮点值写入 data.tab。

> myscript.py --path="path/with/audio_files" --data="data.tab"

应该将一组浮点值写入 data.tab。

我有一个包含一堆 WAV 文件的文件夹。当我在单个文件上执行路径时(使用 --file 选项),结果与使用 --path 选项处理文件时的结果不同。

我已经通过 3 种方式实现了路径文件:

1) 使用 os.listdir()

for audioFile in os.listdir(options.path):
    if audioFile.endswith('.wav'):
        foo(audioFile)

2) 使用 os.walk()

for r, d, f in os.walk(options.path):
for audioFile in f:
    if audioFile.endswith('.wav'):
            foo(audioFile)  

3) 使用 glob.glob()

for audioFile in glob.glob("*.wav"):
    foo(audioFile)

方法 1 和 2 返回相同的结果。方法 3 返回不同的结果。与处理单个文件相比,所有 3 种方法都返回不同的结果。

当我使用 os 或 gob 模块时有什么不同?

编辑:这是我处理目录中所有 .wav 文件的地方:

for r, d, f in os.walk(options.path): 
    for audioFile in f:
        if audioFile.endswith('.wav'):  
            # Add MFCC 1-12 to data.
            mfcc12(audioFile, sampleRate, data)

这是在 mfcc12() 中:

# mfccs is a 2D numpy array. 
# Each column corresponds to one feature of the audiofile
for i in range(mfccs[0].size):
    mfccMean = mfccs[:, i].mean()
    mfccStdDev = mfccs[:, i].std()  
    data.write(str(mfccMean) + '\t' + str(mfccStdDev) + '\t')

我正在使用YAAFE从音频文件中提取特征。

4

2 回答 2

1

这些glob函数执行 Unix 风格的操作,即省略名称以 开头的文件.

>>> os.listdir('.')
['conn.c', 'Makefile', 'conn.o', '.depend', 'conn.c.orig', 'conn']
>>> glob.glob('*')
['conn.c', 'Makefile', 'conn.o', 'conn.c.orig', 'conn']

(注意,fnmatch.fnmatch这样做;跳过点文件的代码在 中glob.glob1)。大概你有一些点文件。

于 2012-04-26T04:47:01.867 回答
0

我想我解决了这个问题。问题不在于我的 mfcc 提取设置,而不在于 Python 代码。

于 2012-04-26T22:17:30.453 回答