음향 통신 개선 - 자동 녹음 종료 기능
시연 동영상 링크
https://www.youtube.com/watch?v=GDn8n1aH71c
주제
Send Unicode on air
주요 목표
송수신 기능 완성
#1 송신
- 모듈 및 상수 정의

- 코드에 필요한 모듈을 import한다.
- INTMAX: 오디오 신호 크기 조절 위해 사용
- code: 유니코드에 쓰일 문자를 모스 부호로 매핑한 딕셔너리
- MORSE_THRESHOLD: 소리가 모스 신호인지 판단하는 기준으로, 이 값 이상으로 RMS가 감지되면 소리가 있는 것으로 간주함
- SILENCE_TIMEOUT: 지난 과제와 같이 무음이 5초간 지속되면 녹음을 종료하도록 했다.
- 텍스트 입력 처리
- 모스 부호 생성
- 오디오 신호 생성
- 소리 출력
#2 수신
- calculate_rms(): audio sample의 RMS(Root Mean Square)값을 계산하여 소리의 세기를 수치화하고, 소리와 무음을 구분하는 데 사용함.
- receive_data(): 마이크를 통해 입력된 소리를 실시간으로 분석하여 모스 부호로 변환하고, 이를 다시 원래 입력된 텍스트로 변환함. 소리의 세기와 타이밍을 기반으로 모스 부호를 인식하며, 5초간 무음이 지속되면 종료하도록 함.
- 초기 설정
- 오디오 스트림 열기
- 데이터 송신과 비슷하게 마이크 입력 스트림을 열어 실시간으로 음성을 수집할 준비를 함.
- 스트림 오픈 성공 여부에 따라 디버깅용으로 다른 메시지가 출력되도록 함.
- 모스 부호 수신 및 실시간 변환
- 스트림 종료
- 모스 부호 → 텍스트 변환
- 나머지 부분(main)은 강의 자료에서 제공된 코드를 사용했다.
세부 목표
목표1) 소음에 대한 처리
- calculate_rms 함수를 통해 입력된 audio sample(chunk)의 RMS값을 계산하여 소리 세기를 측정하도록 했다.
- 이때 MORSE_THRESHOLD값을 설정하여 잡음과 모스 부호 신호를 구분하는 기준값이 되도록 했다. 소음 환경에서 신호의 세기가 소음보다 강할 것이니, RMS 값이 이 임계값을 초과하면 소리로 판단된다.
목표2) 데이터 도착할 때부터 연산 (이전 녹음 데이터 버림)
- recieve_data()함수에서 초기 변수 설정 시 data_started를 False로 설정한 바 있다. 이 동안 소리가 언제 시작되는지 자동 판단하기 위해 RMS값의 계산만 이루어지고, morse 문자열에 무언가 추가되지 않는다.
- RMS(코드에서는 level)값이 앞서 언급한 MORSE_THRESHOLD를 초과하면 신호가 시작된 것으로 판단하고 자동으로 부호 변환을 시작한다. data_started를 True로 변경하며, “Data started.”를 터미널에 출력하여 사용자에게 수신 시작을 알리도록 했다. (data_started가 True가 된 이후에만 모스 부호 생성 로직이 작동함)
- 또한 다음 코드는 무음/잡음 → 소리로 변환하는 상황을 처리한다.
목표3) 데이터 도착 완료 후 N초 뒤 종료 (자동 녹음 종료, 최소 3초)
- 코드에서 SILENCE_TIMEOUT값과 silence_limit값을 설정했다.
- 즉, RMS 값이 MORSE_THRESHOLD이하일 때 silence_chunks가 증가하는데, 이 silence_chunks가 silence_limit(약 469)에 도달하면 5초간 무음이 지속된 것으로 간주하고 자동으로 종료되는 것이다.
- 종료 시 “5s silence detected. Stopping.”을 터미널에 출력해 사용자에게 알리도록 했다.
- 모스부호 국제표준에 따르면 단어 간 공백이 0.7초이고 이 코드에서의 종료 판단 기준이 5초이므로, 데이터 끝을 명확히 판단할 수 있다.
Leave a comment