Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x &引用;错误:未知格式:3“;使用librosa.resample后。librosa的输出有什么问题吗?_Python 3.x_Wav_Wave_Librosa - Fatal编程技术网

Python 3.x &引用;错误:未知格式:3“;使用librosa.resample后。librosa的输出有什么问题吗?

Python 3.x &引用;错误:未知格式:3“;使用librosa.resample后。librosa的输出有什么问题吗?,python-3.x,wav,wave,librosa,Python 3.x,Wav,Wave,Librosa,我有一个采样率为44.1khz的.wav文件,我想使用librosa.resample将其重新采样为16khz。虽然output.wav听起来很棒,它是16khz,但我在尝试通过wave.open读取它时出错 这个问题和我的很相似: 这是我的代码: def resample(input_wav, output_wav, tar_fs=16000): audio_file = wave.open(input_wav, 'rb') audio_data = audio_file.r

我有一个采样率为44.1khz的.wav文件,我想使用librosa.resample将其重新采样为16khz。虽然output.wav听起来很棒,它是16khz,但我在尝试通过wave.open读取它时出错

这个问题和我的很相似:

这是我的代码:

def resample(input_wav, output_wav, tar_fs=16000):
    audio_file = wave.open(input_wav, 'rb')
    audio_data = audio_file.readframes(audio_file.getnframes())
    audio_data_short = np.fromstring(audio_data, np.short)
    src_fs = audio_file.getframerate()
    dtype = audio_data_short.dtype
    audio_len = len(audio_data_short)
    audio_time_max = 1.0*(audio_len-1) / src_fs
    src_time = 1.0 * np.linspace(0, audio_len, audio_len) / src_fs
    tar_time = 1.0 * np.linspace(0, np.int(audio_time_max*tar_fs), np.int(audio_time_max*tar_fs)) / tar_fs
    output_signal = np.interp(tar_time, src_time, audio_data_short).astype(dtype)

    with wave.open(output_wav, 'wb') as f:
        f.setnchannels(1)
        f.setsampwidth(2)
        f.setframerate(tar_fs)
        f.writeframes(output_signal)
如果名称=“\uuuuu main\uuuuuuuu”:
输入_wav='1d13eeb2febdb5fc41d3aa7db311fa33.wav'
输出_wav='result.wav'
y、 sr=librosa.load(输入波形,sr=None)
印刷品(高级)
y=librosa.重采样(y,原始值=sr,目标值=16000)
librosa.output.write_wav(output_wav,y,sr=16000)
波形打开(输出波形)
在最后一步
wave.open(output\u wav)

例外情况如下:

Traceback (most recent call last):
  File "/Users/range/Code/PycharmProjects/Speaker/test.py", line 204, in <module>
    wave.open(output_wav)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 499, in open
    return Wave_read(f)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 163, in __init__
    self.initfp(f)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 143, in initfp
    self._read_fmt_chunk(chunk)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 260, in _read_fmt_chunk
    raise Error('unknown format: %r' % (wFormatTag,))
wave.Error: unknown format: 3

我希望您能帮助我理解librosa重新采样wav时出现的问题,我很高兴看到我的代码可以帮助其他有同样问题的人。:)

我在一个项目中工作,遇到了同样的错误,因此深入研究,发现问题是由于librosa使用输出模块中的write_wav()写入wave文件的默认方式造成的

问题在于编码量化是24位的,因为它是“浮点PCM”。 您可以使用SoX轻松更改位量化。SoX是一个跨平台的命令行工具,您可以使用它来控制编码格式等细节

例如,您可以这样做,从24位编码转换为16位编码:

sox audio.wav -b 16 -e signed-integer modified_audio.wav
(对于Linux用户):sox的替代品,因为我无法使用它。但我使用以下命令成功地将其转换为终端上的ffmpeg:

ffmpeg -i input_wav.wav -ar 44100 -ac 1 -acodec pcm_s16le output_wav.wav

其中“ar”=音频速率,“ac”=音频频道。

如果下载ffmpeg并将其添加到路径中,也可以在windows上使用。谢谢