librosa ParameterError:音频缓冲区不是到处都是有限的(剪切WAV文件)

时间:2019-07-18 15:19:30

标签: python wav librosa

我正在训练一个称为DeWave(https://github.com/chaodengusc/DeWave)的Python音频源分离模型包。它是在单通道.wav文件上训练的。训练模型后,我对.wav样本进行了推断(以将单声道音频测试文件中的两个扬声器源分开)。这很好,除非,如果我剪切了.wav文件,在这种情况下,我从librosa收到一条错误消息,指出音频缓冲区并非在每个地方都是有限的。

我尝试对不同的音频文件进行推断,并且仅当我使用外部软件剪切.wav文件时才会发生错误(我尝试使用sox和Zamzar进行剪切)。我想知道文件切割是否会擦除缓冲区,但是我通常对缓冲区不熟悉,因此对于如何解决此问题,我们将不胜感激。

用librosa编写的主要代码是https://github.com/chaodengusc/DeWave/blob/master/DeWave/infer.py

中的这些行
import Geohash from 'latlon-geohash';

预期的输出将是两个单独的.wav文件,它们的长度相同,每个文件中有一个扬声器,而另一个扬声器正在讲话时保持静音。但是,出现此错误:

## restore the original audio
        len1 = len(out_audio1) // 3
        len2 = len(out_audio2) // 3
        source1 = out_audio1[len1:2*len1]
        source2 = out_audio2[len2:2*len2]
        librosa.output.write_wav(input_file[0:-4]+"_source1.wav", source1, SAMPLING_RATE)
        librosa.output.write_wav(input_file[0:-4]+"_source2.wav", source2, SAMPLING_RATE)
        return [(source1, SAMPLING_RATE), (source2, SAMPLING_RATE)]

1 个答案:

答案 0 :(得分:0)

我知道我要迟到三个月,但我的回答可能会对其他人有所帮助。在我的情况下,原因是音频数据中有一些nan值。这就是librosa抛出Audio buffer is not finite everywhere的原因。

我创建了这个简单的代码来解释我的意思:

>>> import librosa
>>> import numpy as np

>>> f = 500 # frequence in Hz
>>> sr = 16000 # sample rate in bit/sec
>>> t = 2  #time in seconds

>>> samples = np.linspace(0, t, int(sr*t), endpoint=False)
>>> wav = np.sin(2 * np.pi * f * samples)
>>> librosa.output.write_wav('beeb.wav', wav, sr)
# works fine

之前的代码段将创建一个哔哔声,持续2秒钟。这是使用具有500 HZ频率和16k采样率的正弦波完成的。前面的代码应该可以正常工作,没有错误。

现在,我将在nan后面附加一个wav值以重现相同的错误:

>>> wav = np.append(wav, np.nan) 
>>> librosa.output.write_wav('beeb2.wav', wav, sr)
Traceback (most recent call last):
  File "/home/anwar/Desktop/mayhem.py", line 10, in <module>
    librosa.output.write_wav('beeb2.wav', wav, sr)
  File "</media/anwar/E/ASR/Deep-Speech/lib/python3.7/site-packages/decorator.py:decorator-gen-10>", line 2, in write_wav
  File "/media/anwar/E/ASR/Deep-Speech/lib/python3.7/site-packages/librosa/util/decorators.py", line 58, in __wrapper
    return func(*args, **kwargs)
  File "/media/anwar/E/ASR/Deep-Speech/lib/python3.7/site-packages/librosa/output.py", line 239, in write_wav
    util.valid_audio(y, mono=False)
  File "/media/anwar/E/ASR/Deep-Speech/lib/python3.7/site-packages/librosa/util/utils.py", line 275, in valid_audio
    raise ParameterError('Audio buffer is not finite everywhere')
librosa.util.exceptions.ParameterError: Audio buffer is not finite everywhere

如我们所见,librosa会引发与以前相同的错误。在您的数据中产生nan值的最常见原因是将音频数据类型从np.float更改为np.int。所以,也许这就是原因!