Normal Distribution 称为正态分布,也称为高斯分布,Truncated Normal Distribution一般翻译为截断正态分布,也有称为截尾正态分布。

截断正态分布是截断分布(Truncated Distribution)的一种,那么截断分布是什么?截断分布是指,限制变量xx 取值范围(scope)的一种分布。例如,限制x取值在0到50之间,即{0<x<50}。因此,根据限制条件的不同,截断分布可以分为:

2.1 限制取值上限,例如,负无穷<x<50
2.2 限制取值下限,例如,0<x<正无穷
2.3 上限下限取值都限制,例如,0<x<50
正态分布则可视为不进行任何截断的截断正态分布,也即自变量的取值为负无穷到正无穷;满简单的,能理解。

现在你必须要对它进行整体的理解。

fastspeech与fastspeech实际上用了相同的layer而已。FFT是快速傅里叶变换。

Multi-Head-Attention,相当于h个不同的self-attention的集成,在《Attention Is All You Need》一文中,h=8。然后将所有的self-attention所有节点的值相加并进行归一化。

基本就是如此了,接下来就是要搞懂这个model的全部细节。

Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。

model里有非常多的回调函数,而绝大多数都经常使用的

如果你用自己的语言弄明白它的算法,你就真的都懂了

前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。是目前应用最广泛、发展最迅速的人工神经网络之一。

就是最普通的呗。

以英语-法语翻译为例,给定一对输入序列“they are watching”和输出序列“Ils regardent”,解码器在时刻1可以使用更多编码了“they are”信息的背景向量来生成“Ils”,而在时刻2可以使用更多编码了“watching”信息的背景向量来生成“regardent”。这看上去就像是在解码器的每一时刻对输入序列中不同时刻分配不同的注意力。这也是注意力机制的由来。它最早由Bahanau等在2015年提出。也就是说,给定解码器的当前时刻t′t′,我们需要对编码器中不同时刻tt的隐含层变量求加权平均。而权值也称注意力权重。就是每次突出更新的隐含层变量,就是这样。

实际上这就是自回归用的。

RNN最大的不同之处就是在层之间的神经元之间也建立的权连接。因此隐含层的节点计算是顺序性的,因为需要上一个隐藏节点的输出。多用于时间性的,例如翻译,语音什么的。它的问题是只能记住短暂的时间(实际上仅仅是上一轮是隐含层输出),无法长时间记忆,长梯度消失就是这个问题。解决办法:那当然就是我们的attention啦!但这跟RNN有关系吗?实际上,attention就是RNN的增强版吧。self-attention引入了加权,可以看作attention的增强版吧。

muti-head attention可以类比卷积CNN的多个过滤器。

理解了 scaled dot-product attention 之后,multi-head attention 就好理解了,因为就是 scaled dot-product attention 的 stacking。

在NLP中,文本一般是不定长的,所以在进行 batch训练之前,要先进行长度的统一,过长的句子可以通过truncating 截断到固定的长度,过短的句子可以通过 padding 增加到固定的长度,但是 padding 对应的字符只是为了统一长度,并没有实际的价值,因此希望在之后的计算中屏蔽它们,这时候就需要 Mask。

长度调节器(图1c)用于解决前馈变压器中音素和频谱图序列之间的长度不匹配问题,以及控制语音速度和部分韵律。一个音素序列的长度通常小于其mel频谱图序列的长度,并且每个音素对应于几个mel频谱图。我们将与音素相对应的mel声谱图的长度称为音素持续时间(我们将在下一部分中描述如何预测音素持续时间)。基于音素持续时间d,长度调节器将音素序列的隐藏状态扩展d倍,然后隐藏状态的总长度等于Mel声谱图的长度。

甭管怎么样,它也是最普通的训练方法,大致明白了。一个模型,它也是一个最简单的流,一个batch,这是如何工作的呢?它又是如何反向推导的呢?

简单说 epochs=1 就是完整训练整个样本1次,batchSize 代表在做随机梯度下降时,使用批梯度的数量,即每次使用batchSize个数据来更新参数。

因为有变化了,所以算什么误差函数呢?毕竟后面还有一个梅尔图谱转换嘛。

那现在做什么?生成一个真正的语音,然后做好了。

现在做melgan,看看这个怎么做。

矩阵问题,下午解决这个问题。我现在希望直接造一个带embedding的语音然后交差。

所以分为两个部分,维度的确定和处理,melgan的成功运行

但是现在的错误无法改正,你把这些语音参数列在这里吧:

这个表将对张量Tensorflow更好的认识:

