前提:
MFCC特征是一种声学特征(语音特征可以分为语义特征/声学特征)。
MFCC特征也是一种个性化语音情感特征(语音情感特征可以分为个性化/非个性化语音情感特征)。
由于MFCC是一种个性化语音情感特征,由于说话人的不同MFCC特征的差异也比较大,单纯用MFCC作为特征来进行情感识别的效果就不会很好,因此在MFCC基础上就进行优化修正。
首先提取MFCC的动态差分参数。
dt表示t时刻的一阶差分,Ct表示t时刻的倒谱系数,Q表示倒谱系数的阶数,K表示一阶导数的时间差,我们选取K的值为2。
将求得的结果再次带入式中可以得到二阶差分参数。
我们对MFCC参数、MFCC一阶差分参数和MFCC二阶差分参数求均值,得到优化的MFCC参数,它可以被认为是非个性化语音情感特征。
我选取了前13阶的MFCC系数,所取窗口长度为0.025秒(wintime=0.025s),提取一次MFCC的时间间隔为0.01秒(hoptime=0.01s)。
接下来就是做情感识别任务了,这里对情感的arousal维度(relax - intense)做分类识别,忽略情感的valence维度(pleasant - unpleasant)。由于我的研究内容,我不关注情绪是否是愉快的,只想知道语音情绪的激烈程度,如果你关注语音情绪是否是愉快的,那这个方法可能不适合你。但是仅从arousal维度,这真是一个简单快乐有效的方法。
继续说怎么做情感识别和分类,刚刚得到了优化MFCC,对需要检测的一段时间(e.g.1s)内的所有MFCC参数求均值,得到一个13维的参数,然后再求它的标准差,这个标准差能够表征arousal维度的情感激烈程度。简单地设定阈值进行分类即可。
Likitha曾使用MFCC标准差方法识别了高兴、悲伤和愤怒三种语音情绪,正确率约为80%。
Likitha, M. S., et al. “Speech based human emotion recognition using MFCC.” Wireless Communications, Signal Processing and Networking (WiSPNET), 2017 International Conference on. IEEE, 2017.
附上matlab代码(代码里是个high/low arousal的两分类):
% read file
filename = ['path here'];
[d,sr] = audioread(filename);
d = d(:,1);
% Look at its regular spectrogram
subplot(311)
specgram(d,512,sr)
% Convert to MFCCs very close to those genrated by feacalc -sr 22050 -nyq 8000 -dith -hpf -opf htk -delta 0 -plp no -dom cep -com yes -frq mel -filt tri -win 32 -step 16 -cep 20
[mm,aspc] = melfcc(d*3.3752, sr, 'maxfreq', 8000, 'numcep', 13, 'nbands', 22, 'fbtype', 'fcmel', 'dcttype', 1, 'usecmp', 1, 'wintime', 0.025, 'hoptime', 0.01, 'preemph'