基于高斯混合模型的语音转换(Voice conversion based on Gassian mixture model)

任务:
把说话人A的声音转换成说话人B的声音,保持语义信息不变。
实验部分:男女声转换

概述

语音合成任务:

  • 语音转换(Voice Conversion, VC)
  • 文语转换(Text to Speech, TTS)
  • 语音生成(Voice Generation, VG)

今天主要学习语音转换VC任务。

语音转换

将语音经过预处理特征分析提取,然后特征配准,再训练一个转换模型,得到映射关系。

特征提取

红框部分,就是声码器的工作,分解信号,合成信号。
1.常用声码器:World,STRAIGHT, Griffin-Lim(具体原理搜我博客)
2. 如这次用到的STRAIGHT,将信号分解为三部分:
---- F0基频(浊音):反映声音语调,声音的整体调域。
---- 频谱(梅尔倒谱):主要特征,反映声音中的细节,大部分语义信息,说话人信息。
----非周期特征(清音):反映声音中非周期变化。

特征对齐

最常用的就是动态时间规则DWT算法(具体原理搜我博客)。

为了解决原语音与目标语音不等长问题,DWT算法根据相似性,建立了对应关系,形成源+目标特征对。

转换模型

基于GMM的特征映射
任务: 已知联合分布,求解条件分布。
原理: 假设原始语音x,目标语音y都是高斯的,所以联合起来也是高斯的。利用若干个高斯如m个,来拟合信号的分布。训练一个GMM模型,就能得到联合分布的均值,方差,就可以求条件分布。

具体来看y是如何求解的?
条件概率的求解

第一部分:已知输入信号x,该x属于每一个高斯成分m=1~M的概率。

第二部分:在这个第m个高斯下,已知x,能产生出y的概率。

其中,E和D都有闭式解:

这样,就能求解y:

可以看到,一个xt算一个yt,就是最小均方误差求解。这种转换算法效果差点,是因为没有考虑帧间信息。

转换模型改进

针对GMM转换存在问题,2007年Toda等人提出了改进方法。


主要改进了三部分:
1.引入动态成分
2.将最小均方误差估计,改为最大似然估计。评估一组数据,而不是单一一帧,充分考虑序列整体性。
3.引入全局方差(GV,Global Variance)。使最终转换结果与目标分布更加接近。

具体算法:
1.此时,x不再是一帧一帧,而是一组帧,T帧,y也是。

2.引入相邻帧之间的差值(动态成分):

Y和y之间关系为:Y=W*y

3.从而得到序列X和Y,还有联合特征的数据:

4.用最大似然估计求解:

要让上面式子值最大。
每部分含义和上面的类似。
第一部分:已知输入X的第t帧,该Xt属于每一个高斯成分m=1~M的概率。

第二部分:在这个第m个高斯下,已知X,能产生出Y的概率。

推导可得,当E和D等于如下值时,似然值最大:

为了计算简便,对似然函数进行了化简:
定了哪个m,只取概率最大的那个m。

最终解:
将Y=W*y代入,得:

这样就实现了序列级别的转换。

代码实现

用机器学习中常用的库函数sklearn。

import sklearn.mixture
from sklearn.mixture.gaussian.mixuture import _compute_precious_cholesky

E的具体函数如下:

D的函数,还有转换函数:

全局方差的实现:
对转换后的特征方差分布,进行调整,使其符合目标特征的方差分布。

算法实现

下面介绍具体的GMM语音转换。

  1. 数据准备:如男女声声音文件各70条。

  2. 特征提取:
    ---- F0基频(浊音):反映整个声音的整体调域。
    ----mcep 频谱(梅尔倒谱):主要特征,反映声音中的细节,大部分语义信息,说话人信息。
    ----ap非周期特征(清音):反映声音中非周期变化。
    ----npow:反映每帧能量,为了去静音帧。

  3. 统计信息计算:F0均值方差(单高斯转换),mcep的方差的均值和方差GV(GMM转换),利用GV进行特征修正(计算训练数据转换后的特征的方差的均值和方差)

  4. 特征配对:DWT

  5. 训GMM:训mcep特征对,训好的叫converter

  6. 特征修正:计算训练数据输入converter后,即转换后的特征方差的均值和方差

代码:GMM语音转换

工程目录包含:
config.py:相关参数设置
feature.py:特征提取
statistics.py:计算统计特征(GV)
jointfeature.py:特征配对
model.py:训练GMM,生成转换器,GV修正
main.py:主函数

比如config.py里:

