使用 MFCC 和 DTW 进行语音识别
Speech Recognition with MFCC and DTW
所以,基本上我有大量基于单词的数据集。
每个数据绝对有不同的时间长度。
这是我的方法:
- 标记给定的数据集
- 使用分层 KFold 对训练数据 (80%) 和测试数据 (20%) 拆分数据
- 使用 MFCC 提取幅度、频率和时间
- 因为每次MFCC提取的数据Time-series不一样,所以想用DTW让所有的数据时间维度长度完全一致
- 然后我将使用 DTW 数据用神经网络对其进行训练。
我的问题是:
- 我的方法(尤其是第 4 步)是否正确?
- 如果我的方法是正确的,那么如何使用 DTW 将每个音频转换为相同的长度?
因为基本上我只能比较 MFCC 数据的两个音频,当我尝试更改为其他音频数据时,长度的结果将完全不同。
广告 1) 标签
我不确定您所说的“标记”数据集是什么意思。如今,ASR 所需要的只是一个话语和相应的文本(例如搜索 CommonVoice 以获取一些数据)。这取决于您使用的模型,但神经网络不需要为此任务进行任何分割或额外标记等。
广告 2) KFold 交叉验证
进行交叉验证永远不会有坏处。如果您有时间和资源来测试您的模型,请继续使用交叉验证。我,就我而言,只是让测试集足够大,以确保我得到一个有代表性的单词错误率 (WER)。但这主要是因为训练模型 k 次非常费力,因为 ASR 模型通常需要一些时间来训练。有一些数据集,例如 Librispeech(和其他)已经有一个 train/test/dev 拆分供您使用。如果需要,您可以将您的成绩与学业成绩进行比较。但是,如果他们使用了大量您无法匹配的计算能力(和数据),那么在比较结果时请记住这一点。
广告 3) MFCC 功能
MFCC 工作正常,但根据我的经验和我通过阅读文献等发现的结果,使用神经网络使用 log-Mel-spectrogram 的性能略高。对它们进行测试并不是很多工作,因此您可能也想尝试 log-Mel。
相同长度的 Ad 4) 和 5) DTW
如果您使用神经网络,例如CTC 模型或换能器,甚至是变压器,您不需要这样做。音频输入不需要具有相同的长度。只需记住一件事:如果您训练模型,请确保您的批次不包含太多填充。你想使用像 bucket_by_sequence_length()
.
这样的分桶
只需将批量大小定义为“频谱图帧数”,然后使用分桶以真正利用可用内存。这确实可以对模型的质量产生巨大的影响。我通过艰难的方式了解到这一点。
备注
你没有指定你的用例,所以我只提以下几点:你需要知道你想用你的模型做什么。如果模型应该能够使用音频流 s.t。一个用户可以讲任意长的时间,你需要从一开始就知道并朝着这个方向努力。
另一种方法是:“我只需要转录较短的音频片段。”例如10到60秒左右。在这种情况下,您可以简单地训练任何 Transformer,并且由于其注意力机制,您将获得非常好的结果。如果这就是您所需要的,我建议走那条路,因为这相当容易。但如果您需要能够更长时间地流式传输音频内容,请远离此选项。
在流媒体方面,事情变得 很多 更复杂。任何纯粹基于编码器-解码器注意力的模型都需要大量的努力才能完成这项工作。您可以使用 RNN(例如 RNN-T),但这些模型可能会变得非常庞大和缓慢,并且需要额外的努力才能使它们可靠(例如语言模型、波束搜索),因为它们缺乏编码器-解码器注意力。还有其他风格将 Transformers 与 Transducers 结合在一起,但如果您想自己编写所有这些,一个人,您将承担相当大的任务。
另见
已经有很多代码可供您学习:
- TensorFlowASR(张量流)
- ESPnet (PyTorch)
hth
所以,基本上我有大量基于单词的数据集。 每个数据绝对有不同的时间长度。
这是我的方法:
- 标记给定的数据集
- 使用分层 KFold 对训练数据 (80%) 和测试数据 (20%) 拆分数据
- 使用 MFCC 提取幅度、频率和时间
- 因为每次MFCC提取的数据Time-series不一样,所以想用DTW让所有的数据时间维度长度完全一致
- 然后我将使用 DTW 数据用神经网络对其进行训练。
我的问题是:
- 我的方法(尤其是第 4 步)是否正确?
- 如果我的方法是正确的,那么如何使用 DTW 将每个音频转换为相同的长度? 因为基本上我只能比较 MFCC 数据的两个音频,当我尝试更改为其他音频数据时,长度的结果将完全不同。
广告 1) 标签
我不确定您所说的“标记”数据集是什么意思。如今,ASR 所需要的只是一个话语和相应的文本(例如搜索 CommonVoice 以获取一些数据)。这取决于您使用的模型,但神经网络不需要为此任务进行任何分割或额外标记等。
广告 2) KFold 交叉验证
进行交叉验证永远不会有坏处。如果您有时间和资源来测试您的模型,请继续使用交叉验证。我,就我而言,只是让测试集足够大,以确保我得到一个有代表性的单词错误率 (WER)。但这主要是因为训练模型 k 次非常费力,因为 ASR 模型通常需要一些时间来训练。有一些数据集,例如 Librispeech(和其他)已经有一个 train/test/dev 拆分供您使用。如果需要,您可以将您的成绩与学业成绩进行比较。但是,如果他们使用了大量您无法匹配的计算能力(和数据),那么在比较结果时请记住这一点。
广告 3) MFCC 功能
MFCC 工作正常,但根据我的经验和我通过阅读文献等发现的结果,使用神经网络使用 log-Mel-spectrogram 的性能略高。对它们进行测试并不是很多工作,因此您可能也想尝试 log-Mel。
相同长度的 Ad 4) 和 5) DTW
如果您使用神经网络,例如CTC 模型或换能器,甚至是变压器,您不需要这样做。音频输入不需要具有相同的长度。只需记住一件事:如果您训练模型,请确保您的批次不包含太多填充。你想使用像 bucket_by_sequence_length()
.
只需将批量大小定义为“频谱图帧数”,然后使用分桶以真正利用可用内存。这确实可以对模型的质量产生巨大的影响。我通过艰难的方式了解到这一点。
备注
你没有指定你的用例,所以我只提以下几点:你需要知道你想用你的模型做什么。如果模型应该能够使用音频流 s.t。一个用户可以讲任意长的时间,你需要从一开始就知道并朝着这个方向努力。
另一种方法是:“我只需要转录较短的音频片段。”例如10到60秒左右。在这种情况下,您可以简单地训练任何 Transformer,并且由于其注意力机制,您将获得非常好的结果。如果这就是您所需要的,我建议走那条路,因为这相当容易。但如果您需要能够更长时间地流式传输音频内容,请远离此选项。
在流媒体方面,事情变得 很多 更复杂。任何纯粹基于编码器-解码器注意力的模型都需要大量的努力才能完成这项工作。您可以使用 RNN(例如 RNN-T),但这些模型可能会变得非常庞大和缓慢,并且需要额外的努力才能使它们可靠(例如语言模型、波束搜索),因为它们缺乏编码器-解码器注意力。还有其他风格将 Transformers 与 Transducers 结合在一起,但如果您想自己编写所有这些,一个人,您将承担相当大的任务。
另见
已经有很多代码可供您学习:
- TensorFlowASR(张量流)
- ESPnet (PyTorch)
hth