关于声码器的使用

About the usage of vocoders

我是 AI 的新手,我目前正在开发一种用于非并行语音转换的模型。我遇到的一个令人困惑的问题是声码器的使用。

所以我的模型需要 Mel 声谱图作为输入,而我正在处理的当前模型正在使用 MelGAN 声码器 (Github link) which can generate 22050Hz Mel spectrograms from raw wav files (which is what I need) and back. I recently tried WaveGlow Vocoder (PyPI link),它还可以从原始 wav 文件生成 Mel 声谱图并返回。

但是,在其他模型中,例如, WaveRNN , VocGAN , WaveGrad 没有关于 wav 到 Mel 频谱图生成的明确解释。这些模型中的大多数是否不需要 wav 到 Mel 频谱图功能,因为它们主要迎合 Tacotron 等 TTS 模型?还是所有这些都具有该功能而我只是不知道?

如有澄清,将不胜感激。

神经声码器如何处理音频 -> mel

检查例如这部分 MelGAN 代码:https://github.com/descriptinc/melgan-neurips/blob/master/mel2wav/modules.py#L26

具体来说,Audio2Mel 模块仅使用标准方法创建 log-magnitude 梅尔频谱图,如下所示:

  • 通过对输入音频的 windows 应用傅立叶变换来计算 STFT,
  • 获取生成的复杂频谱图的幅度,
  • 将幅度谱图乘以梅尔滤波器矩阵。请注意,他们实际上是从 librosa!
  • 得到这个矩阵的
  • 对生成的梅尔频谱图取对数。

关于混淆

您的困惑可能源于这样一个事实,即深度学习论文的作者通常在谈论“声码器”时只指他们的mel-to-audio“解码器”——audio-to-mel部分总是差不多一样。我说这可能会造成混淆,因为据我了解,术语“声码器”的经典含义包括编码器和解码器。

不幸的是,这些方法并不总是完全有效,例如创建梅尔过滤器矩阵的不同方法、不同的填充约定等。

例如,librosa.stft 有一个 center 参数,可以在应用 STFT 之前填充音频,而 tensorflow.signal.stft 没有这个参数(需要事先手动填充)。

创建梅尔过滤器的不同方法的一个示例是 librosa.filters.mel 中的 htk 参数,它在“HTK”方法和“Slaney”方法之间切换。再次以Tensorflow为例,tf.signal.linear_to_mel_weight_matrix确实支持这个论点,始终使用HTK方式。不幸的是,我对torchaudio不熟悉,所以我不知道你是否也需要小心。

最后,当然还有许多参数,例如 STFT window 大小、跳变长度、梅尔滤波器覆盖的频率等,相对于所使用的参考实现更改这些参数可能会影响您的结果.由于不同的代码存储库可能使用略有不同的参数,我想你的问题的答案是“每种方法都会以相同的方式执行操作(创建梅尔频谱图)吗?”是“不是真的”。在一天结束时,您将不得不接受一组参数...

奖励:为什么这些都是解码器而编码器总是一样的?

Mel -> Audio 方向很难。甚至 Mel -> ("normal") 频谱图也不是 well-defined 因为转换为 mel 频谱是有损的并且不能被反转。最后,将频谱图转换为音频很困难,因为需要估计相位。您可能熟悉 Griffin-Lim 之类的方法(同样,librosa 有它,因此您可以尝试一下)。这些会产生嘈杂的 low-quality 音频。所以研究的重点是使用强大的模型改进这个过程。

另一方面,Audio -> Mel 简单、well-defined 且速度快。无需定义“自定义编码器”。

现在,一个完全不同的问题是梅尔频谱图是否是一种“好的”编码。使用变分自动编码器等方法,您也许可以找到更好的(例如更紧凑、损耗更少)音频编码。这些将包括自定义编码器 解码器,您将无法摆脱标准的 librosa 功能...