Ich möchte viele Eingabedaten von einem Mikrofon ohne Pufferung wiedergeben. Ich habe es versucht, aber es gibt Pufferung. Hier ist mein Code.So spielen Sie Eingabedaten direkt vom Mikrofon ab
import pyaudio
import wave
import urllib.request
import struct
import numpy as np
import sounddevice as sd
import matplotlib.pyplot as plt
# Callback function---------------------------------
def callback(indata, outdata, frames, time, status):
# if status:
# print(status)
outdata[:] = indata
#---------------------------------------------------
# Parameters ----------------------------------------------
Window_Size = 22050 # Point
FORMAT_D = pyaudio.paFloat32; FORMAT_W = pyaudio.paInt32
CHANNELS = 1 # Mono
Sample_Rate = 22050 # Hz
dT = 1/Sample_Rate
RECORD_SECONDS = 20 # s
NOFFRAMES = int(Sample_Rate/Window_Size * RECORD_SECONDS)
WAVE_OUTPUT_FILENAME = "output.wav"
#-----------------------------------------------------------
p = pyaudio.PyAudio()
stream_D = p.open(format=FORMAT_D,
channels=CHANNELS,
rate=Sample_Rate,
input=True,
frames_per_buffer=Window_Size)
stream_W = p.open(format=FORMAT_W,
channels=CHANNELS,
rate=Sample_Rate,
input=True,
frames_per_buffer=Window_Size)
print("* recording")
frames = []
# "I think the problem appears from here"------------------------------
for i in range(0, int(Sample_Rate/Window_Size * RECORD_SECONDS)):
data_D = stream_D.read(Window_Size)
# data_W = stream_W.read(Window_Size)
decoded = np.fromstring(data_D, 'Float32')
# np.savetxt(str(i)+'ttt.txt',transform)
sd.play(decoded,22050)
# frames.append(data_W)
#-------------------------------------------------------
print("* done recording")
stream_D.stop_stream()
stream_D.close()
p.terminate()
#plt.plot(transform)
#plt.show()
# Save as a wave file---------------------------
#wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
#wf.setnchannels(CHANNELS)
#wf.setsampwidth(p.get_sample_size(FORMAT_W))
#wf.setframerate(Sample_Rate)
#wf.writeframes(b''.join(frames))
#wf.close()
#-------------------------------------------
Dieser Code führt in 1s Intervallen Eingangsdaten von einem Mikrofon zu speichern, Byte-Daten Daten nparray (np.transform()), und spielen Sie die Daten mit einem Lautsprecher (sd.play()) zu transformieren. Dieser Code funktioniert, aber es gibt eine Pufferung, wenn for for loop erneut gestartet wird. Ich möchte den Ton von einem Mikrofon sanft wiedergeben. Als ich zuerst fragte, hat jemand empfohlen, Rückruffunktion zu verwenden, also fügte ich es hinzu, aber, ich weiß nicht, wie man es benutzt. Wie werde ich die Pufferung los? Gibt es einige Beispiele? Sollte ich Threads oder Multiprocessing verwenden?