2017-11-08 127 views
1

파이썬을 사용하여 랩톱 컴퓨터에서 마이크 입력을 스트리밍하고 있습니다. 현재 PyAudio 및 .wav를 사용하여 2 초 배치 (아래 코드)를 작성한 다음 새로 작성한 .wav 파일의 프레임 표현을 루프에서 읽습니다.Python에서 스트리밍 마이크 입력 유지

그러나 실제로는 .wav 파일의 Int16 표현 인 코드에서 "signal"로 표시되는 np.ndarray을 원합니다. .wav를 완전히 쓰지 않고 내 애플리케이션을 마이크로 배치 대신 "실시간"으로 보이게 만드는 방법이 있습니까?

import pyaudio 

import wave 

#AUDIO INPUT 

FORMAT = pyaudio.paInt16 

CHANNELS = 1 

RATE = 44100 

CHUNK = 1024 

RECORD_SECONDS = 2 

WAVE_OUTPUT_FILENAME = "output.wav" 

audio = pyaudio.PyAudio() 

# start Recording 

stream = audio.open(format=FORMAT, channels=CHANNELS, 

       rate=RATE, input=True, 

       frames_per_buffer=CHUNK) 
while(1): 
    print "recording" 

    frames = [] 

    for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 

     data = stream.read(CHUNK) 

     frames.append(data) 

    waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 

    waveFile.setnchannels(CHANNELS) 

    waveFile.setsampwidth(audio.get_sample_size(FORMAT)) 

    waveFile.setframerate(RATE) 

    waveFile.writeframes(b''.join(frames)) 

    waveFile.close() 

    spf = wave.open(WAVE_OUTPUT_FILENAME,'r') 

    #Extract Raw Audio from Wav File 
    signal = spf.readframes(-1) 
    signal = np.fromstring(signal, 'Int16') 
    copy= signal.copy() 

# 정지 기록

stream.stop_stream()

stream.close() audio.terminate()

답변

0

예, 당신이 콜백을 줄 수있는 stream 변수 당신이 원하는 그 오디오로하십시오 :

def callback(input_data, frame_count, time_info, flags): 
    ... 

    return input_data, pyaudio.paContinue 

stream = audio.open(format=FORMAT, 
        channels=CHANNELS, 
        rate=RATE, 
        input=True, 
        stream_callback=callback, 
        frames_per_buffer=CHUNK) 

더보기 here.

+0

데이터를 사용할 수있을 때마다 콜백이 실행되는 것처럼 보입니까? audio.open과 관련하여 input_data 란 정확히 무엇입니까? stream.read()와 같은가요? – knowads

+0

np.int16 인 것 같습니다. 하나는'np.fromstring (input_data, dtype = np.int16)'을 사용하여 읽을 수 있습니다. –

+0

더 일반적으로, 나는'audio.open'에 전달 된'FORMAT'에 기반한다고 생각합니다. 해당 데이터 형식에 해당하는 numpy 형식입니다. –