可以从语音样本中提取很多信息,例如,说话者是谁,说话者的性别是什么,说话的语言是什么,说话者说出的句子有什么情感,数字对话中的说话者等。在机器学习的语音分析领域,性别检测可能是最基本的任务。这篇博客文章致力于通过语音性别检测的Python实现进入语音处理领域。

数据集:可以从此处下载以下数据集。

  1. 训练语料库:训练语料库:
    它是根据YouTube视频开发而成的,每个性别的演讲时间为5分钟,由5位不同的男性和5位女性演讲者(即1分钟/演讲者)讲。
  2. 测试语料库: 它 摘自 Google今年(2017年)最近发布的大型手动注释语料库 “
    AudioSet ”
    。从中构造的子集包含558个仅女性语音和546个仅男性语音。所有音频文件的持续时间均为10秒,并以16000 Hz采样。

我们将简要介绍如何使用语音信号。从训练数据中的语音信号中,将提取一个流行的语音特征,即梅尔频率倒谱系数(MFCC);众所周知,它们包含性别信息(以及其他信息)。这两种性别模型是通过使用另一项著名的ML技术-高斯混合模型(GMM)建立的。GMM将训练样本的MFCC作为输入,并尝试了解它们的分布,这将代表性别。现在,当要检测新语音样本的性别时,首先将提取样本的MFCC,然后将使用经过训练的GMM模型来计算两个模型的特征得分。具有最高分数的模型被预测为测试语音的性别。概述了该方法之后,

  1. 使用语音帧
  2. 提取MFCC功能
  3. 使用GMM训练性别模型
  4. 评估AudioSet语料库的性能

1.使用语音帧

语音信号只是一个数字序列,表示扬声器说出的语音幅度。使用语音信号时,我们需要了解3个核心概念:

1.取景 –由于语音是非平稳信号,因此其频率内容随时间不断变化。为了对信号进行任何形式的分析,例如了解短时间间隔内的频率内容(称为信号的短期傅立叶变换),我们需要能够将其视为固定信号。为了实现这种平稳性,可以将语音信号分为持续时间为20到30毫秒的短帧 ,因为我们的声道形状在这么小的时间间隔内可以保持不变。短于该持续时间的帧将没有足够的采样值来很好地估计频率分量,而在较长的帧中,信号在帧内的变化可能太大,以至于静止状态不再成立。


2.窗口化 –从语音信号中提取原始帧可能会导致端点不连续,这是因为提取的波形中的周期数不是整数,这将导致错误的频率表示(在信号处理术语中称为频谱泄漏 )。通过将窗函数与语音帧相乘来防止这种情况。窗函数的振幅朝其两端逐渐降低至零,因此该乘法使上述不连续点的振幅最小。


3.重叠的帧 –由于开窗,实际上实际上是在帧的开始和结束时丢失了样本;这也将导致不正确的频率表示。为了补偿这种损耗,我们以重叠的帧,而不是不相交的帧,以使得从第i的末端失去了样品第帧和第(i + 1)的开头第帧被全部包括在由重叠形成的框架在这两个帧之间。 帧之间的重叠通常取为10-15毫秒。

2.提取MFCC功能

提取语音帧之后,我们现在继续为每个语音帧导出MFCC特征。语音是由人类通过我们的声道对肺排出的空气进行过滤而产生的。声源(肺)的属性对于所有扬声器都是通用的。它是声道的特性,它负责使信号频谱成形,并且在扬声器之间会发生变化。声道的形状控制产生的声音,而MFCC最能代表这种形状。

MFCC是梅尔频率倒谱系数,是倒谱域中信号的一些变换值。根据语音产生理论,语音被认为是源(从肺排出的空气)和过滤器(我们的声道)的卷积。此处的目的是表征过滤器并删除源部分。为此,

