захват одного аудиосэмпла из входного потока USB (микрофон) с помощью python

В настоящее время я запускаю свою основную программу, которая контролирует, когда я запускаю потоки динамика и микрофона. Оттуда я также могу управлять отключением/включением звука на устройстве (USB-гарнитура) и т. д. Аудиопотоки находятся в отдельном файле в аудиоклассе.

Этот код работает. Прямо сейчас он захватывает аудиосэмпл с заранее заданным количеством циклов. Я бы предпочел брать образец звука всякий раз, когда он запрашивается из основной программы, но мне не удалось установить флаг и проверить его в потоке микрофона. Я бы получил ошибки pyaudio, такие как переполнение/недополнение.

Я был бы признателен, если бы кто-нибудь предложил метод захвата образцов аудиовхода (данные микрофона). Благодарность

def openTheMic(self, **kwargs):
        # script can over-ride any value in the myAudio __init__
        print ("***in openTheMic ***")

        # picks up values passed by the test_script and maps them to myAudio class,
        # otherwise will use defaults set in class
        for (k,v) in kwargs.iteritems():
            #print("k = %s, v = %s" % (k,v))
            setattr(self, myAudio._map[k], v)

        stream = self.p.open(
            format = self.FORMAT,
            channels = self.CHANNELS,
            rate = self.RATE,
            input = True,
            output = True,
            frames_per_buffer = self.CHUNK
        )

        setMicThreadStartTime(time.time())
        print("time @ start of mic thread is: %s" % time.time())
        starttime = time.time()
        while myAudio.openTheMicThreadActive == True:            
            for i in range(0, 1200):
                data = stream.read(self.CHUNK)
                captureCount = 1000

                if i == captureCount:
                    currentData = data
                    # abort the mic and spkr threads
                    myAudio.openTheMicThreadActive = False
                    myAudio.playDeadAirThreadActive = False
                    print("i is: %i: " % (i))
                    # set a global variable to get the data to the main program
                    setAudioData(currentData)
                    print("capture time: i = %s, time is %s " % (i, time.time()))


        stream.stop_stream()
        stream.close()
        print ("***closed the stream in openTheMic *** and the time is: %s" % time.time())
        self.p.terminate()

person rebar    schedule 15.03.2017    source источник


Ответы (1)


Этот метод работал, но периодически возникали проблемы с переполнением/недостаточным заполнением, но эти проблемы исчезли, как только я установил частоту дискретизации микрофона на 16 кГц вместо значения по умолчанию. Я немного изменил код, чтобы я мог в любое время взять сэмпл из основной программы, используя переменную глобального флага, которую цикл микрофона проверяет, должен ли он брать семпл или нет.

person rebar    schedule 15.03.2017