PyAudio – первые несколько фрагментов записи равны нулюPython

Программы на Python
Ответить
Anonymous
 PyAudio – первые несколько фрагментов записи равны нулю

Сообщение Anonymous »

У меня возникли некоторые проблемы при попытке синхронного воспроизведения и записи звука на/с устройства, в данном случае динамиков и микрофона моего ноутбука.
Проблема
Я пытался реализовать это с помощью модулей 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»