从音频的波形数据中检测说话者的性别

我想在我正在处理的新闻video翻译应用程序中添加性别检测function,以便应用程序可以根据屏幕上的语音在男性和女性语音之间切换。 我不期望100%的准确性。 我使用EZAudio获取音频时间段的波形数据,并使用平均RMS值设置男性和女性之间的阈值(cutOff)值。 最初cutOff = 3.3。

- (void)setInitialVoiceGenderDetectionParameters:(NSArray *)arrayAudioDetails { float initialMaleAvg = ((ConvertedTextDetails *)[arrayAudioDetails firstObject]).audioAverageRMS; // The average RMS value of a time period of Audio, say 5 sec float initialMaleVector = initialMaleAvg * 80; // MaleVector is the parameter to change the threshold according to different news clippings cutOff = (initialMaleVector  23) ? initialMaleVector/2 : 5.3; } 

最初adjustValue = -0.9和tanCutOff = 0.45。 这些值5.3,23,cutOff,adjustValue和tanCutOff都是通过严格的测试获得的。 此外,tan值用于放大值的差异。

  - (BOOL)checkGenderWithPeekRMS:(float)pRMS andAverageRMS:(float)aRMS { //pRMS is the peak RMS value in the audio snippet and aRMS is the average RMS value BOOL male = NO; if(tan(pRMS)  cutOff) { cutOff = cutOff + adjustValue; NSLog(@"FEMALE...."); male = NO; } else { NSLog(@"MALE...."); male = YES; cutOff = cutOff - adjustValue; } } else { NSLog(@"FEMALE."); male = NO; } return male; } 

adjustValue的使用是每次翻译新闻video时校准阈值,因为每个video具有不同的噪声水平。 但我知道这种方法是noob-ish。 我能做些什么来创造一个稳定的门槛? 或者我如何规范化每个音频片段?

从音频波数据中确定性别的替代或更有效的方法也是受欢迎的。

编辑:根据尼古拉的建议,我使用CMU Sphinx研究性别识别。 任何人都可以建议如何使用Open Ears(适用于iOS平台的CMU Sphinx)提取MFCCfunction并输入GMM / SVM分类器?

使用MFCC特征的GMM分类器可以实现准确的性别识别。 你可以在这里读到它:

基于GMM监督员和支持向量机的电话应用的年龄和性别识别

到目前为止,我还没有意识到开源实现,尽管许多组件都可以在CMUSphinx这样的开源语音识别工具包中使用。

通过针对男性和女性的MFCC特征训练GMM分类器,可以实现准确的性别识别。 这是人们可以如何去做。

  1. 人们需要为每个性别收集训练集。
  2. 从各个性别的所有音频中提取MFCCfunction(可以找到像scikit-talkbox等的python实现)。
  3. 从训练集音频中提取用于提取特征的性别的GMM模型。

有关详细信息,这是一个开源的python实现。 以下教程评估从今年(2017年)发布的Google AudioSet中提取的子集的代码

https://appliedmachinelearning.wordpress.com/2017/06/14/voice-gender-detection-using-gmms-a-python-primer/