阶    数学实例    Python 例子
0    纯量 (只有大小)    s = 1
1    向量(大小和方向)    v = [1, 2, 3]
2    矩阵(数据表)    m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3    3阶张量 (数据立体)    t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]
n    n阶     ....
张量的第二个属性是张量的维度(shape)。这个属性描述了一个张量的维度信息。
比如上面样例中shape=(2,)说明了张量result是一个一维数组,这个数组的长度是2。
shape=(100,784)    
代表该张量有两个维度,第一个维度长度为100,第二个维度长度为784,二维数组100行784列
shape=(2,) 
代表该张量有一个维度,第一个维度长度为2,一维数组1行2列
# 例:
[[[1,2,3],[4,5,6]]]
# 第一个维度中只有一个元素[[1,2,3][4,5,6]],所以第一个维度长度为1
# 第二个维度中有两个元素[1,2,3][4,5,6],所以第二个维度长度为2
# 第三个维度中有三个元素“1,2,3”或“4,5,6”,所以第三个维度长度为3
# 那么它的shape参数就是[1,2,3]

为什么它的 shape=(1, 10, 384)是如此数据呢?说实话,你理解的还不够深。明白一下,反正内层参数就是384,没别的了。

再学习一下整体的结构

我们的变量适配器不仅包括长度调节,还包括了音高和能量的预测,f0应该是音高。也就是pitch

对于时长预测器,时长是每个音素在对数域上的长度。对于音高预测器,输出序列是帧级F0序列,对于能量预测器,输出是每个mel谱帧的能量序列。所有的预测器共享相同的模型结构但是不同的模型参数。

1、音素时长,代表了语速。2、音高,传达感情的关键,对于感知有着很大的影响。3、能量,指示mel谱的帧级幅度,直接影响mel谱计算的损失。4、感情,风格、说话人等等。变量信息不完全是文本决定的,由于一对多映射问题,是有害于非自回归TTS模型的训练的,在这个阶段,我们描述了细节关于使用音高、能量和时长在【变量adaptor】。

时长:为了提高分割的准确性并减少输入输出之间的信息差距,代替了通过使用预训练自回归TTS提取音素时长,我们提取了音素时长通过MFA,一个高性能的开源的语音文字切割系统,它可以在成对文本音频语料库上训练,而无需任何手动对齐注释。我们转换了MFA的结果到音素级序列并且把它喂给长度修正器(大概是fastspeech里的方法?所谓的LR?)去展开因素序列的隐藏状态

音高和能量:我们提取了F0从原始的波形(用pyworld提的,没有用有/没有声音的flags,直接把没有声音的帧置零,对于合成语音没有影响),提取时候用和目标谱相同的帧移为了观察每一帧的音高,并且计算了每个stft帧的振幅的L2范数作为能量。然后我们量化了每帧的f0和能量到256种可能值(f0是对数刻度的,能量是原始值)并且分别编码他们到一个one-hot矩阵序列中。在训练过程中,我们对音高和能量查表,嵌入到p和e中,(就是常用的lookup embedding?)并将它们添加到隐藏序列中。音高和能量的预测器直接预测F0和能量的值代替one-hot矩阵并用均方误差训练。在推理阶段,我们预测F0和能量使用变量预测器。

继续理解文档吧。

韵律对于合成高自然度的语音非常重要,韵律是很多因素的汇总,比如paralinguistic(副语言信息,重音、语调、语速、流畅度),重读,风格。style是为了给模型对于给定的文本选择合适的表达方式的能力。尽管很难精确的定义,风格包含很多信息,比如意图,情感,并且影响说话人的语调和流畅度的选择。合适的风格渲染会影响整体的感知。对于读小说或者读新闻是很重要的。

张量有些问题唉。

但目的是什么?目的是我要添加进一个参数,这个参数是什么样的呢?

执行了两次应该是两个gpu,

LengthRegulator

LR

这里改到save_model了

炸了啊,感觉代码改不起啊。。。

改掉speaker_id,那么就应该清楚self.embed是从哪里来的?

怪不得,她继承就是为了改掉speaker_id,

self.embeddings = TFFastSpeechEmbeddings(config, name="embeddings")在这里

embedding_output = self.embeddings([input_ids, speaker_ids], training=training)在call里这么用

embedding_output = self.embeddings([input_ids, speaker_ids], training=False)在inference里这么用

class TFFastSpeechEmbeddings(tf.keras.layers.Layer): # 又一个embedding,它是一个层

"""Construct charactor/phoneme/positional/speaker embeddings.""" # 所有embedding都用这么一个,这里不能随便改,只能自己造一个,怪不得,而且这个embeding变成了self.embedding继续使用了。

在fs1中,这里仅仅是在encoder中添加进去了,但是在fs2中,并没有阿。。。

另一个embedding,用于self.position_embeddings,self.encoder_speaker_embeddings,self.decoder_positional_embeddings,self.decoder_speaker_embeddings,前后都有加这个东西。tf.keras.layers.Embedding

一、什么是Embedding
我们可以简单的理解为,将一个特征转换为一个向量。比如最容易理解的one-hot编码。但在实际应用当中,将特征转换为one-hot编码后维度会十分高。所以我们会将one-hot这种稀疏特征转化为稠密特征,通常做法也就是转化为我们常用的embedding。
在NLP领域中,我们需要将文本转化为电脑所能读懂的语言,也就是把文本语句转化为向量,也就是embedding。
需要注意的是:tf.keras.layers.Embbedding()只能作为模型第一层使用。

