scipy.io.wavfile.read无法读取24位.wav文件

10

看起来 scipy.io.wavfile.read 无法读取24位的 .wav 文件。 您有什么处理它们的想法吗?


1
它将它们读入32位整数中,但它无法将它们作为24位写回。 - Jaime
3
Jaime,这段话的意思是:“Jaime,无法读取。当我尝试使用read来读取一个24位的文件时,会出现错误(Traceback... ValueError:新数组的总大小必须保持不变)。”。 - Basj
1
@Jaime:使用“wave”模块创建的单声道、9帧24位wav文件读取时出现错误。如果改为8帧(因此字节数是4的倍数),则scipy.wavfile.read可以读取该文件,但数据最终以int32类型的长度为6的数组形式存储。数组中的第一个值包含第一个样本的三个字节和第二个样本的一个字节等。 - Warren Weckesser
1
@WarrenWeckesser numpy存在一些异常行为,其中dtype设置为“'i3'”,它返回一个int32,而不是引发错误。有时候会出现数据混乱的情况,有时候则会彻底失败。看起来将所有内容读入int8中并进行一些重塑操作,然后转换为下一个最大的int类型并不太难,但这需要返回数据的位数,这不能再从dtype中推断出来了。唯一不需要重新思考用户界面的简单解决方法就是引发错误... - Jaime
1
@Jaime:好的,我只是想指出,在某些情况下它可能不会引发错误,但实际上并没有任何有用的作用。你的第一条评论似乎暗示它可能有效,并且只是向上转换为32位,这令人惊讶,因为我知道你已经研究过这个问题,并在其他问题中评论了它的行为。另外,我刚刚创建了一个函数,可以使用“wave”模块读取未压缩的wav文件。我将把它添加到关于此问题的scipy问题中。 - Warren Weckesser
显示剩余2条评论
3个回答

14

太棒了!它运行了!你有“writewav”吗?;) - Basj
+1 但是您可能希望将文件的位深度与速率和数据一起返回,因为现在无法确定您是否读取了32位或24位文件。让事情变得更糟的是,显然PCM支持4、12和20位深度... - Jaime
@JosBas:我更新了要点。它有一个新的文件名(wavio.py)和一个用于写入24位wav文件的函数writewav24。同样,测试不是彻底的,所以请注意。 - Warren Weckesser
@Jaime:好主意。我更新了代码片段;readwav现在返回rate,sampwidth,array - Warren Weckesser
感谢Jaime和Warren提供的想法和gist,太棒了!最后一件事(与主题不完全相关,但是...):我还想读/写包含在.wav中的标记元数据,你知道我该如何做吗? - Basj
@JosBas:抱歉,这超出了简单功能范围。它只是一个包装器,用于忽略 Python “wave” 模块的元数据。我不知道任何“真正的”音频库(audiolab、pysox 或其他)是否处理元数据,所以我唯一能建议的就是搜索谷歌。 - Warren Weckesser

6
这是更新版本的scipy.io.wavfile,增加了很多功能:
  • 支持读写24位的.wav文件,
  • 访问提示标记,
  • 提示标记标签,
  • 一些其他元数据,如音高(如果定义了)等。
wavfile.py(增强版) 欢迎分享!

1
在Scipy.io的wavfile.read中,与用法相比多了一个额外的参数(bits):Fs, data, bits = wavfile.read('input.wav') - vinaymk

1

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