我最近正在研究使用神经网络和CTC损失训练自动语音识别机。但是,我要做的第一件事是准备用于训练模型的数据。由于Librispeech包含大量数据,因此一开始我将使用一个名为“ Mini LibriSpeech ASR语料库”的子集。 (http://www.openslr.org/31/)。另外,我在使用Warn-ctc(https://github.com/SeanNaren/warp-ctc)的SeanNaren Pytorch绑定。
阅读音频文件及其对应的成绩单后,我使用Spicy包来计算每个音频文件的声谱图。当我将频谱图馈送到卷积层以进行特征提取时,就会出现问题。每个频谱图的长度与其他频谱图不同。在对该问题进行了更多搜索之后,我发现我应该将特定数量的帧传递给网络,但是要达到此目的,我需要使用相应的字符(还包含空白符号)标记声音文件的每个帧。
有没有办法在python中做到这一点?
最佳答案
您的问题很广泛:您要照顾音频文件的文字记录吗?如果是这样,它们位于每个目录的文本文件中,每行以文件名开头(不带扩展名)。
您可以在这里查看:https://github.com/inikdom/rnn-speech/blob/master/util/dataprocessor.py
尤其是这种方法,它提供了一个音频文件列表,以及对Librispeech语料库的转录:
def get_data_librispeech(self, raw_data_path):
text_files = self.find_files(raw_data_path, ".txt")
result = []
for text_file in text_files:
directory = os.path.dirname(text_file)
with open(text_file, "r") as f:
lines = f.read().split("\n")
for line in lines:
head = line.split(' ')[0]
if len(head) < 5:
# Not a line with a file desc
break
audio_file = directory + "/" + head + ".flac"
if os.path.exists(audio_file):
result.append([audio_file, self.clean_label(line.replace(head, "")), None])
return result
注意:每个项目的第三个值始终为“无”,因为应该用另一种方法将其替换为音频长度。
您没有在音频的每个帧上标记相应的字符,CTC会通过处理全长音频和相应的脚本来解决这一问题。
关于python - 在pytorch中为ASR加载librispeech,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50993861/