2015-07-28 28 views
5

Attualmente sto usando NumPy per generare il file WAV da un array NumPy. Mi chiedo se sia possibile riprodurre l'array NumPy in tempo reale prima che sia effettivamente scritto sul disco rigido. Tutti gli esempi che ho trovato usando PyAudio si basano sulla scrittura della matrice NumPy su un file WAV, ma mi piacerebbe avere una funzione di anteprima che sputa solo la matrice NumPy sull'uscita audio.Python: streaming audio in tempo reale con PyAudio (o qualcos'altro)?

Dovrebbe essere anche multipiattaforma. Sto usando Python 3 (distribuzione Anaconda).

+0

E 'possibile. Python è completo di Turing. – erip

+2

Eventuali indicazioni su come si sarebbe raggiunto, quindi? Sono un novizio di Python, se non fosse chiaro. Sii gentile, per favore. –

risposta

4

Questo ha funzionato! Grazie per l'aiuto!

def generate_sample(self, ob, preview): 
    print("* Generating sample...") 
    tone_out = array(ob, dtype=int16) 

    if preview: 
     print("* Previewing audio file...") 

     bytestream = tone_out.tobytes() 
     pya = pyaudio.PyAudio() 
     stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True) 
     stream.write(bytestream) 
     stream.stop_stream() 
     stream.close() 

     pya.terminate() 
     print("* Preview completed!") 
    else: 
     write('sound.wav', SAMPLE_RATE, tone_out) 
     print("* Wrote audio file!") 

Sembra così semplice ora, ma quando non si conosce Python molto bene, sembra un inferno.

1

Come si può vedere nel examples, pyaudio legge solo i dati dal file WAV e lo scrive nello stream.

Non è necessario scrivere prima un file WAV, , è sufficiente un flusso di dati nel formato corretto.

sto aggiungendo l'esempio di seguito nel caso in cui il collegamento va mai morto (nota che non ho scritto questo codice):

"""PyAudio Example: Play a WAVE file.""" 

import pyaudio 
import wave 
import sys 

CHUNK = 1024 

if len(sys.argv) < 2: 
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0]) 
    sys.exit(-1) 

wf = wave.open(sys.argv[1], 'rb') 

p = pyaudio.PyAudio() 

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), 
       channels=wf.getnchannels(), 
       rate=wf.getframerate(), 
       output=True) 

data = wf.readframes(CHUNK) 

while data != '': 
    stream.write(data) 
    data = wf.readframes(CHUNK) 

stream.stop_stream() 
stream.close() 

p.terminate() 
+0

Sooo, in pratica dovrei controllare in che modo numpy sta facendo la conversione degli array di numpy in WAV, quindi fare la stessa cosa eccetto puntarlo sullo stream, invece di scriverlo su un file? Grazie btw, ma ho guardato quell'esempio per ore nel mese scorso questa domanda non ha avuto risposte, e non mi è venuta alcuna soluzione su come avrei fatto ... –

+1

@ MarioKrušelj Basta ridimensionare e/o convertire i dati a interi con segno a 16 bit ('dtype' di' numpy.int16'). Quindi usa il metodo array 'tobytes' per trasformarlo in una stringa di byte ... –

+0

GRAZIE! Ti farò sapere se ha funzionato. –