librosa ParameterError: Audio buffer is not finite everywhere (cutting wav files)

librosa ParameterError: Audio buffer is not finite everywhere (cutting wav files)

我正在训练一个名为 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

的这些行
## 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)]

预期的输出将是两个长度相同的独立 .wav 文件,每个文件中有一个扬声器,另一个扬声器正在讲话时静音。但是,我收到此错误:

Traceback (most recent call last):
  File "/home/<me>/anaconda3/bin/dewave-infer", line 11, in <module>
    sys.exit(infer())
  File "/home/<me>/anaconda3/lib/python3.6/site-packages/DeWave/cmdinfer.py", line 12, in infer
    blind_source_separation(args.input_file, args.model_dir)
  File "/home/<me>/anaconda3/lib/python3.6/site-packages/DeWave/infer.py", line 207, in blind_source_separation
    librosa.output.write_wav(input_file[0:-4]+"_source1.wav", source1, SAMPLING_RATE)
  File "<decorator-gen-6>", line 2, in write_wav
  File "/home/<me>/anaconda3/lib/python3.6/site-packages/librosa/util/decorators.py", line 58, in __wrapper
    return func(*args, **kwargs)
  File "/home/<me>/anaconda3/lib/python3.6/site-packages/librosa/output.py", line 239, in write_wav
    util.valid_audio(y, mono=False)
  File "/home/<me>/anaconda3/lib/python3.6/site-packages/librosa/util/utils.py", line 171, in valid_audio
    raise ParameterError('Audio buffer is not finite everywhere')
librosa.util.exceptions.ParameterError: Audio buffer is not finite everywhere

我知道我迟到了大约三个月,但我的回答可能对其他人有所帮助。在我的例子中,原因是音频数据中有一些 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

前面的代码片段会发出两秒钟的蜂鸣声。这是使用具有 500 HZ 频率和 16k 采样率的正弦波完成的。之前的代码应该可以正常工作,没有错误。

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

>>> 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。所以,也许这就是原因!!