728x90
반응형
conda install -c conda-forge python-sounddevice
또는
pip install sounddevice
위의 명령어를 통해서 sounddevice를 설치한다.
import sounddevice as sd
sd.play(arr, sample_rate) # 재생시작 백엔드에서 작동한다.
# 재생을 즉시 종료하려면 sd.stop()
# 재생이 끝날 때까지 기다리려면 sd.wait()
# 원하는 구간만 재생할 때
sd.play(arr[시작시간*sample_rate:종료시간*sample_rate], sample_rate)
녹음파일 생성
sd.query_devices() # 사운드 장치 정보를 모두 불러온다.
# 실행 결과
0 Microsoft Sound Mapper - Input, MME (2 in, 0 out)
> 1 헤드셋 마이크(Samsung USB C Earphones, MME (2 in, 0 out)
2 마이크(Realtek(R) Audio), MME (2 in, 0 out)
3 Microsoft Sound Mapper - Output, MME (0 in, 2 out)
< 4 헤드셋 이어폰(Samsung USB C Earphones, MME (0 in, 2 out)
5 스피커(Realtek(R) Audio), MME (0 in, 2 out)
6 Speakers (Realtek HD Audio output), Windows WDM-KS (0 in, 2 out)
7 마이크 (Realtek HD Audio Mic input), Windows WDM-KS (2 in, 0 out)
8 Headphones (Realtek HD Audio 2nd output), Windows WDM-KS (0 in, 2 out)
9 스테레오 믹스 (Realtek HD Audio Stereo input), Windows WDM-KS (2 in, 0 out)
10 헤드셋 마이크 (Samsung USB C Earphones), Windows WDM-KS (2 in, 0 out)
11 헤드셋 이어폰 (Samsung USB C Earphones), Windows WDM-KS (0 in, 2 out)
12 Speakers (Nahimic mirroring Wave Speaker), Windows WDM-KS (0 in, 2 out)
실행결과를 보면 입력장치(마이크)는 1번에 연결되어있고, 출력장치(스피커)는 4번에 연결된 걸 알 수 있다.
sd.query_devices(1,'input') # 장치에 스펙 보기
# 실행결과
{'name': '헤드셋 마이크(Samsung USB C Earphones',
'hostapi': 0,
'max_input_channels': 2,
'max_output_channels': 0,
'default_low_input_latency': 0.09,
'default_low_output_latency': 0.09,
'default_high_input_latency': 0.18,
'default_high_output_latency': 0.18,
'default_samplerate': 44100.0}
결과를 보면 최대 2채널을 지원하고 0.09~0.18의 지연시간이 존재하며 최대 44100샘플링할 수 있다는 것을 알 수 있다.
import sounddevice as sd
import soundfile as sf
from queue import Queue
sr = 44100
ch = 2
subtype = 'PCM_24'
filename = 'microphone_test.wav'
q = Queue()
# 콜백함수 정의
def callback(indata, frames, time, status):
if status:
print(status, file=sys.stderr)
q.put(indata.copy())
# ctrl+c 입력이 들어올 때까지 녹음진행
try:
with sf.SoundFile(filename,'w',sr,ch,subtype) as f:
with sd.InputStream(samplerate=sr, channels=ch, callback=callback):
while True:
f.write(q.get())
except KeyboardInterrupt as ke:
print("Recording finished")
except Exception as e:
print(e)
728x90
반응형
댓글