Форум сайта python.su
Добрый день форуму.
Существует задача - записать звуковой сигнал с микрофонного входа. Сигнал туда идет двухканальный, но в процессе записи надо свести его в моно. Для этого использую функции библиотеки alsaaudio. Рабочая часть кода выглядит примерно так.
card = ‘default’
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, card)
inp.setchannels(1)
inp.setrate(44100)
inp.setformat(alsaaudio.PCM_FORMAT_S8)
inp.setperiodsize(4410)
while l!=4410:
l, data=inp.read()
time.sleep(0.02)
integer_data = struct.unpack(“%dB”%(sps),data)
a= numpy.array(integer_data)
b = a - 128
По идее на выходе должна быть последовательность чисел, соответствующая амплитудам участка сигнала длиной 0.1 секунды и отцентрированная на 128 из 256. Так как пока пишу 8 бит. Но результат от этого очень далек - такие сэмплы, будучи расположены один за другим ни капли не похожи на то, что подается на вход. Форумчане, если кто-то сталкивался с подобной задачей, помогите, пожалуйста разрешить такие вопросы:
1) В чем порок такого метода записи? Нет ли более элегантного решения для записи амплитуд сигнала с микрофонного входа?
2) Как по уму получать такую последовательность амплитуд и параллельно с этим записывать снятое в wav-файл?
3) Если в параметрах записи указать 1 channel - это сведет стерео в моно?
5) Каким образом лучше всего организовать on-line запись звука со входа на более-менее длительных временах?
4) Если хочется повысить битность до 16, формат PCM_FORMAT_S16_LE подойдет? Если да - то как его правильно воткнуть в код, а если нет - то какой подойдет?
С надеждой, новичок в питоне.
Офлайн