【问题标题】:Writing to WAV file causes struct.error: required argument is not an integer写入 WAV 文件会导致 struct.error: required argument is not an integer
【发布时间】:2021-07-24 22:46:23
【问题描述】:

这可能是一个愚蠢的问题,因为我对 python 很陌生,但我正在尝试将正弦波写入 python 中的文件,并且我不断收到所需参数不是整数的错误。我知道这意味着我需要将一个非十进制数传递给函数,但无论我做什么使它成为一个 int,它都不起作用。我正在使用 wave 库,并使用 numpy 进行计算。 writeframes(data) 行 (23) 始终存在错误。我当前的代码是:

import wave

import numpy as np

samples = [int()]

tones = int(input("How many notes do you want?"))

sRate = 44100           # 44.1kHz sample rate
nSamples = sRate * float(input("How long for each tone?")) * tones

x = np.arange(nSamples)/float(sRate)
hz = int(input("What frequency do you want it to start on?"))
vals = (32767*np.sin(2.0*math.pi*hz*x))+16384
newArr = []
for x in range(len(vals)):
    newArr.append(int(vals[x]))
file = wave.open("sine"+str(hz)+"_"+str(tones)+".wav", 'wb')
file.setparams((1, 2, sRate, nSamples, 'NONE', 'uncompressed'))
for x in newArr:
    print(type(x))
    file.writeframesraw(x)
file.close()

输入提示现在没有太多作用,我只是添加了它们,以便将来更容易。我还注意到该错误在另一部分表明需要一个类似字节的对象。即使我将x 类型转换为一个字节,我仍然会收到错误。

这是错误和打印的类型:

<class 'int'>
Traceback (most recent call last):
  File "/media/smack/Seagate Portable Drive/Programs/music/main.py", line 23, in <module>
    file.writeframesraw(x)
  File "/usr/lib/python3.8/wave.py", line 426, in writeframesraw
    data = memoryview(data).cast('B')
TypeError: memoryview: a bytes-like object is required, not 'int'
Exception ignored in: <function Wave_write.__del__ at 0x7fa20a05c280>
Traceback (most recent call last):
  File "/usr/lib/python3.8/wave.py", line 327, in __del__
  File "/usr/lib/python3.8/wave.py", line 445, in close
  File "/usr/lib/python3.8/wave.py", line 468, in _ensure_header_written
  File "/usr/lib/python3.8/wave.py", line 480, in _write_header
struct.error: required argument is not an integer

Process finished with exit code 1

非常感谢任何帮助,在此先感谢!

【问题讨论】:

  • 你能用它的堆栈跟踪发布错误吗?
  • 我刚做了,我想这就是你想要的。

标签: python-3.x wav


【解决方案1】:

现在我已经想通了,如何在 python 中编写一个 wav 文件。我发现有一种使用 sciypy 的好方法。 Scipy 有方法scipy.io.wavfile.write

我使用这个 scipy 函数重写了你的示例程序。现在它运行了,希望对您有所帮助。

import math
import numpy as np
import scipy.io.wavfile

samples = [int()]

tones = int(input("How many notes do you want?"))

sRate = 44100           # 44.1kHz sample rate
nSamples = sRate * float(input("How long for each tone?")) * tones

x = np.arange(nSamples)/float(sRate)
hz = int(input("What frequency do you want it to start on?"))
vals = (32767*np.sin(2.0*math.pi*hz*x))+16384
newArr = []
for x in range(len(vals)):
    newArr.append(int(vals[x]))

newArr = np.asarray(newArr,dtype=np.int16)
scipy.io.wavfile.write("sine"+str(hz)+"_"+str(tones)+".wav",sRate,newArr)

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 2023-02-21
    • 2019-08-27
    • 2016-11-17
    • 1970-01-01
    • 2022-01-08
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多