연구노트

R&E 연구노트 ⑭ (2026) 실시간 음성·영상 인식 재도전

2마지막 수정
R&E 연구노트 ⑭ (2026) 실시간 음성·영상 인식 재도전

연구노트 시리즈. 2026년 초의 초기 탐색 기록이다. 최종 출품작(경기도과학전람회)에는 포함되지 않았다.

미뤄 둔 숙제로 돌아가다

1년 차에는 시각 기반 화자 분리가 실시간의 벽에 막혀 Whisper 기반 단일 화자 STT로 우회했다. 2년 차에는 미뤄 둔 숙제, 즉 음성과 영상을 동시에 보는 실시간 AVSR에 다시 도전했다. 목표는 웹캠과 마이크 입력을 그 자리에서 받아 일정 지연 안에 텍스트로 변환하는 것이다.

데이터 수집

OpenCV로 웹캠 프레임을 실시간 캡처하고 PyAudio로 마이크 음성을 실시간 스트리밍한다. 최근 약 3초 구간의 영상·음성을 버퍼(deque)에 저장하는데, deque는 오래된 데이터를 자동으로 밀어내 최근 N초를 유지하기에 알맞다. 수집 스레드가 같은 버퍼에 접근하므로 충돌을 막기 위해 Lock을 적용했다.

전처리와 동기화

실시간 처리에서 가장 까다로운 건 영상과 음성의 길이를 맞추는 것이다. 영상은 모델 입력을 위해 Grayscale로, 음성은 float32로 변환해 버퍼에 저장한다. 영상 프레임 수와 음성 샘플 수의 비율(16000Hz / 25fps)을 고려해 길이를 정렬하는데, 1프레임당 오디오 샘플 640개꼴로 시간축을 맞춘다. padding과 trimming으로 모델이 요구하는 입력 형태에 정확히 맞춘다.

추론

AVSR 추론 엔진(InferenceEngine)을 로드하고 1.5초 간격으로 버퍼 데이터를 추론한다. video/audio transform과 배치 구성(collate_pad)을 적용하고 GPU(CUDA)로 추론 속도를 높였다.

GUI

PyQt로 상단에 실시간 웹캠 영상, 하단에 인식 결과 텍스트를 출력한다. QThread로 영상, 음성, 추론을 병렬 실행하고 Signal/Slot으로 UI와 백엔드를 연결했다. 무거운 추론이 UI 스레드를 멈추지 않게 하는 게 핵심이었다.

안정성

수집 스레드와 추론 스레드를 분리해 서로 간섭하지 않게 하고, 종료 시 카메라와 오디오 스트림 같은 리소스를 정상 해제하며, 예외 처리로 추론 중 오류에도 시스템 전체가 멈추지 않게 했다.

결과와 남은 과제

실시간으로 영상과 음성을 동시에 처리하는 AVSR 시스템이 동작했고, 사용자가 말하면 일정 지연 후 텍스트로 변환되어 GUI에 출력됐다. 멀티스레딩 구조로 안정적인 실시간 처리가 가능함을 확인했다.

다만 추론 속도가 전체 성능을 좌우했다. 모델이 무거우면 지연이 길어져 실시간이 무색해진다. 앞으로는 모델 경량화와 추론 최적화로 지연을 줄이고 잡음, 조명 변화 환경에서의 성능을 끌어올려야 한다. 1년 차에 못 푼 다중 화자 분리를 이번엔 실시간 위에서 제대로 다뤄 보는 게 목표다.

이 글은 2026년 초의 실험 기록이다. 결국 그해 경기도과학전람회 출품작은 이 데스크톱 AVSR이 아니라, 1년 차 적응형 키오스크를 제대로 다듬는 방향으로 정해졌다.

변경 이력 (2건)
  1. gitprogam 수정feat(binaryhub-blog): tetris 위키 + SEO 정비 + hero 이미지 + 글 다수
  2. gitprogam 최초 작성init: monorepo (nsgh-tools + binaryhub-blog)

관련 글