所以,基本上我有大量的基于单词的数据集。每个数据都有不同的时间长度。
这是我的方法:
- 标记给定数据集
- 对训练数据(80%)和测试数据(20%)使用分层KFold拆分数据
- 使用MFCC提取振幅、频率和时间
- 由于从MFCC提取的每个数据的时间序列不同,我想使用DTW使所有数据的时间维度长度完全相同。 然后我将使用DTW数据用神经网络进行训练。
My Question is:
- 我的方法特别是在第4步是正确的吗?
- 如果我的方法是正确的,那么我如何将每个音频转换为与DTW相同的长度?因为基本上我只能比较MFCC数据的两个音频,当我试图更改为其他音频数据时,长度的结果将完全不同。
Ad 1)标签
我不确定你所说的"标签"是什么意思。数据集。现在,你所需要的ASR就是一个话语和相应的文本(例如,搜索CommonVoice来获取一些数据)。这取决于你使用的模型,但神经网络不需要任何分割或额外的标签等。
ad2) KFold交叉验证
交叉验证永远不会有坏处。如果您有时间和资源来测试您的模型,请继续使用交叉验证。在我的例子中,我只是使测试集足够大,以确保我得到一个具有代表性的单词错误率(WER)。但这主要是因为训练一个模型k次是相当努力的,因为asr模型通常需要一些时间来训练。有一些数据集,如librisspeech(和其他),已经为你提供了训练/测试/开发分割。如果你愿意,你可以将你的成绩与学术成绩进行比较。如果他们使用了大量你无法匹配的计算能力(和数据),这可能很难,所以在比较结果时请记住这一点。
ad3) MFCC功能
MFCC工作得很好,但从我的经验和我通过阅读文献等发现,使用log- mel -谱图使用神经网络的性能略高。这不是很多工作来测试他们,所以你可能想尝试log-Mel也。
Ad 4)和5)相同长度的DTW
如果您使用神经网络,例如CTC模型或传感器,甚至变压器,则不需要这样做。音频输入不需要有相同的长度。只要记住一件事:如果你训练你的模型,确保你的批次不包含太多填充。您需要使用一些bucket,例如bucket_by_sequence_length()
。
将批大小定义为"光谱图帧数"。然后使用存储以便真正地利用可用的内存。这对模型的质量有很大的影响。我吃了不少苦头才明白这一点。
注意
你没有指定你的用例,所以我只提到以下几点:你需要知道你想用你的模型做什么。如果模型应该能够消费一个音频流,用户可以任意长时间地说话,你需要从一开始就知道并朝着这个方向努力。
另一种方法是:">我只需要转录短的音频片段。"例如10到60秒左右。在这种情况下,您可以简单地训练任何Transformer,并且由于其注意力机制,您将获得相当好的结果。如果这就是您所需要的,我建议您这样做,因为这会相当容易。但是如果你需要能够长时间播放音频内容,请远离此功能。
事情变得很多当涉及到流媒体时就更复杂了。任何纯粹的基于编码器-解码器注意力的模型都需要大量的努力才能使其发挥作用。你可以使用rnn(例如RNN-T),但这些模型可能变得非常庞大和缓慢,并且需要额外的努力使它们可靠(例如语言模型,波束搜索),因为它们缺乏编码器-解码器的关注。还有其他将变形金刚和换能器结合在一起的风格,但如果你想独自编写所有这些,你将承担相当大的任务。
参见
已经有很多你可以学习的代码了:
- TensorFlowASR (Tensorflow)
- ESPnet (PyTorch)
hth