2017-11-23 21 views
2

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?

Antwort

0

Die Verzögerung ist durch Größe puffern ... Sie werden eine vernachlässigbare Verzögerung erhalten einen 1k Puffer nach

# Window_Size = 22050 # Point 
Window_Size = 1024 # Point 
Verwandte Themen