繁体   English   中英

struct.error:unpack需要长度为4的字符串参数 - 音频文件

[英]struct.error: unpack requires a string argument of length 4 - audio file

我是编程的初学者,我使用的是Ubuntu。

但现在我正在尝试使用Python进行声音分析。

在下面的代码中,我使用wav包打开wav文件和struct来转换信息:

from wav import *
from struct import *
fp = wave.open(sound.wav, "rb")
total_num_samps = fp.getnframes()
num_fft = (total_num_samps / 512) - 2 #for a fft lenght of 512
for i in range(num_fft):
  tempb = fp.readframes(512);
  tempb2 = struct.unpack('f', tempb)
print (tempb2)

所以在终端中出现的消息是:

struct.error:unpack需要长度为4的字符串参数

拜托,有人可以帮我解决这个问题吗? 有人建议其他策略来解释声音文件吗?

提供给struct的格式字符串必须准确地告诉它第二个参数的格式。 例如,“有一百三十个无符号短裤”。 你编写它的方式,格式字符串说“ 只有一个浮点数”。 但是你为它提供了一个字符串,其中的数据比那个更多,并且它是barfs。

所以问题一是你需要在字节字符串中指定打包c类型的确切数量。 在这种情况下,512(帧数)乘以通道数(可能是2,但您的代码不考虑这一点)。

第二个问题是你的.wav文件根本不包含浮点数。 如果它是8位,它包含无符号char ,如果它是16位,它包含有符号short s等。您可以通过执行fp.getsampwidth()来检查.wav的实际样本宽度。

那么:我们假设你有512帧的双声道16位音频; 你会把对struct的调用写成:

channels = fp.getnchannels()
...

tempb = fp.readframes(512);
tempb2 = struct.unpack('{}h'.format(512*channels), tempb)

使用SciPy ,您可以使用以下命令将.wav文件加载到NumPy数组中:

import scipy.io.wavfile as wavfile
sample_rate, data = wavfile.read(FILENAME)

NumPy / SciPy也可用于计算FFT


提示:

  • 在Ubuntu上,您可以安装NumPy / SciPy

     sudo apt-get install python-scipy 

    这也将安装NumPy,因为NumPy是SciPy的依赖。

  • 避免使用* import,例如from struct import * 这会将struct命名空间中的名称复制到当前模块的全局名称空间中。 虽然它可以为您节省一些打字时间,但是当脚本变得更加复杂并且您无法跟踪变量的来源时(或者更糟糕的是,导入的变量会掩盖具有相同名称的其他变量的值),您将付出相当大的代价。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM