Использование звукового файла в качестве устройства ввода pyaudio

С PyAudio довольно просто открыть входной поток, поступающий с физического устройства ввода звука.

Интересно, есть ли способ открыть существующий звуковой файл как поток, который имеет те же свойства, что и поток звукового устройства?

Вместо

    self.p = pyaudio.PyAudio()
    self.inStream = self.p.open(format=pyaudio.paInt16,
                                channels=1,
                                rate=self.RATE,
                                input=True,
                                frames_per_buffer=self.BUFFERSIZE)

я хотел бы сделать

    self.p = pyaudio.PyAudio()
    self.inStream = self.p.open('testfile.wav',
                                input=True,
                                frames_per_buffer=self.BUFFERSIZE)

С уважением, Торстен


person Torsten2001    schedule 21.05.2014    source источник
comment
Почему бы просто не преобразовать это в отдельную функцию?   -  person Games Brainiac    schedule 21.05.2014
comment
Вы имеете в виду добавление функциональности в PyAudio?   -  person Torsten2001    schedule 22.05.2014
comment
Нет, в вашем собственном приложении. Просто создайте удобную функцию с нужным вам интерфейсом, который соответствует тому, как это делает PyAudio.   -  person Games Brainiac    schedule 22.05.2014
comment
Я понимаю. Но если бы существовал прозрачный режим эмуляции, вы могли бы легко модифицировать каждое приложение PyAudio для работы со звуковыми файлами, а не с устройствами.   -  person Torsten2001    schedule 22.05.2014
comment
Боюсь, что нет. Я видел документацию.   -  person Games Brainiac    schedule 22.05.2014
comment
Теперь я попытался создать класс PyAudioFileStream, который имеет тот же интерфейс, что и PyAudio.Stream. Это дало мне хорошие результаты. Мне удалось использовать wav-файл в приложении PyAudio, просто заменив одну строку.   -  person Torsten2001    schedule 22.05.2014
comment
Рад, что у тебя все получилось дружище :)   -  person Games Brainiac    schedule 22.05.2014


Ответы (1)


Насколько я знаю, вы не можете использовать PyAudio для прямого открытия файла, однако можно комбинировать модули pyaudio и wave на случай, если ваше приложение, например, перенаправляет обработанный звук в SoundFlower.

import pyaudio, wave

def open_stream(self):
        self.p_audio = pyaudio.PyAudio()
        self.file_source = wave.open('input.wav', 'rb')
        s_width = self.file_source.getsampwidth()
        format = self.p_audio.get_format_from_width(s_width)
        channels = self.file_source.getnchannels()
        rate = self.file_source.getframerate()
        self.stream = self.p_audio.open(format=format,
                                        channels=channels,
                                        rate=rate,
                                        frames_per_buffer=1024,
                                        input=False,
                                        output=True,
                                        output_device_index=detect_build_in_output_device_idx(self.p_audio),
                                        stream_callback=self.__recording_callback)


def __recording_callback(self, in_data, frame_count, time_info, status):

        # read frames
        in_data = self.file_source.readframes(frame_count)
        # decode frames
        left, right = audio_decode(in_data, self.file_source.getnchannels())
        # process frames
        left, right = self.core.process(left, right)
        # encode back
        processed_data = audio_encode((left, right))

        return processed_data, pyaudio.paContinue
person galarius    schedule 04.05.2015