MediaPipe로 얼굴을 읽고 실시간으로 목소리를 조절하는 오픈소스 에이전트
Open-source agent that uses MediaPipe to read your face and adapt its voice in real time
핵심 요약
MediaPipe를 활용해 사용자의 표정과 시선을 실시간으로 분석하고, 그에 맞춰 말투를 바꾸는 오픈소스 AI 에이전트 프레임워크.
- 실시간 표정 분석 — MediaPipe를 통해 사용자의 감정, 시선, 참여도를 초당 8프레임으로 추적함.
- 자연스러운 대화형 AI — LLM이 사용자의 상태를 파악하고 Inworld TTS를 통해 감정이 담긴 목소리로 응답함.
- 모듈형 프레임워크 — Vision Agents를 사용하여 TTS, STT, LLM 등 각 기능을 독립적인 플러그인으로 쉽게 교체 가능함.
- 비침습적 가이드 — 사용자가 화면을 보지 않을 때 상황에 맞게 대화를 유도하며, 단순히 관찰 내용을 나열하지 않음.
저는 비디오와 오디오를 실시간으로 처리하는 AI 에이전트를 구축하기 위한 오픈소스 파이썬 프레임워크인 'Vision Agents'를 만들고 있습니다. 이것은 그 위에서 구축한 데모입니다: 웹캠을 통해 사용자의 얼굴을 추적하고, 감정과 시선을 분류하여 그에 따라 말하는 방식을 바꾸는 대화형 에이전트입니다.
이 에이전트는 웹캠 피드에서 MediaPipe의 FaceLandmarker를 초당 8프레임으로 실행합니다. 프레임당 52개의 블렌드셰이프 계수를 추출하여 거친 레이블로 분류합니다. 감정(행복, 슬픔, 놀람, 생각함, 중립), 시선 방향(카메라 응시, 좌/우, 위, 아래), 참여도(참여 중, 산만함, 부재)를 파악합니다. 분류는 히스테리시스가 포함된 임계값 기반(미소 감지의 경우 진입 0.45, 이탈 0.30)이며, 깜빡임을 방지하기 위해 4프레임 동안 유지되어야 합니다.
그 얼굴 상태는 LLM에 전달되기 전에 사용자 대화 내용 앞에 추가됩니다:
[user state: sad, looking down] my day was rough
LLM은 자연어 제어를 지원하는 Inworld의 TTS-2 모델을 위한 전달 스타일을 선택합니다. [say sadly with deliberate pauses in a low voice]와 같이 괄호로 묶인 지시 사항을 작성하면 모델이 이를 따릅니다. 5가지 감정만 선택하는 드롭다운이 아닙니다. 완전한 자연어입니다. 또한 [laugh], [sigh]와 같은 비언어적 소리를 실제 오디오로 인라인 렌더링합니다.
만약 사용자가 5초 이상 다른 곳을 보거나 화면에서 벗어나면, 에이전트는 침묵하는 대신 문맥에 맞게 다시 대화를 유도합니다. 에이전트는 자신이 보는 것을("당신이 다른 곳을 보는 것을 알아챘어요") 절대 설명하지 않습니다. 카메라 신호는 모델을 위한 가이드일 뿐, 모델이 반복하는 내용이 아닙니다.
얼굴 추적기는 Vision Agents의 "프로세서"입니다. 프로세서는 비디오 스트림에 연결되어 LLM과 독립적으로 자체 프레임 속도로 실행됩니다. 서로 차단하지 않고 하나의 에이전트 안에 여러 개를 쌓을 수 있습니다(YOLO 20fps, MediaPipe 8fps, 깊이 모델 15fps). 프레임워크가 프레임 분배를 처리합니다. 사용자가 직접 스레딩 코드를 작성할 필요가 없습니다.
전체 에이전트 설정은 약 15줄의 파이썬 코드입니다. 각 부분(TTS, STT, LLM, 프로세서)은 교체 가능한 플러그인입니다.
스택: 오케스트레이션을 위한 Vision Agents(MIT 라이선스), 음성을 위한 Inworld TTS-2, 아바타를 위한 Anam(CARA 모델), 얼굴 랜드마크를 위한 MediaPipe, LLM으로 Gemini, STT를 위한 Deepgram, 실시간 비디오/오디오 전송을 위한 Stream.
이것이 무엇이 아닌지 언급할 가치가 있습니다: 이것은 "우리가 당신의 진정한 감정을 감지할 수 있다"는 의미의 감정 AI가 아닙니다. 블렌드셰이프 분류는 의도적으로 거칠게 설정되었습니다. 임계값 이상의 미소는 "행복"입니다. 치켜뜬 눈썹과 벌어진 턱은 "놀람"입니다. LLM이 합리적인 전달 스타일을 선택하기에 충분한 신호일 뿐, 임상적인 주장을 하기에는 부족합니다.
질문 환영합니다.