config_all={"path_fea":"data/","path_model":"model/","Feature":{   "fs": 22050,"minf0":40,#搜索范围"maxf0":700, "shiftms":4.988662131519274,#与fs对应"fftl":1024,# mecp 部分"dim_mcep":34, #"alpha" :0.455   },"GMM-mcep":{"sd":1, # mcep特征从第1维往后,不要第0维(DFT第一维表示均值,直流分量)"n_mix": 32, #混合成分"n_iter": 100, #训练迭代次数"cvtype": "mlpg", #转换方式最大似然},"GV_morph_coeff": 1.0 #GV修正系数
}

新建三个文件夹:
scp:存放训练数据描述文件
data:存放提取的特征
model:存放GMM模型,及f0和GV参数

下载数据集:
VCC2018公共数据集

学习笔记:基于GMM的语音转换(超详细)相关推荐

  1. 【NLP】自然语言处理学习笔记(二)语音转换

    前言 本笔记参考的课程是李宏毅老师的自然语言处理 课程Link:https://aistudio.baidu.com/aistudio/education/lessonvideo/1000466 Vo ...

  2. python学习笔记之numpy库的使用——超详细

    文章目录 NumPy介绍 一.如何创建 1.导入Numpy库,并命名为np: 2.查看版本 3.通过列表创建一维数组: 4.通过列表创建二维数组: 5.创建全为0的二维数组 6.创建全为1的三维数组 ...

  3. 数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o

    目录 前言 一.顺序表的定义 二.顺序表的初始化 三.顺序表的建立 四.顺序表的输出 五.顺序表的逆序输出 六.顺序表的插入操作 七.顺序表的删除操作 八.顺序表的按位和按值查找 基本操作的完整代码 ...

  4. 计算机网络学习笔记第一章(概述) 超详细整理

    计算机网络笔记整理 笔记根据B站 计算机网络微课堂(有字幕无背景音乐版)(陆续更新中-) 视频整理 原笔记链接 计算机网络,在原笔记的基础上添加了个人的部分理解,十分感谢这位同学. 目录 图示说明 1 ...

  5. 学习笔记:运算放大器(OPA)超详细讲解(内含运用电路仿真)

    一运算放大器的简介 放大器(简称"运放")是具有很高放大倍数的电路单元.运算放大器是一个内含多级放大电路的电子集成电路.分别是输入级,中间级,发大级还有偏置电路. 红色绿色蓝色分别 ...

  6. react学习笔记(完整版 7万字超详细)

    1. React基础 1-1. react-调试插件安装 浏览器右上角 - ===> 更多工具 ===> 扩展程序 ==> 开启开发者模式 ==> 将调试插件包拖拽进来即可 1 ...

  7. STM32学习笔记——基于正点原子例程编码器模式小结

    STM32学习笔记--基于正点原子例程编码器模式小结 最近一段时间学习了,STM32f4的编码器功能,经过自己探索和他人的热心帮助,对于编码器模式有了一定了解.STM32f4单片机提供编码器模式,以便 ...

  8. 激光slam学习笔记——基于图优化的激光slam方法

    激光slam学习笔记--基于图优化的激光slam方法 1.slam基础 整体来说,在激光slam中,滤波器的误差要小于图优化的误差. 图优化通俗点说就是里程计计算的位姿与观测到的位姿之间会形成一个误差 ...

  9. 嵌入式学习笔记——基于Cortex-M的单片机介绍

    基于Cortex-M的单片机介绍 前言 1生产厂商及其产品线 1.1ARM单片机的产品线 1.2命名规则 作业1 2习单片机的资料准备 2.1STM32开发所需手册 2.1.1芯片的数据手册 芯片基本 ...

最新文章

  1. 微服务架构的优势与不足(三)
  2. 提交调用验证_干货丨RPA验证码识别技巧
  3. 【建议收藏】复盘:2021年最新、最全、最实用的Android岗学习资料/面试真题
  4. python代码图片-python实现图片上添加图片
  5. Windows系统下多显示器模式开发
  6. anaconda对应python版本_Python基础——如何查看python版本、如何查看多个python版本
  7. Mac Big Sur如何更改锁屏时间
  8. Kubelet 对资源紧缺状况的应对
  9. DOS批处理不支持将UNC 路径作为当前目录的巧妙解决方案
  10. es6箭头函数内部判断
  11. ***git自动化部署总结
  12. JavaScript学习之函数的定义方式及调用
  13. python向mysql插入数据
  14. Numpy之文件存取
  15. cmd查看mysql的ip地址_怎么在cmd中查看数据库ip地?
  16. Html + Java登录验证码实现代码
  17. 【软件】如何批量手机号码归属地查询并且快速分类?批量号码归属地告诉查询分类系统怎么使用?全部教会你
  18. java下拉刷新上拉加载_使用PullToRefresh实现下拉刷新和上拉加载
  19. el-table实现动态表格插入行(开发小记)
  20. 7.8 Cound 练习

热门文章

  1. 探索编译软件栈新范式;高端GPU禁售的影响;陈天奇DL系统免费课程|AI系统前沿动态
  2. 评测丨用数字带你综合体验海思Hi3519A开发板性能
  3. UEFI0067:A PCIe link training failure is observed in PCIe Slot 3 and the link is disabled. (已解决)
  4. win10系统解决cmd不是默认管理员打开的办法
  5. XMind 8 破解注册 思维导图(亲测可用)
  6. ubantu 18.04.4下载
  7. ASEMI整流桥KBPC3510,KBPC3510封装,KBPC3510应用
  8. webpackjsonp 还原_碱式碳酸铅作为电化学稳定的活性相用于电催化CO2还原制备甲酸盐...
  9. 主页设计中配色方案的使用
  10. Android手机APK功耗、流量、内存测试方法