시연 동영상 링크

https://www.youtube.com/watch?v=GDn8n1aH71c

주제

Send Unicode on air


주요 목표

송수신 기능 완성

#1 송신

  1. 모듈 및 상수 정의

  • 코드에 필요한 모듈을 import한다.
  • INTMAX: 오디오 신호 크기 조절 위해 사용
  • code: 유니코드에 쓰일 문자를 모스 부호로 매핑한 딕셔너리
  • MORSE_THRESHOLD: 소리가 모스 신호인지 판단하는 기준으로, 이 값 이상으로 RMS가 감지되면 소리가 있는 것으로 간주함
  • SILENCE_TIMEOUT: 지난 과제와 같이 무음이 5초간 지속되면 녹음을 종료하도록 했다.
    1. 텍스트 입력 처리
    2. 모스 부호 생성
    3. 오디오 신호 생성
    4. 소리 출력

#2 수신

  • calculate_rms(): audio sample의 RMS(Root Mean Square)값을 계산하여 소리의 세기를 수치화하고, 소리와 무음을 구분하는 데 사용함.
  • receive_data(): 마이크를 통해 입력된 소리를 실시간으로 분석하여 모스 부호로 변환하고, 이를 다시 원래 입력된 텍스트로 변환함. 소리의 세기와 타이밍을 기반으로 모스 부호를 인식하며, 5초간 무음이 지속되면 종료하도록 함.
    1. 초기 설정
    2. 오디오 스트림 열기
  • 데이터 송신과 비슷하게 마이크 입력 스트림을 열어 실시간으로 음성을 수집할 준비를 함.
  • 스트림 오픈 성공 여부에 따라 디버깅용으로 다른 메시지가 출력되도록 함.
    1. 모스 부호 수신 및 실시간 변환
    2. 스트림 종료
    3. 모스 부호 → 텍스트 변환
  • 나머지 부분(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