-1

I am new to python. I am trying to do microphone file that ought to detect, listen, record and write the .wav files. However, it is giving me an error while I am trying to run the file. It is saying:

TypeError: __init__() missing 1 required positional argument: 'rec'

And I have the same issue with listen() as below. Here is my code:

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()
夏思阳
  • 57
  • 1
  • 4
  • 10

2 Answers2

2

You declare your __init__ as staticmethod and so there is no self (or in your case rec) argument passed into your constructor when you create an object of your class.

k = Recorder() <--- will pass a reference, typical named self, into your __init__

Please take a look at

  1. this
  2. or this
  3. and this

when you want to use a static constructor.

Kampi
  • 1,798
  • 18
  • 26
0

There many problems in your code and one of them is that, the first argument of member functions must be self (like the this pointer). This is because, python's philosophy is,

Explicit is better than implicit

In general, a python class looks like this:

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

When you refactor your code to the above grammar, your code would start working. Also, do pick up some book that gives you an introduction to python in a systematic manner :)

sidcha
  • 649
  • 5
  • 18