Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 23, 2014 19:08:22

12301230
Зарегистрирован: 2014-11-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

Стоит задача считать звук с микрофона и воспроизвести его.
Но при попытке воспроизведения слышен монотонный шум.
Помогите найти проблему

import pyaudio
import numpy.fft
import math
import wave
CHUNK = 1024
WIDTH = 2
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(WIDTH),
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=CHUNK)
print("* recording")
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
#при выполнении этого блока воспроизводится шум
while data != '':
    stream.write(data)
stream.stop_stream()
stream.close()
p.terminate()

Офлайн

#2 Ноя. 25, 2014 09:10:24

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    stream.write(data, CHUNK)
а то все время в поток пишутся одни и те же данные. Причем бесконечно, а не 5 секунд.



Офлайн

#3 Ноя. 25, 2014 09:46:10

12301230
Зарегистрирован: 2014-11-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

Aris_P@
Такую конструкцию видел, но она мне немного не подходит.
Мне надо сначала n-ое количество секунд считать и только после этого воспроизвести.

Офлайн

#4 Ноя. 25, 2014 10:42:06

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

тогда сохраняйте в список, типа

data=[]
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data.append(stream.read(CHUNK))    
while data:
    stream.write(data.pop(0), CHUNK)



Офлайн

#5 Ноя. 26, 2014 00:04:28

12301230
Зарегистрирован: 2014-11-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

Aris_P@
тогда сохраняйте в список, типа
Возник еще один вопрос:
Sh= numpy.fft.irfft(b)
теперь у меня имеется массив чисел. Как его воспроизвести?
Преобразовать в список? Если да, то как?

Офлайн

#6 Ноя. 27, 2014 08:29:22

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

массив чисел надо перевести в строку, не забывая, что у вас размер сэмпла равен 2 байтам.
Что-то типа такого

from struct import pack
buf = pack('H',1234)



Офлайн

#7 Ноя. 28, 2014 19:09:11

12301230
Зарегистрирован: 2014-11-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

Aris_P@
массив чисел надо перевести в строку, не забывая, что у вас размер сэмпла равен 2 байтам.Что-то типа такого
Не понял данной конструкции.
И как в дальнейшем воспроизводить то, что получилось?

Офлайн

#8 Ноя. 28, 2014 21:09:50

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

получившуюся строку надо передавать в функцию

stream.write(строка, CHUNK)



Офлайн

#9 Ноя. 28, 2014 21:15:44

12301230
Зарегистрирован: 2014-11-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

Aris_P@
buf = pack('H',1234)

Эта конструкция не понятна.

Отредактировано 12301230 (Ноя. 28, 2014 21:21:15)

Офлайн

#10 Ноя. 28, 2014 21:32:37

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

Работа со звуком с микрофона.

Надо перевести 1024 чисел в 1024 сэмплов (реально у вас 2048 будет, так как канала 2, но не суть, попробуйте для одного канала сначала). Размер каждого сэмпла определен - 2 байта(WIDTH = 2).
Эта конструкция

buf = pack('H',1234)
позволяет представить целое число в виде двух байт
вот небольшой пример
from struct import pack
a=[1,2,3,4,5,6,7,8]
b=''.join([pack('H',s) for s in a])
в b лежит строка
'\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00'
не помню какой должен быть порядок байтов. но если надо будет наоборот, то можно так
b=''.join([pack('H',s)[::-1] for s in a])



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version