Deep Voice 3

论文信息

简介

本文提出了一个全卷积架构的语音合成框架
特别地,本文的贡献包括:

  1. 提出了全卷积的字符到频谱的架构,能够在序列上完成并行计算,训练速度比采用循环单元的类似架构快一个数量级
  2. 证明了该架构适用于LibriSpeech数据集,并能快速训练,该数据集包含了2484个发音人的将近820小时的语音数据。
  3. 证明了我们能够生成单调的注意力行为,避免了在语音合成中经常出现的错误情形。
  4. 对于单个说话人,我们比较了不同波形合成方法的质量,包括WORLD、Griffin-Lim和WaveNet
  5. 描述了Deep Voice 3 推理内核的具体实现,其能够在单一GPU机器上每天响应1000万次的查询请求。

模型架构

Model Architecture
Deep Voice3 包括三个部分:

  • Encoder:一个全卷积的编码器,将文本特征转换到中间的学习表示;
  • Decoder: 一个全卷积的因果解码器,采用自回归的方式将从多级卷积注意机制学习到的表示解码到低维音频表示(美尔带频谱);
  • Converter: 一个全卷积的后处理网络,能够从decoder的状态预测最终的输出特征(依赖具体的波形合成方法)。

Convolution Block

Attention Block

结果

MOS

MOS

Tacotron--一种完全端到端的语音合成模型

论文信息

简介

现代的语音合成(Text-to-Speech,TTS)是很复杂的系统流程。对于参数语音合成,包括从语言抽取特征的文本处理、时长模型、声学模型预测声学特征、基于复杂信号处理的声码器。这些模块都是基于专家知识、需要精心设计。另外这些模块都是独立训练的,每个模块的错误会累积成更多的错误。TTS系统的复杂性导致当建立新系统时需要大量的工程量。

TTS是一种转换问题:将高度压缩的文本“解压”成音频。
本文提出了Tacotron,一种引入注意力(attention)机制的基于序列到序列(sequence-to-sequence,seq2seq)的端到端生成式TTS模型。我们的模型将文本字符作为输入、原始语谱图作为输出,并应用一些技术提高seq2seq模型的能力。
Tacotron可以完全地随机初始化、从头开始训练、它不需要音子级别的对齐,所以可以很轻松地利用大量带文本标注的声学数据。

相关工作

WaveNet
DeepVoice
Char2Wav

模型架构

model architecture

Tacotron的主要结构是含有attention机制的seq2seq模型。下图展示了模型结构,包括一个编码器(encoder)、一个基于attention的解码器(decoder)、一个后处理网络。在高一级层次上,模型以字符作为输入,预测帧级别语谱,然后可以进一步转成波形。如下图Figure 1所示。
Tacotron architecture

CBHG

CBHG包括一个1-D的卷积滤波,接着是高通网络以及一个双向GRU。如下Figure 2所示。
CBHG architecture

Encoder

Encoder的目标是提取鲁棒的文本特征序列。encoder的输入是字符序列,每个字符用one-hot向量或者嵌入式连续向量表示。对于每个嵌入式输入,我们应用了非线性变换,称为“pre-net”。在实际应用中,采用dropout瓶颈网络作为pre-net,有助于网络收敛和泛化能力。CBHG模块利用attention模块将per-net的输出转换成最终的encoder表示。我们发现基于CBHG的encoder不仅可以降低过拟合,相对于多层的RNN encoder可以减少发音错误。

Decoder

我们使用简单的全连接输出层来预测decoder的目标。一个重要的技巧是在每个解码步骤预测多个不重叠的输出帧。一次预测r帧,使得整体的decoder数量降低为原来的r分之一,从而减小了模型大小、训练时间和推理时间。更重要的是,这项技巧可以加速收敛速度,并且可以更快地从attention中学到更稳定的对齐。

后处理与波形合成

