본문 바로가기
AI/Speech Processing

sounddevice ) VSCode에서 소리 재생하기 + 녹음

by 하이방가루 2022. 6. 12.
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
반응형

댓글