maxiyommi / signal-systems

Contenido práctico de la asignatura Señales y Sistemas de la carrera Ingeniería de Sonido, en la Universidad Nacional de Tres de Febrero.
7 stars 6 forks source link

Funcion de adquisición y reproducción con pyaudio #27

Closed santiago-rodriguezs closed 4 years ago

santiago-rodriguezs commented 4 years ago

Buenos dias, tengo una consulta con respecto a dicha función. Tengo entendido que para que la grabación y la reproducción ocurran de manera simultanea debería haber dos ramas de procesamiento. Esto lo resolví con el método process de la librería multiprocessing, utilizando pyaudio ya que es una librería de audio que permite este tipo de procesamiento. Sin embargo, hay algo en el código que no esta funcionando y no logro identificarlo. El error obtenido es: TypeError: play() takes 1 positional argument but 13 were given. Supongo que tiene que ver con el método process, ya que la función play por si sola funciona. Adjunto el código, muchas gracias. `import pyaudio import wave from multiprocessing import Process

RECORDING

def record(filenameRecord = "output.wav", seconds = 3, fs = 44100): chunk = 1024 # Record in chunks of 1024 samples

sample_format = pyaudio.paInt16  # 16 bits per sample
channels = 2

p = pyaudio.PyAudio()  # Create an interface to PortAudio

print('Recording...')

stream = p.open(format=sample_format,
                channels=channels,
                rate=fs,
                frames_per_buffer=chunk,
                input=True)

frames = []  # Initialize array to store frames

# Store data in chunks for 3 seconds
for i in range(0, int(fs / chunk * seconds)):
    data = stream.read(chunk)
    frames.append(data)

# Stop and close the stream 
stream.stop_stream()
stream.close()
# Terminate the PortAudio interface
p.terminate()

print('Finished recording')

# Save the recorded data as a WAV file
wf = wave.open(filenameRecord, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(sample_format))
wf.setframerate(fs)
wf.writeframes(b''.join(frames))
wf.close()

PLAYING

def play(filenamePlay):

Set chunk size of 1024 samples per data frame

chunk = 1024  

# Open the sound file 
wf = wave.open(filenamePlay, 'rb')

# Create an interface to PortAudio
p = pyaudio.PyAudio()

# Open a .Stream object to write the WAV file to
# 'output = True' indicates that the sound will be played rather than recorded
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output = True)

# Read data in chunks
data = wf.readframes(chunk)

# Play the sound by writing the audio data to the stream
while data != '':
    stream.write(data)
    data = wf.readframes(chunk)

# Close and terminate the stream
stream.stop_stream()
stream.close()
p.terminate()

filenamePlay = "pinkNoise.wav" filenameRecord = "output.wav" seconds = 5

def playRecord(filenamePlay, filenameRecord, seconds): if name == "main": Process(target = record, args = (filenameRecord, seconds)).start() Process(target = play, args = (filenamePlay)).start()

playRecord(filenamePlay, filenameRecord, seconds)`

EOTMB commented 4 years ago

Hola santiago, en principio probaría de mirar el contenido de la variable filenamePlay. Al dumpearla, devuelve un solo valor?

EOTMB commented 4 years ago

Esta pregunta parece estar relacionada. Prueben de agregar "," luego de filenamePlay https://stackoverflow.com/questions/31884175/multiprocessing-typeerror-int-object-is-not-iterable

santiago-rodriguezs commented 4 years ago

Tenias razón con lo de la variable. Pude solucionar que levante bien el audio y ahora el error que obtengo es este: OSError: [Errno -9993] Illegal combination of I/O devices