openbrain/pydata-huang/情感识别/huang-emotion-recognition-m.../preprocess.py

42 lines
1.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import librosa
import numpy as np
import soundfile
def extract_feature(file_name, mfcc, chroma, mel):
'''
2.定义一个函数extract_feature从声音文件中提取mfccchroma和mel特征。此函数采用4个参数-文件名和3个布尔参数用于这三个特征
mfcc梅尔频率倒谱系数表示声音的短期功率谱
chroma属于12种不同的音高等级
mel梅尔频谱图频率
使用with-as通过soundfile.SoundFile打开声音文件这样一旦完成将会自动关闭。从中读取
并命名为X。同时得到采样率。如果chroma为True则获取X的Short-Time傅立叶变换。
让结果为一个空的numpy数组。现在对于这三个特征中的每个特征如果存在从librosa.feature
例如对于mfcc为librosa.feature.mfcc调用相应的函数并获取平均值。从numpy中调用带有结果和特征值的函
数hstack并将其存储在结果中。hstack按水平顺序以柱状方式堆叠数组。然后返回结果。
'''
with soundfile.SoundFile(file_name) as sound_file:
X = sound_file.read(dtype="float32")
sample_rate=sound_file.samplerate
if chroma:
stft=np.abs(librosa.stft(X))
result=np.array([])
if mfcc:
mfccs=np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T, axis=0)
result=np.hstack((result, mfccs))
if chroma:
chroma=np.mean(librosa.feature.chroma_stft(S=stft, sr=sample_rate).T,axis=0)
result=np.hstack((result, chroma))
if mel:
mel=np.mean(librosa.feature.melspectrogram(X, sr=sample_rate).T,axis=0)
result=np.hstack((result, mel))
return result