2016-09-13 1 views
0

저는 파이썬과이 경우 PyAudio를 사용하여 오디오 캡처/녹음에 대해 배우려고합니다. 나는 몇 가지 예를 살펴 본다이 하나 건너 온입니다 : 내가 무엇을 CHUNK, FORMAT, 채널 및 모든 말과 할 RATE의 대략적인 이해를 가지고 있다고 생각PyAudio를 사용하여 특정 시간 동안 오디오를 녹음합니까?

import pyaudio 
import wave 

CHUNK = 2 
FORMAT = pyaudio.paInt16 
CHANNELS = 2 
RATE = 44100 
RECORD_SECONDS = 3 
WAVE_OUTPUT_FILENAME = "output.wav" 

p = pyaudio.PyAudio() 

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

print("* recording") 

frames = [] 

for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 
    data = stream.read(CHUNK) 
    frames.append(data) 

print(int(RATE/CHUNK * RECORD_SECONDS)) 

print("* done recording") 

stream.stop_stream() 
stream.close() 
p.terminate() 

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 
wf.setnchannels(CHANNELS) 
wf.setsampwidth(p.get_sample_size(FORMAT)) 
wf.setframerate(RATE) 
wf.writeframes(b''.join(frames)) 
wf.close() 

,하지만 난 이해가 안 돼요 특정 시간 동안의 녹음은 작동합니다. CHUNK의 값을 2에서 4로 변경하려고하면 int (RATE/CHUNK * RECORD_SECONDS) 값이 반으로 줄어 듭니다. 그러나 코드를 실행하려면 지정된 3 초 동안 레코딩이 계속 발생합니다.

궁극적으로이 for 루프는 범위가 반으로 줄어들면 동일한 양의 시간에 어떻게 실행됩니까?

죄송합니다. 이해가되지 않으면 어리석은 질문 인 것 같습니다.

편집 : 범위를 변경하지 않고 수동으로 읽은 샘플 수를 변경하면 for 루프가 반복됩니다 (따라서 범위는 (0, 60000)에서 일정하지만 데이터 = sample.read (CHUNK)가 변경됨) 기록하는데 걸린 시간. 즉, 샘플을 두 번 반복하면 각 반복을 읽는 데 걸리는 시간이 두 배로 늘어나 데이터를 처리하는 데 2 ​​배의 시간이 걸립니다. 그러나 그렇다면 사용 가능한 처리 능력에 따라 컴퓨터마다 다른 시간이 달라지지 않을까요?

+0

'CHUNK'가 증가했기 때문에이 줄'data = stream.read (CHUNK)'는'CHUNK'가 아닌'stream.read (2)'를 – depperm

+0

처리하는데 오래 걸립니다. 그렇지 않으면 읽은 총 바이트 수는 동일합니다. –

+0

@depperm 그게 내가 생각한 것이지만 컴퓨터가 얼마나 빨리 처리 할 수 ​​있느냐에 따라 시간이 바뀌지 않을까? – WillR27

답변

1

CHUNK은 데이터 블록의 샘플 수입니다. 나는이 "블록 크기"라고 부를 것이다. 사운드 카드와 사운드 드라이버는 일반적으로 다른 샘플을 처리하지 않지만 청크를 사용합니다. 이들의 블록 크기는 전형적으로 수백 샘플이다. 512 또는 1024 샘플. 지연 시간이 매우 짧을 때만 64 또는 32 샘플과 같은 더 작은 블록 크기를 사용해야합니다. 일반적으로 2의 블록 크기는 제대로 작동하지 않습니다.

RATE은 샘플링 속도, 즉 초당 샘플 수입니다. 44100 Hertz는 CD 시대의 전형적인 샘플링 속도입니다. 요즘에는 48000 헤르츠도 자주 보입니다.

예를 들어, for -loop은 오디오 하드웨어의 데이터 블록 (또는 "청크")을 읽는 것입니다. 3 초 분량의 오디오를 녹음하려면 3 * RATE 개의 샘플을 녹음해야합니다. 블록 수를 얻으려면 블록 크기로 나누어야합니다. CHUNK.

당신이 CHUNK의 값을 변경하는 경우,이 (떨어져 int() 수행 일부 잘라 내기에서) 전체 녹화의 지속 시간을 변경하지 않지만,이 for -loop가 실행되는 횟수를 변경합니다.

NumPy를 사용하려는 경우 몇 초의 오디오를 WAV 파일에 녹음하는 훨씬 간단한 방법이 있습니다. sounddevice 모듈을 사용하여 오디오 데이터를 녹음하고 soundfile 모듈을 사용하여 WAV 파일에 저장합니다. :

import sounddevice as sd 
import soundfile as sf 

samplerate = 44100 # Hertz 
duration = 3 # seconds 
filename = 'output.wav' 

mydata = sd.rec(int(samplerate * duration), samplerate=samplerate, 
       channels=2, blocking=True) 
sf.write(filename, mydata, samplerate) 

알아 두어야 할 이유가 없으면 블록 크기를 지정할 필요가 없습니다. 기본 라이브러리 (PortAudio)가 자동으로 하나를 선택합니다.

관련 문제