1

所以,基本上我有大量基于单词的数据集。每个数据绝对具有不同的时间长度。

这是我的方法:

  1. 标记给定的数据集
  2. 对训练数据 (80%) 和测试数据 (20%) 使用分层 KFold 拆分数据
  3. 使用 MFCC 提取幅度、频率和时间
  4. 因为来自 MFCC 提取的每个数据的时间序列都不同,所以我想使用 DTW 使所有数据的时间维度长度完全相同。
  5. 然后我将使用 DTW 数据通过神经网络对其进行训练。

我的问题是:

  1. 我的方法,尤其是在第四步中的方法是否正确?
  2. 如果我的方法是正确的,我如何将每个音频转换为与 DTW 相同的长度?因为基本上我只能比较 MFCC 数据的两个音频,当我尝试更改为其他音频数据时,长度的结果将完全不同。
4

1 回答 1

1

广告 1) 标签

我不确定您所说的“标记”数据集是什么意思。如今,ASR 所需的只是话语和相应的文本(例如搜索 CommonVoice 以获取一些数据)。这取决于您使用的模型,但神经网络不需要任何分割或额外的标签等来完成这项任务。

广告 2) KFold 交叉验证

进行交叉验证永远不会受到伤害。如果您有时间和资源来测试您的模型,请继续使用交叉验证。在我的例子中,我只是让测试集足够大,以确保我得到一个有代表性的单词错误率(WER)。但这主要是因为训练模型 k 次是一项相当大的工作,因为 ASR 模型通常需要一些时间来训练。有一些数据集,例如 Librispeech(和其他),它们已经为您提供了训练/测试/开发拆分。如果您愿意,您可以将您的结果与学术结果进行比较。但是,如果他们使用了大量您无法匹配的计算能力(和数据),这可能会很困难,因此在比较结果时请记住这一点。

广告 3) MFCC 功能

MFCC 工作正常,但根据我的经验以及通过阅读文献等发现的结果,使用对数梅尔谱图在使用神经网络时性能略高一些。测试它们并不是很多工作,因此您可能也想尝试 log-Mel。

广告 4) 和 5) DTW 相同长度

如果您使用神经网络,例如 CTC 模型或 Transducer,甚至是 Transformer,您不需要这样做。音频输入不需要具有相同的长度。只需记住一件事:如果您训练模型,请确保您的批次不包含太多填充。你想使用一些像bucket_by_sequence_length().

只需将批量大小定义为“频谱图帧数”,然后使用分桶来真正利用可用的内存。这确实可以对模型的质量产生巨大的影响。我很难学到这一点。

笔记

你没有指定你的用例,所以我只提以下几点:你需要知道你想用你的模型做什么。如果模型应该能够使用用户可以任意长时间交谈的音频流,那么您需要从一开始就知道并朝着这个方向努力。

另一种方法是:“我只需要转录简短的音频片段。 ”例如 10 到 60 秒左右。在这种情况下,您可以简单地训练任何 Transformer,并且由于其注意力机制,您将获得非常好的结果。如果这就是你所需要的,我建议你走那条路,因为这要容易得多。但是,如果您需要能够更长时间地流式传输音频内容,请远离这种情况。

当涉及到流媒体时,事情变得更加复杂。任何纯粹基于编码器-解码器注意力的模型都需要付出很多努力才能完成这项工作。您可以使用 RNN(例如 RNN-T),但这些模型可能会变得非常庞大和缓慢,并且需要额外的努力才能使其可靠(例如语言模型、波束搜索),因为它们缺乏编码器-解码器的关注。还有其他将 Transformer 与 Transducers 结合在一起的风格,但如果您想自己编写所有这些,独自一人,您将承担相当大的任务。

也可以看看

已经有很多代码可供您学习:

hth

于 2021-02-18T08:24:04.830 回答