Librosa无法打开由Librosa创建的.wav文件?

5

我正在尝试使用librosa从持续时间为60秒的.wav文件中剪辑1秒的片段以生成一些数据。

这部分工作已经完成,我创建了所有文件并且可以通过任何播放器听取它们,但是如果我尝试使用librosa.load打开它们,就会收到以下错误:

>>> librosa.load('.\\train\\audio\\silence\\0doing_the_dishes.wav', sr=None)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Users\gionata\AppData\Local\Programs\Python\Python36\lib\site\packages\librosa\core\audio.py", line 107, in load
with audioread.audio_open(os.path.realpath(path)) as input_file: File "C:\Users\gionata\AppData\Local\Programs\Python\Python36\lib\site-packages\audioread\__init__.py", line 116, in audio_open 
raise NoBackendError()
audioread.NoBackendError

您有什么建议吗?我使用以下函数创建file.wav文件:

def create_silence():
    path=DB+"_background_noise_/"
    sounds = [x[len(DB):] for x in glob.glob(path+ '*.wav')]
    for elem in enumerate(sounds):
       sound=elem.split('\\')[1]
       print(sound)
       for j,i in enumerate(np.arange(0.0, 59.0, 0.3)):
           y, sr=librosa.load(DB+elem, sr=None, offset=i, duration=1.0)
           librosa.output.write_wav(DB+'silence/'+str(j)+sound, y, sr=sr, norm=False)

这个问题只出现在由librosa创建的文件中,librosa.load在处理其他文件时没有任何问题。

5个回答

5

这是关于ffmpeg的问题,如果你使用的是Windows系统,可以按照这里的方法解决问题。如果你使用的是Linux系统,可以尝试以下方法:

sudo apt-get install libav-tools

2

libav-tools在Ubuntu中已经弃用,因此

sudo apt-get install ffmpeg 

做到了。

2
import librosa
audio_path='C:/Users/hp/name.wav' #location 
(xf, sr) = librosa.load(audio_path)

这对我很有帮助。xf是音频文件的数组,sr是采样率。


1
我解决了这个问题,Librosa按照原样输出值,在我的情况下,np.array是float32类型,但标准是每个值为16位,因此更改类型即可解决:
def create_silence():
path=DB+"_background_noise_/"
maxv = np.iinfo(np.int16).max
sounds = [x[len(DB):] for x in glob.glob(path+ '*.wav')]
for elem in sounds:
    sound=elem.split('\\')[1]
    print(sound)
    for j,i in enumerate(np.arange(0.0, 59.0, 0.3)):
        y, fs=librosa.load(DB+elem, sr=None, offset=i, duration=1.0, mono=False)
        librosa.output.write_wav(DB+'silence/'+str(j)+sound, y=(y*maxv).astype(np.int16), sr=fs, norm=False)

我在想,sr也改变了吗?在你的第一个代码片段中,你从“y,sr=librosa.load(DB+elem, sr=None, offset=i, duration=1.0)”获取sr,但在修复后的代码中,你使用了fs=sr,其中fs来自“y,fs=librosa.load(DB+elem, sr=None, offset=i, duration=1.0, mono=False)”。你是否也必须更改sr才能使代码正常工作? - J.D

1

我无法让吴连伟或Gionata的解决方案起作用,但是这个方法可以解决问题:

from scipy.io import wavfile
import scipy
maxv = np.iinfo(np.int16).max
scipy.io.wavfile.write(path, sr, (y*maxv).astype(np.int16))

(其中path是路径和文件名,y是librosa.load的第一个输出,sr是librosa.load的第二个输出)

我后来使用librosa成功地加载了这个wav文件,因此问题得到了解决!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接