为了计算多个wav文件的各项特征并将它们导入到一个csv文件中,我们可以使用Python中的音频处理库Librosa。以下是实现这个任务的代码示例:
import os
import librosa
import numpy as np
import pandas as pd
# 定义要计算的特征函数
feature_funcs = {
'length': librosa.get_duration,
'chroma': librosa.feature.chroma_stft,
'rms': librosa.feature.rms,
'spectral': librosa.feature.spectral_centroid,
'rolloff': librosa.feature.spectral_rolloff,
'zerocrossing': librosa.feature.zero_crossing_rate,
'harmony': librosa.effects.harmonic,
'perceptr': librosa.effects.percussive,
'tempo': librosa.beat.tempo,
'mfcc': librosa.feature.mfcc,
}
# 定义要处理的文件夹路径和要保存到的csv文件路径
input_dir = 'path/to/input/directory'
output_file = 'path/to/output/file.csv'
# 初始化一个空的DataFrame来保存特征数据
df = pd.DataFrame()
# 遍历文件夹中的所有wav文件
for filename in os.listdir(input_dir):
if filename.endswith('.wav'):
filepath = os.path.join(input_dir, filename)
# 使用Librosa加载音频文件
y, sr = librosa.load(filepath)
# 计算每个特征函数的结果并将它们保存到一个字典中
features = {}
for name, func in feature_funcs.items():
if name == 'chroma':
result = func(y=y, sr=sr)
elif name == 'mfcc':
result = func(y=y, sr=sr, n_mfcc=13)
elif name == 'harmony' or name == 'perceptr':
y_harm, y_perc = func(y=y)
result = np.mean(y_harm), np.mean(y_perc)
else:
result = np.mean(func(y=y, sr=sr))
features[name] = result
# 将文件名添加到特征字典中
features['filename'] = filename
# 将特征字典转换为DataFrame并将其添加到总体DataFrame中
df = df.append(pd.DataFrame(features, index=[0]), ignore_index=True)
# 将DataFrame保存到csv文件中
df.to_csv(output_file, index=False)
在这个示例代码中,我们首先定义了一个包含各种要计算的特征函数的字典。然后我们定义了要处理的文件夹路径和要保存到的csv文件路径。接下来,我们使用os.listdir
函数遍历文件夹中的所有wav文件,并对每个文件进行处理。对于每个文件,我们使用Librosa加载音频文件并计算每个特征函数的结果。最后,我们将每个文件的特征结果添加到一个总体的DataFrame中,并将它们保存到csv文件中。