본문 바로가기
개발Study/IP Camera

make IP camera using raspberry pi 4 (14) sound detecting

by happy90 2022. 3. 2.
SMALL

만드는 순서가 뒤죽박죽이긴 한데
아이가 울면 핸드폰 알람이 울리도록 하기 위해서 sound detecting을 준비하기로 했다.

먼저 rpi에서 python으로 recording기능을 테스트 함.

https://makehappylife.tistory.com/entry/rpi-%EB%A7%88%EC%9D%B4%ED%81%AC-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EB%85%B9%EC%9D%8C

 

python pyaudio를 통해 sound입력레벨을 알 수 있고,
threshold를 정해 지정시간동안 큰 소리가 발생하면 디텍팅이 가능하다.
디텍팅 함수를 아래와 같이 구현하였다.

def detect_sound(data_chunk):

    THRESHOLD = 350
    compare = max(data_chunk) > THRESHOLD

    return compare

def detecting(audio):

    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 44100
    CHUNK = 4096
    LOUD_CHUNKS = 3 * 44100 / 4096  # about 3sec
    RECORD_SECONDS = 60
    WAVE_OUTPUT_FILENAME = "record_test.wav"

    # start Recording
    stream = audio.open(format=pyaudio.paInt16,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    print("start recording")

    frames = []
    loud_chunks = 0
    data_all = array('h')
    start_time = 0
    end_time = 0

    start_time = time()
    print('start at silence ', start_time)

    while True:
        data = array('h', stream.read(CHUNK))
        data_all.extend(data)

        loud = detect_sound(data)

        if loud:
            loud_chunks += 1
            if loud_chunks > LOUD_CHUNKS:
                end_time = time()
                print('it is loud!!!! ', end_time)
                print(end_time - start_time)
                send_sound_alarm()
                break
        else:
            loud_chunks = 0

    print("finished recording")

    # stop Recording
    stream.stop_stream()
    stream.close()
    audio.terminate()

오디오 입력을 chunk만큼씩 읽는다.
3초동안 큰 소리가 나면 send_sound_alarm() 함수를 실행시킨 후 함수가 종료된다.
send_sound_alarm함수에 detecting시 request를 전송하는 처리를 넣고, 이 어플을 데몬으로 돌릴 수 있도록 구현하면 되겠다.

LIST

댓글