【发布时间】:2022-01-22 12:22:09
【问题描述】:
我有一个
-
wavfile.write(savepath + 'wave_speechsegment_' + str(wavecnt) + '.wav', sr, nparray.astype(np.int16))生成ValueError: invalid literal for int() with base 10: b'z\xfe'错误 -
直接尝试 nparray:
wavfile.write(savepath + 'wave_speechsegment_' + str(wavecnt) + '.wav', sr, nparray)我得到ValueError: Unsupported data type '|S2
我尝试将列表设置为 16 位 PCM 值:
hexval = struct.pack('<BB', val[0], val[1])
waveform.append(hexval)
nparray = np.array(waveform)
但是当我将 16 位 PCM 值保存到 numpy 文件时,python 报告:
nparray is type: <class 'numpy.ndarray'> and nparray[0] is: b'z\xfe' and is type: <class 'numpy.bytes_'>
将 numpy 数组段保存到文件中会精确生成在源波形文件中为该段找到的数据集,例如:
7A FE DE FE C5 FF 75 00 2F 01 76 01 99 01 55 01 05 01 74 00 05 00 9D FF 79 FF 65 FF 8C FF C9 FF
谁能告诉我有关 python 如何处理数据的信息,以便我可以将 16 位 PCM 数据保留为 16 位 PCM 数据?
【问题讨论】:
-
我想你在将数据传送到 numpy 数组时需要
struct.unpack? -
使用 hexval = struct.unpack('
而 pack 产生:hexval 是:b 'z\xfe' 并且是类型: 。结果之间存在差异,具体取决于使用哪个。问题可能是由于使用了 pack 和 unpack 以及产生的不同类型。 -
另外,我注意到当保存在文件中并以 HxD 格式打开时,struct.unpack 使用 xFFFF 或 x0000 填充我的原始数据,具体取决于它是正数还是负数,例如:7A FE FF FF 或 2F 01 00 00。根据 struct 的页面,“h”是“short, integer, 2”,那么为什么要填充呢?包不垫。我想我必须通过源来弄清楚它是如何处理数据的。
-
你需要跟踪哪个变量有什么形式的数据;在你的笔记本或白板或一张纸或其他东西上做一张桌子
-
我发现 Python 似乎想要使用 32 位。我使用 hexval = int.from_bytes(hexval, "little", signed="True") 将 16 位值 b'z\xfe' 转换为 int,这会产生 -390 of
实际上是十六进制值 7A FE FF FF。这被 wavfile.write(filename, sr, nparray.astype(np.int16)) 接受,并生成一个 16 位 PCM 文件,Audacity 将其作为波形文件打开。所以,填充看起来很正常,但我一直在阅读库源代码,但还没有找到为什么 Python 不能立即处理 16 位 PCM 值。
标签: arrays python-3.x list numpy integer