Проблема
Я пытался реализовать это с помощью модулей Python: «sounddevice» и «pyaudio»; но в обеих реализациях есть странная проблема: первые несколько кадров записанного звука всегда равны нулю. Кто-нибудь еще сталкивался с проблемой такого типа? Кажется, эта проблема не зависит от используемого размера фрагмента (т. е. всегда одинаковое количество выборок равно нулю).
Могу ли я что-нибудь сделать, чтобы этого не произошло?< /p>
Код
Код: Выделить всё
import queue
import matplotlib.pyplot as plt
import numpy as np
import pyaudio
import soundfile as sf
FRAME_SIZE = 512
excitation, fs = sf.read("excitation.wav", dtype=np.float32)
# Instantiate PyAudio
p = pyaudio.PyAudio()
q = queue.Queue()
output_idx = 0
mic_buffer = np.zeros((excitation.shape[0] + FRAME_SIZE
- (excitation.shape[0] % FRAME_SIZE), 1))
def rec_play_callback(in_data, framelength, time_info, status):
global output_idx
# print status of playback in case of event
if status:
print(f"status: {status}")
chunksize = min(excitation.shape[0] - output_idx, framelength)
# write data to output buffer
out_data = excitation[output_idx:output_idx + chunksize]
# write input data to input buffer
inputsamples = np.frombuffer(in_data, dtype=np.float32)
if not np.sum(inputsamples):
print("Empty frame detected")
# send input data to buffer for main thread
q.put(inputsamples)
if chunksize < framelength:
out_data[chunksize:] = 0
return (out_data.tobytes(), pyaudio.paComplete)
output_idx += chunksize
return (out_data.tobytes(), pyaudio.paContinue)
# Define playback and record stream
stream = p.open(rate=fs,
channels=1,
frames_per_buffer=FRAME_SIZE,
format=pyaudio.paFloat32,
input=True,
output=True,
input_device_index=1, # Macbook Pro microphone
output_device_index=2, # Macbook Pro speakers
stream_callback=rec_play_callback)
stream.start_stream()
input_idx = 0
while stream.is_active():
data = q.get(timeout=1)
mic_buffer[input_idx:input_idx + FRAME_SIZE, 0] = data
input_idx += FRAME_SIZE
stream.stop_stream()
stream.close()
p.terminate()
# Plot captured microphone signal
plt.plot(mic_buffer)
plt.show()
Код: Выделить всё
Empty frame detected
Изменить: запустить это на MacOS с использованием CoreAudio. Это может быть актуально, как отметил @2e0byo.
Подробнее здесь: https://stackoverflow.com/questions/714 ... g-are-zero
Мобильная версия