Запись звука в режиме реального времени и построение графиков в python, не вызывая разрывов в записанных сигналах - PullRequest
1 голос
/ 26 февраля 2020

Я «написал» код ниже (я брал биты из Интернета в основном :)), чтобы записать входной сигнал от внешнего источника, используя mi c, который подключен к моей звуковой карте, одновременно рисуя сигнал времени в режиме реального времени. Позже я сохраняю записанный сигнал в файл WAV. График в реальном времени выглядит нормально, но после воспроизведения файла WAV я отчетливо слышу случайные щелчки, которые, я уверен, вызваны задержкой функций построения графиков. Щелчки в основном заметны, когда я записываю один тон (например, 100 Гц), а не более сложным звуковым сигналом (промежутки при записи более сложного сигнала все еще присутствуют, но их гораздо труднее заметить по сравнению с непрерывным синусоидальным сигналом). волна.). Вы также можете увидеть щелчки / пропуски сигнала, если загрузите и создадите окончательный WAV-файл (см. Прикрепленное изображение). Клики в большинстве случаев случайны ... Можете ли вы предложить решение? Должен ли я заняться многопоточностью или параллельной обработкой, чтобы потоковая передача и сохранение входных данных из mi c не задерживались функциями построения графиков?

Большое спасибо заранее! : -)

import numpy as np
import matplotlib.pyplot as plt
import pylab
import wave
import pyaudio 
import struct
import msvcrt


CHUNK = 2048
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 48000
RECORD_SECONDS = 5 # recording will be terminated after 5 sec

p = pyaudio.PyAudio()

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





# create matplotlib figure and axes
fig, ax = plt.subplots(1, figsize=(15, 7))

# variable for plotting
x = np.arange(0, 2 * CHUNK, 2)

# create a line object with random data
line = ax.plot(x, np.random.rand(CHUNK), '-', lw=2)[0]
# basic formatting for the axes
ax.set_title('AUDIO WAVEFORM')
ax.set_xlabel('samples')
ax.set_ylabel('volume')
ax.set_xlim(0, 2 * CHUNK)
plt.setp(ax, xticks=[0, CHUNK, 2 * CHUNK], yticks=[-1000, 1000])
# show the plot
plt.show(block=False)


print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):    
    data = stream.read(CHUNK)
    frames.append(data)

    result = np.frombuffer(data, dtype=np.int16)
    line.set_ydata(result)
    fig.canvas.draw()
    fig.canvas.flush_events()



filename = "output.wav"

# Save the recorded data as a WAV file
wf = wave.open(filename, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

Щелчки / пробелы сигнала

...