Python 如何表示用于神经网络的音频文件?

Python 如何表示用于神经网络的音频文件?,python,audio,keras,neural-network,conv-neural-network,Python,Audio,Keras,Neural Network,Conv Neural Network,我想在Keras(tensorflow,python)中创建一个用于音频(MP3,WAV等)文件的基本卷积自动编码器 基本上,我是这样做的: 1)将mp3转换为阵列 def mp3_to_array(original_mp3): blah blah blah return original_array 2) 通过autoencoder运行数组,输出一个类似的数组(但由于autoencoder操作而有损) 3)将阵列转换为mp3 def array

我想在Keras(tensorflow,python)中创建一个用于音频(MP3,WAV等)文件的基本卷积自动编码器

基本上,我是这样做的:

1)将mp3转换为阵列

    def mp3_to_array(original_mp3):
        blah blah blah
        return original_array
2) 通过autoencoder运行数组,输出一个类似的数组(但由于autoencoder操作而有损)

3)将阵列转换为mp3

    def array_to_mp3(new_array):
        halb halb halb
        return new_mp3
我知道Mel频谱图和Mel频率倒谱系数(mfcc)通常用于分类系统。据我所知,我不能使用这些,因为它们不能被转换回mp3而不会造成重大损失

是否有一种基于阵列的无损*(或几乎无损)表示转换方法,适用于卷积神经网络,将mp3转换为阵列,反之亦然

编辑:具体来说,我问的是第1步和第3步。我知道步骤2本质上是有损耗的


提前谢谢

我想说这不是一个关于原始音频表示的问题,而是一个关于是否存在无损卷积变换的问题,对此我会说不

。。。顺便说一句,有很多转换是无损的(或几乎是无损的)例如,当您将音频发送到傅里叶变换以将其从时域转换为频域表示,然后通过将频域表示发送到逆傅里叶变换来执行第二次转换时,您现在将拥有正常的时域音频,该音频将与原始源输入音频相匹配任意精度级别。。。我在写了一个golang项目后知道了这一点,该项目提供了一张输入灰度照片,该照片被解析为将每像素的光强度级别信息合成为单通道音频信号(逆傅里叶变换),然后收听(傅里叶变换)以合成与输入照片匹配的输出照片

如果你关心位级精度(无损),你应该避免使用mp3和使用无损编解码器,或者只是初学者使用WAV格式。。。任何音频CD都使用WAV,这只是PCM中的音频曲线。。。它只是音频曲线上的点(两个通道的采样)。。。在上面的步骤2)中,如果你只是将音频曲线直接输入到你的神经网络中,它将得到你的无损音频数据。。。根据定义,典型的自动编码器的要点是有损转换,因为它会丢弃位级信息

当使用音频作为神经网络的输入时,有几个挑战

1) 音频具有时间特性,因此根据您的需要,您可能需要放大音频样本块(以制作一系列样本窗口),并将每个窗口作为数据单元输入NN,也可能不输入

2) 与图像一样,音频也有大量的数据点。。。也就是说,原始音频曲线上的每个点都是在上游进行采样的,现在通常每通道每秒有44100个采样,其中语义通常是这些采样分组的结果。。。例如,一个口语词是一个聚合概念,很容易涉及数千个甚至可能是上万个音频样本数据点。。。因此,正确创建这些音频样本窗口至关重要。。。创建一个示例窗口时,需要考虑如何创建下一个窗口的设计决策:下一个窗口是否包含前一个窗口中的一些示例,还是所有示例都是新的。。。每个窗口中的音频采样数相同还是不同


所以打开输入音频文件并将其读入缓冲区。。。要确认此缓冲区已创建好,只需将其写入文件,然后播放该文件并验证其播放是否正常。。。使用名为Audacity的免费开源音频工具打开一个音频文件并查看其音频曲线

我想说这不是一个关于原始音频表示的问题,而是一个关于是否存在无损卷积变换的问题,我想说noHi Scott,谢谢你的全面回答——你一直很有帮助。说句公道话,我想我的问题措辞不对。我只需要一个很好的方法将音频(mp3、wav等)转换成一个数组,然后将其传递给NN。我只需要确保将音频转换为阵列的过程不会改变数据,反之亦然。另外,WAV格式也很重要。我刚接触音频,但我完全忽略了这一点。
    def array_to_mp3(new_array):
        halb halb halb
        return new_mp3