在学校,我们需要听音程和和弦,并确定它们的名称。我对神经网络非常感兴趣。因此,我想用Python创建一个神经网络,它可以听取音频并输出名称。我曾经学到,对于音乐我需要用到LSTM。对于这个目的我是否也需要LSTM,以及我应该如何开始呢?有谁可以教我如何实现我的目标吗?
回答:
首先,你需要明确定义你想要解决的任务:你是想对整首音乐/曲目进行分类,还是想对曲目/曲目的片段进行分类?这将影响你解决任务所需使用的架构。我将简要介绍每种任务的处理方法。
- 对曲目进行分类:音乐录音是时间序列,你需要为每段录音标记标签。你最初想到使用LSTM(或一般意义上的RNN)是一个很好的想法。只要将你的录音转换成向量作为LSTM网络的输入序列,并让它输出每个类别的概率。正如评论中所指出的,在频域工作可能是有益的。然而,仅使用整个曲目的傅里叶变换很可能会丢失重要信息,因为时间频率信息会丢失。更好的方法是使用短时傅里叶变换(STFT)或梅尔频率倒谱系数(MFCC,这里有一个计算它们的Python库:libROSA)。简单来说,这些方法会将你的时间序列转换成某种“图像”,即二维频谱,而对于图像分类任务,卷积神经网络(CNNs)是首选方法。
- 对片段进行分类:如果你想对曲目的片段进行分类,你需要为歌曲中的每个时间框架提供标签。假设你的歌曲时长为3分钟,采样频率为60 Hz,你的歌曲向量表示将有3*60*60 = 10800个时间框架,因此你需要为每个条目提供一个类别标签(和弦或其他)。同样,你可以使用LSTM,将你的向量作为输入序列,让你的网络生成与歌曲长度相同的输出序列,并与类别标签进行比较。你也可以使用前面提到的STFT或MFC系数作为输入,并利用频率信息,现在你将为每个时间框架提供一个频谱作为输入。
我希望这些广泛的想法能帮助你更接近解决你的任务。对于实现细节,我建议你参考keras文档和网络上无数的教程。
免责声明:
我的音乐理论知识相当有限,所以请对我的回答持保留态度,并随时纠正我或要求澄清。祝你玩得开心