1.加噪声方法的问题

之前我们采用的方法是,首先将加了背景音乐的语音进行端对端训练,然后在这个模型上覆盖 m*噪声。噪声都是独立同分布的,因此某个点的“重要程度”就由 m 体现出来。m越小,就说明这个点受到噪声干扰更敏感,对结果产生的影响也会更大。但是实际上,结果听上去是反的。将 m 大的点置零,留下 m 小的点,人说话声音反而更模糊,而留下的bgm更清晰。

首先我们意识到,存在大量的空维度,这些空维度可以认为是语音中间的间隔、语素停顿等,容易受到音乐/噪声干扰,因此我们在反向传播时将这些维度置零。但是后来这种操作的结果并不好,仍然是反的。

如果从决策树的角度来看,(猜测)网络首先判断一帧是有声音还是无声音,或者说,判断是人声还是琴声;当判断为是人说话声音之后,再去进一步看是a b c d…判断前者的难度肯定比后者小。因此我们尽管从输出底层将无意义维度的梯度置零了,但从输入前层来看,决策树的第一层(也就是更简单的),相反更脆弱。比如本来是钢琴声/无声,加上噪声后或许就容易被判断为人声。

因此如果这个假设成立,更脆弱的是空白点/钢琴点,而不是人声点。而这些点的区分是通过频率K维度来看的。

2.m不用来加噪声,而是用来散开某个维度

对于fft矩阵的K*T个点,每个点代表某个时间在某个频率上的响度,现在我们将这个点在同一个时间帧上向不同的频率维度散开,用于模糊人声和钢琴/空白。不向四周(时间帧)模糊是因为时间上语音不太可能去重复/倒叠后仍能听出来。

散开的方式可以用高斯分布、二项分布等,为了方便计算,这里我们先使用线性散开,m代表散开的程度(线性波及点的横截距)。

比如原来某点的响度是9,该点的m=3,则将这一个响度9的点拆开成 1 2 3 2 1,起到模糊效果。实际操作时,m为浮点数,进行取整和归一化。

3.思考

如果1中假设成立,就是wav2letter没有注意训练时对抗的情况。而后来我们看到百度的deepspeech可以选择在训练时加入随机噪声等。

另外,散m的方法在图像中或许也有用。之前的传统思路是加噪声,而现在可以用模糊,对于轮廓纹理等的模糊可能有用。