我们首先使用傅立叶变换将时域语音信号转换为频谱域信号,其中源和滤波器部分现在处于相乘状态。
记录转换值的对数,以便源和滤波器现在在对数谱域中可加。使用log从乘法转换到求和,可以很容易地使用线性滤波器将信号源和滤波器分开。
最后,我们对数频谱信号应用离散余弦变换(发现比FFT或I-FFT更成功)来获得MFCC。最初的想法是使用Inverse-FFT将对数频谱信号转换到时域,但“ log”是一种非线性运算,创建了一个称为Quefrency的新频率,或者说它将对数频谱信号转换成了一个称为倒谱域的新域(规格相反)。
MFFC中的“ mel”一词的原因是mel标度,它精确地指定了如何间隔我们的频率区域。与低频时相比,人类在分辨低频时音调的微小变化方面要好得多。合并此比例使我们的功能与人类听到的声音更加匹配。
以上说明只是为了使读者了解这些功能的动机。如果您真的想探索和了解有关MFCC的更多信息,请阅读此博客。您可以找到用于在Internet上提取MFCC的各种实现。我们已经使用了python_speech_features(在这里检查)。您所要做的就是pip install python_speech_features。您也可以安装scikits对话盒。以下python代码是从给定音频中提取MFCC功能的函数。

import python_speech_features as mfcc
def get_MFCC(sr,audio):features = mfcc.mfcc(audio, sr, 0.025, 0.01, 13, appendEnergy = False)features = preprocessing.scale(features)return features

3.训练性别模型

为了从上述提取的特征构建性别检测系统,我们需要对两种性别都进行建模。我们为此任务雇用了GMM。

高斯混合模型是一个概率聚类模型,用于表示总人口中亚人群的存在。训练GMM的想法是通过’ k’ 高斯分布/簇的线性组合(也称为GMM的组成部分)来近似一类的概率分布。模型的数据点(特征向量)的可能性由以下公式给出:
为了从上述提取的特征构建性别检测系统,我们需要对两种性别都进行建模。我们为此任务雇用了GMM。

高斯混合模型是一个概率聚类模型,用于表示总人口中亚人群的存在。训练GMM的想法是通过’ k’ 高斯分布/簇的线性组合(也称为GMM的组成部分)来近似一类的概率分布。模型的数据点(特征向量)的可能性由以下公式给出:
(1)

,在哪里 P_k(X | \ mu_k,\ Sigma_k) 是高斯分布
(2)

训练资料XiX_iXi​ 班上的 λ\lambdaλ 用于估计参数平均值 μμμ ,协方差矩阵 Σ\SigmaΣ 和重量 w 在这k个 成分中

最初,它通过K-means算法识别数据中的k个 簇,并分配相等的权重w=1kw = \frac {1} {k}w=k1​ 每个集群。 然后将k个高斯分布拟合到这k个 聚类。 μμμ,σ\sigmaσ 和www 所有群集中的所有群集都会迭代更新,直到收敛为止。用于此估计的最普遍使用的方法是期望最大化(EM)算法。

from sklearn.mixture import GMM
gmm = GMM(n_components = 8, n_iter = 200, covariance_type='diag',n_init = 3)
gmm.fit(features)

sklearn.mixture我们使用Python的程序包从features包含MFCC功能的矩阵中学习GMM 。该GMM对象需要的部件数量n_components被装配上的数据,迭代的数量n_iter,以用于估计这些n个分量的参数来执行,共方差的类型covariance_type的特征和次数之间假定n_ init的K-表示要进行初始化。保留给出最佳结果的初始化。fit()然后,该函数使用EM算法估算模型参数。
以下Python代码用于训练性别模型。该代码针对每个性别运行一次,并source提供相应性别的培训文件的路径。

#train_models.pyimport os
import pickle
import numpy as np
from scipy.io.wavfile import read
# from sklearn.mixture import GMM
from sklearn.mixture import GaussianMixture as GMM
from sklearn import preprocessing
import warnings
import python_speech_features as mfcc
warnings.filterwarnings("ignore")def get_MFCC(sr,audio):features = mfcc.mfcc(audio,sr, 0.025, 0.01, 13,appendEnergy = False)features = preprocessing.scale(features)return features#path to training data
source   = "E:\\James\\audio\\pygender\\train_data\\youtube\\male\\"
#path to save trained model
dest     = "E:\\James\\audio\\pygender\\"
files    = [os.path.join(source,f) for f in os.listdir(source) iff.endswith('.wav')]
features = np.asarray(());for f in files:sr,audio = read(f)vector   = get_MFCC(sr,audio)if features.size == 0:features = vectorelse:features = np.vstack((features, vector))gmm = GMM(n_components = 8, max_iter = 200, covariance_type='diag',n_init = 3)
gmm.fit(features)
picklefile = f.split("\\")[-2].split(".wav")[0]+".gmm"# model saved as male.gmm
pickle.dump(gmm,open(dest + picklefile,'wb'))
print ('modeling completed for gender:',picklefile)

