我是python的新手。我正在尝试做应该检测,收听,记录和写入.wav文件的麦克风文件。但是,它在尝试运行文件时给我一个错误。就是说:
TypeError: __init__() missing 1 required positional argument: 'rec'
而且我对listen()有如下相同的问题。这是我的代码:
class Recorder:
# compute the rms
def rms(frame):
count = len(frame) / swidth
format = "%dh" % (count)
shorts = struct.unpack(format, frame)
sum_squares = 0.0
for sample in shorts:
n = sample * SHORT_NORMALIZE
sum_squares += n * n
rms = math.pow(sum_squares / count, 0.5);
return rms * 1000
# create an interface to portaudio
@staticmethod
def __init__(rec):
rec.p= pyaudio.PyAudio()
rec.stream= rec.p.open(format=FORMAT, channels=CHANNELS, rate=RATE,input=True,output=True,frames_per_buffer=chunk)
# record the detected sound
def record(rec):
print('sound detected, record begin')
frames = []
current = time.time()
end = current + Timeout
while current <= end:
data = rec.stream.read(chunk, execption_on_overflow=False)
if rec.rms(data) >= Threshold:
end = time.time() + Timeout
current = time.time()
frames.append(data)
rec.write(b''.join(frames))
# write the recorded sound to .wav file
def write(rec, recording):
files = len(os.listdir(FileNameTmp))
filename = os.path.join(FileNameTmp,time.strftime('%Y_%m_%d-%H_%H_%M_%S.wav'.format(FORMAT)))
filename2 = time.strftime('%Y_%m_%d-%H_%H_%M_%S.wav'.format(FORMAT))
wf = wave.open(filename, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(rec.p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(recording)
wf.close()
print('Written to file: {}'.format(filename))
print('Returning to listening')
# listen to the sound
def listen(rec):
print('Listening beginning')
while True:
input = rec.stream.read(chunk, execption_on_overflow=False)
rms_val = rec.rms(input)
if rms_val > Threshold:
rec.record()
k = Recorder()
k.listen()
答案 0 :(得分:2)
您将__init__
声明为staticmethod
,因此在创建自己的对象时,不会将self
(或者您的情况rec
)参数传递给构造函数课。
k = Recorder() <--- will pass a reference, typical named self, into your __init__
请看看
当您要使用静态构造函数时。
答案 1 :(得分:0)
您的代码中有很多问题,其中一个问题是,成员函数的第一个参数必须为self
(如this
指针)。这是因为python的理念是
显式优于隐式
通常,python类如下所示:
class MyClass:
def __init__(self, val):
self.val = val
def getVal(self):
return self.val
def setVal(self, val):
self.val = val
obj = MyClass(5)
print(obj.getVal()) # prints 5
obj.setVal(4)
print(obj.getVal()) # prints 4
当您将代码重构为上述语法时,您的代码将开始工作。另外,请阅读一些本书,以系统的方式向您介绍python:)