#vocab_size:字典大小
#embedding_dim:本层的输出大小,也就是生成的embedding的维数
#input_length:输入数据的维数,因为输入数据会做padding(卷积使用)处理,所以一般是定义的max_length
keras.layers.Embedding(vocab_size, embedding_dim, input_length = max_length),就是返回特征嘛

看看这个input是什么?
在fs2中,decoder也是有speaker_id的,天哪。

speaker_embeddings = self.decoder_speaker_embeddings(speaker_ids),input就是这么个东西,明白了吧!天呐。当然了,fs1与fs2引用的还是不一样的,学姐不会是没弄成功吧。。。

反正fs2的self.embeding里面有speaker_id,而且很重要,再看看另一个embedding。

就这里有,我直接重载。。。

TFFastSpeechEmbeddings引用了TFEmbedding!这里实际上是之前添加postion的地方!明白了!

它这里写的不对称啊。。。难道我要自己全部转移过去吗?删掉fs!

你只能说,造成不对称的原因是,encoder与decoder的处理方式不同。

我只要都注释掉加进去的就行了,表面导入我是不用管的!

反正现在又了解一些了!

语音处理 之 fastspeech代码相关推荐

  1. 【IoT】产品模型:智能设备之火情侦查智能车

    本文为笔者团队协作作品,集外观设计.无线音频.无线视频传输技术,无线视频传输具有原创性,仅此一例,现共享方案设计参考. 1.引言 1.1研究本课题的目的和意义 在消防现场,人身安全是一个很大的问题.本 ...

  2. 隐私合规:收集SDK部分介绍

    com.meizu.cloud.pushsdk.SystemReceiver 魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族 push SDK 的客户端实时地推送通知或者消 ...

  3. 《数字语音处理》- 实验4. 基于MATLAB与VQ的特定人孤立词语音识别研究(附代码)

    声明 本文仅在CSDN发布,未经允许请勿转载或引用! 正版链接: https://blog.csdn.net/meenr/article/details/117629850 MATLAB基于VQ的特定 ...

  4. 【语音处理】wav转pcm mp3转pcm Java示例代码

    [语音处理]wav转pcmJava示例代码 都是作者亲测的代码哦.因各个音频之间存在差异导致转换会存在问题.建议大家自己有习惯看源码去了解音频相关知识的能力. 代码地址:https://gitee.c ...

  5. 【语音处理】基于自适应差分脉冲编码调制(ADPCM)的实现研究附Matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步进步,matlab项目目标合作可私信.

  6. 【语音处理】一种增强的隐写及其在IP语音隐写中的应用(Matlab代码实现)

  7. 语音处理的算法和方法研究(Matlab代码实现)

  8. 【语音处理】用于音频盲源分离的谐波矢量分析 (HVA)(Matlab代码实现)

  9. 【语音处理】LQ/QR噪声估计器研究(Matlab代码实现)

最新文章

  1. VMware Virtual SAN存储设计规划
  2. Typora 收费,WTF? 还是需要支持下
  3. Javascript 未结束的字符串常量
  4. Vue.js实现前段评论展示
  5. Makefile中的wilcard函数
  6. 以张鸿蒙系统的手机,搭载鸿蒙系统的手机真的要来了?因为别无选择,所以唯有向前!...
  7. Java教程:Java字符串的替换(replace()、replaceFirst()和replaceAll())
  8. 负载均衡调度算法追溯
  9. 华为交换机vlan划分常用命令
  10. c语言高精度计算函数库
  11. Linux 下的这些高效指令,是你快速入门运维的神器
  12. 雅酷帮微信公众平台操作手册
  13. python上传文件到oss_python实现上传文件到OSS
  14. 软考-信息安全工程师-下午题常考
  15. 全国省市县oracle,最新行政区划 省市区三级 街道乡镇四级 社区/村五级 每月更新(2021年4月版)...
  16. python快乐数,快乐数
  17. 腾讯AI加速器招募再启,AI开放既是工具箱也是方法库?
  18. 短信也能玩出新花样?听阿里云产品运营畅聊“智能消息”服务
  19. 基于Python的中国影业数据分析
  20. 设置canvas画布大小

热门文章

  1. 服务器机柜型号及技术参数
  2. Cyanine5 azide是一种花青素荧光染料,CAS:2183440-50-6
  3. hosts文件 (屏蔽网站)
  4. php excel多级下拉菜单自动匹配,Excel下拉菜单怎么做 多级联动+自动匹配教程
  5. java 二进制运算_java二进制运算基础知识点详解|chu
  6. 【Prometheus】Metric类型的理解及运用
  7. nodeJS入门例子一—插件(Addons)
  8. 面向对象IOS编程中的聚合与耦合
  9. Spring Security是什么?(一)
  10. Marathon和Kubernetes的区别