4.评估AudioSet语料库的子集

在测试语音样本进行性别检测后,我们首先为其提取MFCC功能,帧大小为25 ms,帧之间重叠10 ms。接下来,我们需要样本每一帧的对数似然分数,x1,x2,...,xix_1,x_2,...,x_ix1​,x2​,...,xi​ ,属于每个性别,即 P(xi∣female)P(x_i |female)P(xi​∣female) 和 P(xi∣male)P(x_i |male)P(xi​∣male) 是要计算的。使用(2),通过代入 μμμ,σ\sigmaσ GMM模型的模型。 对模型中的k个高斯分量中的每一个都进行此操作,然后根据取k个 似然的加权总和。w 模型的参数,就像(1)中一样。当对数运算应用于获得的总和时,将为我们提供该帧的对数似然值。对样本的所有帧重复此过程,并添加所有帧的似然度。

与此类似,通过将训练后的男性GMM模型的参数值替换为所有帧并重复上述过程,可以计算出语音是男性的可能性。下面给出的Python代码可以预测测试音频的性别。

#test_gender.py
import os
import pickle
import numpy as np
from scipy.io.wavfile import read
import python_speech_features as mfcc
from sklearn import preprocessing
import warnings
warnings.filterwarnings("ignore")
def get_MFCC(sr,audio):features = mfcc.mfcc(audio,sr, 0.025, 0.01, 13,appendEnergy = False)feat     = np.asarray(())for i in range(features.shape[0]):temp = features[i,:]if np.isnan(np.min(temp)):continueelse:if feat.size == 0:feat = tempelse:feat = np.vstack((feat, temp))features = feat;features = preprocessing.scale(features)return features#path to test data
sourcepath = "E:\\James\\audio\\pygender\\test_data\\AudioSet\\female_clips\\"
#path to saved models
modelpath  = "E:\\James\\audio\\pygender\\"    gmm_files = [os.path.join(modelpath,fname) for fname inos.listdir(modelpath) if fname.endswith('.gmm')]
models    = [pickle.load(open(fname,'rb')) for fname in gmm_files]
print("models",models)
genders   = [fname.split("\\")[-1].split(".gmm")[0] for fnamein gmm_files]
files     = [os.path.join(sourcepath,f) for f in os.listdir(sourcepath)if f.endswith(".wav")]
print("files",files)
for f in files:print (f.split("\\")[-1])sr, audio  = read(f)features   = get_MFCC(sr,audio)scores     = Nonelog_likelihood = np.zeros(len(models))for i in range(len(models)):gmm    = models[i]         #checking with each model one by onescores = np.array(gmm.score(features))log_likelihood[i] = scores.sum()# print("log_likelihood",log_likelihood)winner = np.argmax(log_likelihood)print ("\tdetected as - ", genders[winner],"\n\tscores:female ",log_likelihood[0],",male ", log_likelihood[0],"\n")

