Найти - Пользователи
Полная версия: Работа со звуком с микрофона.
Начало » Центр помощи » Работа со звуком с микрофона.
1 2
12301230
Стоит задача считать звук с микрофона и воспроизвести его.
Но при попытке воспроизведения слышен монотонный шум.
Помогите найти проблему
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()
Aris_P@
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    stream.write(data, CHUNK)
а то все время в поток пишутся одни и те же данные. Причем бесконечно, а не 5 секунд.
12301230
Aris_P@
Такую конструкцию видел, но она мне немного не подходит.
Мне надо сначала n-ое количество секунд считать и только после этого воспроизвести.
Aris_P@
тогда сохраняйте в список, типа
data=[]
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data.append(stream.read(CHUNK))    
while data:
    stream.write(data.pop(0), CHUNK)
12301230
Aris_P@
тогда сохраняйте в список, типа
Возник еще один вопрос:
Sh= numpy.fft.irfft(b)
теперь у меня имеется массив чисел. Как его воспроизвести?
Преобразовать в список? Если да, то как?
Aris_P@
массив чисел надо перевести в строку, не забывая, что у вас размер сэмпла равен 2 байтам.
Что-то типа такого
from struct import pack
buf = pack('H',1234)
12301230
Aris_P@
массив чисел надо перевести в строку, не забывая, что у вас размер сэмпла равен 2 байтам.Что-то типа такого
Не понял данной конструкции.
И как в дальнейшем воспроизводить то, что получилось?
Aris_P@
получившуюся строку надо передавать в функцию
stream.write(строка, CHUNK)
12301230
Aris_P@
buf = pack('H',1234)

Эта конструкция не понятна.
Aris_P@
Надо перевести 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])
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB