"자비스, 오늘 일정 알려줘." 영화 아이언맨에서나 보던 장면을, 집에 있는 맥북으로 실제로 구현해봤습니다. 호출어를 부르면 알아듣고, 답을 음성과 메신저로 돌려주는 개인 AI 비서를 만든 전 과정을 정리합니다. (보안·개인정보에 해당하는 부분은 ***로 가렸습니다.)
1. 큰 그림
목표는 단순합니다. "음성으로 부르면 → 알아듣고 → 일을 처리하고 → 답을 돌려준다." 이를 위해 다섯 조각이 필요했습니다.
- 두뇌 역할을 할 AI 에이전트 (예: 로컬에서 도는 오픈소스 에이전트 프레임워크)
- 말로 답하는 음성 출력(TTS)
- 내 말을 글로 바꾸는 음성 입력(STT)
- 호출어를 알아듣는 음성 깨우기(Voice Wake)
- 답을 손쉽게 받는 메신저 연동 (예: 텔레그램)
2. 음성으로 답하게 만들기 (TTS)
가장 먼저 비서가 "말"을 하도록 했습니다. 맥에는 내장 음성 합성 기능(say 명령)이 있어서 별도 비용 없이 시작할 수 있습니다.
say -v <보이스이름> "안녕하세요, 무엇을 도와드릴까요?"
한국어 여성 보이스를 골라 비서의 기본 목소리로 지정했습니다. 더 자연스러운 음성을 원하면 외부 TTS 서비스로 업그레이드할 수도 있습니다. 처음엔 무료 내장 음성으로 충분합니다.
3. 내 말을 알아듣게 만들기 (STT)
다음은 반대 방향, 즉 내 음성을 텍스트로 바꾸는 작업입니다. 오픈소스 음성인식 모델을 로컬에 설치해 인터넷 없이도 변환되게 했습니다.
brew install whisper-cpp # 음성인식 엔진 설치
# 한국어 인식용 모델 파일을 받아 지정
녹음 파일을 16kHz 모노로 변환한 뒤 모델에 넣으면 한국어가 꽤 정확하게 텍스트로 나옵니다. 이걸로 비서가 "귀"를 갖게 됐습니다.
4. 단축어로 손쉽게 호출하기
맥/아이폰의 단축어(Shortcuts) 앱을 이용하면 "음성 받아쓰기 → 명령 전달"을 한 번에 묶을 수 있습니다. 단축어가 받아쓴 텍스트를 비서에게 넘기고, 비서의 답을 메신저로 받는 구조입니다.
여기서 한 가지 함정이 있었는데, 단축어의 '입력 요청' 결과를 셸 스크립트로 넘길 때 값이 빈 채로 덮어써지는 문제였습니다. 입력값을 스크립트 안에 인라인 토큰으로 주입하는 방식으로 해결했습니다. (자동화에서 흔히 만나는 함정이니 참고하세요.)
5. 호출어로 깨우기 (Voice Wake)
진짜 "자비스" 느낌을 내려면 버튼 없이 호출어만으로 깨어나야 합니다. 음성 깨우기 기능을 켜고 호출어를 "자비스"로, 언어를 한국어로 설정했습니다. 이제 호출어를 부르면 비서가 듣고, 이어지는 말을 인식해 처리합니다.
6. 답을 메신저로 받기
여기서 현실적인 한계를 하나 만났습니다. 음성으로 들어온 요청은 답이 특정 화면에만 표시되고, 메신저(텔레그램)로는 자동 전달되지 않았습니다. 메신저 대상 정보(채팅 ID 등)가 음성 경로에는 실려오지 않았기 때문입니다.
그래서 중계기(watcher) 스크립트를 만들었습니다. 음성으로 들어온 대화의 답만 골라내어, 메신저 봇을 통해 그대로 전달하는 방식입니다. 봇 토큰과 채팅 ID 같은 민감값은 설정 파일에서 읽어오게 했습니다.
봇 토큰: ***
채팅 ID: ***
이 중계기를 백그라운드 자동 실행(LaunchAgent)으로 등록해, 맥이 켜져 있는 한 항상 동작하도록 했습니다.
7. 삽질에서 얻은 교훈
- 경로·식별자는 처음부터 가려서 관리: 토큰, 채팅 ID, 이메일(***)은 코드에 직접 박지 말고 설정 파일로 분리하세요.
- 음성 인식기가 멈추면 앱을 재시작하면 대개 살아납니다. 설정은 유지됩니다.
- 완벽한 정식 경로가 막히면 우회로: 정식 연동이 안 될 때 중계기 같은 우회 방식이 오히려 더 안정적일 때가 있습니다.
- 외부 노출은 최소화: 가능하면 로컬(맥 안에서만) 동작하도록 묶어 보안 위험을 줄였습니다.
마무리
거창한 장비 없이도, 맥 한 대와 오픈소스 도구들만으로 "부르면 답하는 비서"를 만들 수 있었습니다. 핵심 흐름은 TTS(말하기) → STT(듣기) → 단축어/호출어(깨우기) → 메신저(전달) 네 조각입니다. 처음엔 무료 도구로 시작해 필요에 따라 업그레이드하면 됩니다. 다음 글에서는 비서가 일정·메일까지 챙겨주는 자동화로 이어가 보겠습니다.