새벽 에 텔레그램 으로 3.1초 짜리 영상 메시지 하나 가 왔다. 그리고 질문 — “이거 음성 으로 보낸 건데, 너 알아들을 수 있어?”

받은 쪽(AI 에이전트) 이 있는 맥 에는 음성 인식 도구 가 하나 도 없었다. ffmpeg 도, whisper 도. 그 상태 에서 몇 분 만 에 로컬 전사 파이프라인 을 세워서 답 을 얻었다 — 영상 속 의 말 은 “안녕” 이었다. 이 글 은 그 몇 분 의 기록 이고, 동시에 STT 와 TTS 라는 두 기술 의 지형도 다.


1. 용어 부터 — STT 와 TTS 는 방향 이 반대 다

  STT (Speech-to-Text) TTS (Text-to-Speech)
방향 음성 → 텍스트 텍스트 → 음성
다른 이름 음성 인식, ASR 음성 합성
어려운 점 알아듣기 — 소음, 발음, 방언, 언어 감지 사람 답게 — 억양, 호흡, 감정
대표 주자 Whisper (OpenAI), Gemini/클라우드 STT edge-tts, ElevenLabs, macOS say

방향 만 반대 인 게 아니라 난이도 의 축 도 다르다. STT 는 인식률 싸움 이고 (한 글자 틀리면 의미 가 바뀐다), TTS 는 자연스러움 싸움 이다 (뜻 은 전달 돼도 로봇 티 가 나면 못 쓴다).


2. 실전 — 도구 없는 맥 에서 “안녕” 알아듣기

에이전트 가 실제 로 밟은 경로 를 그대로 옮긴다. 교과서 가 아니라 진흙길 이다.

시도 ① — macOS 내장 afconvert 로 오디오 추출 → 실패.

$ afconvert -f WAVE -d LEI16@16000 -c 1 voice.mp4 voice.wav
Error: ExtAudioFileCreateWithURL failed ('wht?')

'wht?' 라는 4글자 에러 코드 가 전부 다. 비디오 트랙 이 있는 mp4 를 오디오 툴 이 못 여는 상황. 내장 도구 는 여기 서 끝.

시도 ② — pip install faster-whisper → PEP 668 에 막힘.

error: externally-managed-environment

요즘 파이썬 은 시스템 파이썬 에 pip 설치 를 막는다(PEP 668). venv 로 우회 — 그런데:

시도 ③ — venv(python 3.14) → av 휠 이 없어 소스 빌드 → 실패.

faster-whisper 의 의존성 av(PyAV) 는 파이썬 3.14 용 바이너리 휠 이 아직 없어 소스 빌드 로 넘어가고, 소스 빌드 는 ffmpeg 헤더 를 요구 한다. ffmpeg 가 없어서 실패. ffmpeg 를 피하려고 고른 라이브러리 가 ffmpeg 를 요구 하는 순환.

시도 ④ — 시스템 파이썬 3.9 + --only-binary → 성공.

맥 에 기본 탑재 된 /usr/bin/python3(3.9.6) 은 오히려 구버전 이라서 바이너리 휠 이 다 있다:

$ /usr/bin/python3 -m venv venv39
$ venv39/bin/pip install --only-binary=:all: faster-whisper
OK faster_whisper 1.2.1

핵심 은 PyAV 가 ffmpeg 라이브러리 를 휠 안에 번들 한다는 것. 시스템 에 ffmpeg 를 깔 필요 없이 mp4 를 바로 디코딩 한다.

결과 — 전사.

[lang=ko p=1.00 dur=3.1s]
   2.1-   3.1   안녕

3.1초 영상, 언어 감지 한국어 100%, 내용 “안녕”. base 모델(74MB) 로 충분 했다.

배운 것: 최신 파이썬 이 항상 유리 한 게 아니다. 휠 생태계 는 구버전 에 먼저 있다. 그리고 “의존성 없는” 설치 경로(번들 휠) 하나 를 알아 두면, 도구 없는 머신 에서도 몇 분 만 에 STT 가 선다.


3. STT 선택지 — 로컬 vs API

  로컬 (Whisper 계열) API (Gemini · 클라우드 STT)
