2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 语音处理 之 fastspeech代码

语音处理 之 fastspeech代码

时间:2023-05-17 12:41:01

相关推荐

语音处理 之 fastspeech代码

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等在提出。也就是说,给定解码器的当前时刻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里这么用

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

"""Constructcharactor/phoneme/positional/speakerembeddings."""#所有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的处理方式不同。

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

反正现在又了解一些了!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。