后处理网络的任务是将seq2seq的输出转换成可以合成波形的输出。
采用Griffin-Lim算法根据预测的语谱合成波形。

模型细节

实验

MOS测试

我们进行了MOS测试,要求被试者根据满分为5分的李克特量表对自然度打分。测试以众包的形式给母语人士测听。
测试结果如Table2所示。
MOS Test

#总结
文章提出了Tacotron,一种端到端的生成式TTS模型,其将字符序列作为输入,语谱作为输出。使用一个简单的波形合成模块,在英文上可以达到3.82的MOS(mean option score,满分为5分)得分,自然度超出了产品级参数合成系统。

leetcode Predict the Winner

Description

Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from either end of the array followed by the player 2 and then player 1 and so on. Each time a player picks a number, that number will not be available for the next player. This continues until all the scores have been chosen. The player with the maximum score wins.

Given an array of scores, predict whether player 1 is the winner. You can assume each player plays to maximize his score.
Example:

1
2
3
4
5
6
Input: [1, 5, 2]
Output: False
Explanation: Initially, player 1 can choose between 1 and 2.
If he chooses 2 (or 1), then player 2 can choose from 1 (or 2) and 5. If player 2 chooses 5, then player 1 will be left with 1 (or 2).
So, final score of player 1 is 1 + 2 = 3, and player 2 is 5.
Hence, player 1 will never be the winner and you need to return False.

The original problem is here.

Read More

word2vec:词表示

前言

介绍

word2vec 是Google 2013年创建的一个项目, 其是“Tool for computing continuous distributed representations of words”。

word2vec 的安装非常简单,得到源码后,直接“make”即可。

原理

针对(大)语料,通过神经网络的训练,得到词表示。

网络结构

  • skipgram
  • cbow

实验

下面就动手做下实验。

总结

2017春节回家记

返乡人潮

腊月二十九请假了一天提前回家,一大早7点的高铁,提前一个小时到车站,也已经是人潮涌动了。
没抢到二等座,就买了一等座,什么都无法阻挡回家的脚步。

人情世故

除了家人团聚,春节最重要的非走亲戚莫属。从初二到初五,不是在亲戚家,就是在走亲戚的路上。
几千年的风俗习惯,几千年的人情世故,流淌在我们心中,延绵不绝。

永恒话题

蓝天白云

和往年不同的是,整个市都禁放鞭炮,买卖鞭炮或者燃放鞭炮都会被严处。
只有在乡下能燃放鞭炮,找回了一些童年时的年味。

转瞬即逝

7天的春节假期,就这样结束了,仿佛昨天才刚刚放假。
假期少了工作的辛苦,多了家庭的琐事;
假期少了打拼的奔波,多了变胖的机会。

LeetCode Total Hamming Distance

Description

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Now your job is to find the total Hamming distance between all pairs of the given numbers.

Example:

Input: 4, 14, 2

Output: 6

Explanation: In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (just showing the four bits relevant in this case).
So the answer will be: HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.

Note:

  1. Elements of the given array are in the range of 0 to 10^9
  2. Length of the array will not exceed 10^4.

The original problem is here.

Read More

LeetCode Verify Preorder Serialization of a Binary Tree

Description

One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node’s value. If it is a null node, we record using a sentinel value such as #.

1
2
3
4
5
6
7
     _9_
/ \
3 2
/ \ / \
4 1 # 6
/ \ / \ / \
# # # # # #

For example, the above binary tree can be serialized to the string “9,3,4,#,#,1,#,#,2,#,6,#,#”, where # represents a null node.

Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.

Each comma separated value in the string must be either an integer or a character ‘#’ representing null pointer.

You may assume that the input format is always valid, for example it could never contain two consecutive commas such as “1,,3”.

Example 1:

“9,3,4,#,#,1,#,#,2,#,6,#,#”
Return true

Example 2:

“1,#”
Return false

Example 3:

“9,#,#,1”
Return false

The original problem is here.

Read More