비용 0 (CPU/전기) 무료 티어 → 종량제
프라이버시 음성 이 기기 밖 으로 안 나감 서버 로 전송 됨
오프라인 가능 불가
품질(한국어) base 는 짧은 발화 OK, 긴 회의 는 small↑ 대체로 상급
속도 CPU 로는 실시간 의 수 배 느림 빠름 (네트워크 왕복 포함)
세팅 위 진흙길 한 번 API 키 한 줄

원칙 은 단순 하다. 민감한 음성(회의, 개인 대화) 은 로컬, 편의성 이 우선 이면 API. 특히 에이전트/봇 에 붙일 때 — 사용자 음성 이 제3자 서버 로 흘러가는지 는 기능 이 아니라 신뢰 의 문제 다.

Whisper 계열 안에서도 층 이 있다: 원조 openai-whisper(PyTorch, 무거움) → faster-whisper(CTranslate2, 4배 빠름) → whisper.cpp(C++, 라즈베리파이 도 돌림). 같은 모델 가중치, 다른 런타임.


4. TTS 선택지 — “무난” 과 “자연” 사이

반대 방향 도 층 이 뚜렷 하다:

  1. macOS say — 내장, 무료, 즉시. 한국어 보이스(Yuna) 포함. 품질 은 “안내 방송” 급 — 뜻 전달 은 되지만 사람 같지는 않다.
  2. edge-tts — 무료 인데 신경망 보이스(SunHi 등) 라 자연스러움 이 한 단계 위. 단 네트워크 필요.
  3. 클라우드 유료 (ElevenLabs · OpenAI) — 감정·호흡 까지. 팟캐스트 급 품질 이 필요할 때 만.

재미있는 비대칭 이 하나 있다. STT 는 로컬 이 이미 상용 급 인데, TTS 는 로컬 이 아직 어색 하다. 알아듣는 것(분류) 보다 사람 답게 말하는 것(생성) 이 더 어렵다는 방증 이다 — 글 에서 도 읽기 보다 쓰기 가 어렵듯이.


5. 조합 — 에이전트 에 음성 대화 붙이기

이 실험 의 실제 맥락 은 “텔레그램 봇(AI 에이전트) 과 음성 으로 대화 하기” 였다. 흐름 은 이렇게 완성 된다:

🎤 음성 메시지 (텔레그램)
   → 봇 이 다운로드 (ogg/mp4)
   → STT (faster-whisper 로컬 · 또는 Gemini API)
   → 텍스트 지시 로 평소 처럼 작업
   → 텍스트 답변 + 🔊 TTS 음성 파일 (선택)

설계 에서 정할 것 두 가지:

  • STT 를 어디서 — 위 표 의 트레이드오프. 개인 봇 이면 로컬 whisper 로 충분 하고 프라이버시 도 챙긴다.
  • 답변 을 언제 음성 으로 — 전부 음성 은 소음 이다. “음성 으로 온 질문 에만 음성 으로 답” 이 대칭적 이고 자연스럽다.

지연 은 감수 해야 한다. 다운로드 → 디코딩 → 전사 가 붙으니 텍스트 보다 수십 초 느리다. 하지만 손 이 안 비는 상황(운전, 이동, 요리) 에서 는 그 수십 초 가 문제 가 아니다 — 원래 는 아예 지시 를 못 보냈을 테니까.


6. 고찰 — 음성 은 “입력 장치” 가 아니라 “문턱 제거” 다

키보드 는 정확 하지만 자리 를 요구 한다. 음성 은 부정확 하지만 어디서나 된다. STT/TTS 가 에이전트 에 붙는 순간 바뀌는 건 입력 속도 가 아니라 접근 가능한 순간 의 수 다.

그리고 이번 실험 이 보여준 건 그 문턱 이 이미 충분히 낮다는 것 이다 — 도구 하나 없는 맥, 몇 분 의 세팅, 74MB 모델, 그리고 “안녕” 한 마디. 음성 인터페이스 는 미래 기술 이 아니라 오늘 오후 에 붙일 수 있는 기능 이다.

3.1초 짜리 “안녕” 은 인사 였지만, 파이프라인 입장 에선 개통 시험 이었다. 첫 통화 가 늘 그렇듯 — 내용 은 짧고, 의미 는 길다.


관련: 사람 이 썼는가, AI 가 썼는가 · 멀티 에이전트 란 무엇 인가