使用GMM进行语音性别检测(入门)相关推荐

  1. 使用 Python 进行年龄和性别检测,这个结果搞笑了

    在本文中,我将使用 Python 编程语言带您完成使用机器学习进行年龄和性别检测的任务.年龄和性别检测是计算机视觉的任务,因此我将使用 Python 中的 OpenCV 库. 在开始使用 Python ...

  2. 干货 | 目标检测入门,看这篇就够了(下)

    作者 | 李家丞( 同济大学数学系本科在读,现格灵深瞳算法部实习生) 近年来,深度学习模型逐渐取代传统机器视觉方法而成为目标检测领域的主流算法,本系列文章将回顾早期的经典工作,并对较新的趋势做一个全景 ...

  3. 干货 | 目标检测入门,看这篇就够了(上)

    作者 | 李家丞( 同济大学数学系本科在读,现格灵深瞳算法部实习生) 近年来,深度学习模型逐渐取代传统机器视觉方法而成为目标检测领域的主流算法,本系列文章将回顾早期的经典工作,并对较新的趋势做一个全景 ...

  4. python人脸识别、人脸关键点检测、性别检测

    python人脸识别.人脸关键点检测.性别检测 文章目录 根据人脸预测年龄性别和情绪 (python + keras)(三) 一款入门级的人脸.视频.文字检测以及识别的项目. age-gender-e ...

  5. 小波变换学习~语音端点检测

    参考: 现代语音信号处理,p97 Precise detection of speech endpoints dynamically: A wavlet convolution based appro ...

  6. pytorch实现性别检测

    卷积神经网络的训练是耗时的,很多场合不可能每次都从随机初始化参数开始训练网络. 1.训练 pytorch中自带几种常用的深度学习网络预训练模型,如VGG.ResNet等.往往为了加快学习的进度,在训练 ...

  7. ios apple语音性别_如何使用Apple的CoreML和Vision API构建图像识别iOS应用

    ios apple语音性别 by Mark Mansur 马克·曼苏尔(Mark Mansur) 如何使用Apple的CoreML和Vision API构建图像识别iOS应用 (How to buil ...

  8. 【语音识别】语音端点检测及Python实现

    [语音识别]语音端点检测及Python实现 一.语音信号的分帧处理 二.端点检测方法 2.1.短时能量 2.2.短时过零率 三.Python实现 从接收的语音信号中准确检测出人声开始和结束的端点是进行 ...

  9. matlab浊音段和清音段,基于Matlab编写的语音端点检测1

    wavread 基于Matlab编写的语音端点检测 专业: 班级: 姓名: 指导教师: 2011年6月18日 一.实验目的 1.学会MATLAB的使用,掌握MATLAB的程序设计方法: 3.掌握语音处 ...

  10. MATLAB语音端点检测

    第一章 绪论 Matlab是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交 ...

最新文章

  1. server缺少sqlexpress sql_SQL Server----解决SQL Server 配置管理器不见了
  2. PostgreSQL命令行方式登陆数据库
  3. html5的video元素学习手札
  4. git通过authorized_keys来管理用户的权限(二)
  5. 2022年跨境品牌出海新玩法策略:Tiktok+速卖通平台运营必不可少
  6. 全球 MEDC 2007 举行日期
  7. android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测
  8. 数据挖掘常用聚类算法性能比较
  9. 面试计算机人员试题及答案,【仁宝电脑员工笔试试题及答案】 - 面试网
  10. 【windows】Windows电脑怎么卸载服务/删除服务?
  11. oracle如何给临时表增加字段,Oracle 临时表用法
  12. 8分之七怎么用计算机,如何用八屏电脑看盘
  13. 服务器运行cad慢,CAD绘图唯快不破(CAD运行用加速技巧)
  14. 计算机考研吉大东北大学大连理工,考研就选985/211!这7所985高校却一个A+学科都没有,认真的吗?...
  15. 版署通过《魔兽世界.燃烧远征》
  16. 爬虫 -- 简单封装
  17. Android_GestureDetector手势滑动使用
  18. 技术项目的评审及其标准
  19. AUTOSAR基础篇之DTC
  20. vue 2.0系列QQ音乐播放器案例

热门文章

  1. Suse Enterprise Server 11的安装
  2. C# WinForm技巧“将Form嵌入到Panel”
  3. java 置换_Java中的置换和组合
  4. ieee1284controller怎么添加打印机_讲述3D打印机怎么用 初学者必看
  5. [2018.10.20 T2] 面包
  6. zabbix中文乱码的三种解决办法
  7. windows下调整linux分区大小,如何在Windows 10/8/7中调整分区大小
  8. 细粒度图像分类_基于多尺度拼图块的细粒度图像分类
  9. python数据抓取与实战_Python数据抓取技术与实战 pdf
  10. python优秀源码2019_SUCTF2019,python源码分析,漏洞原理