목소리를 몇 초 녹음으로 복제하고, 7개 TTS 엔진으로 23개 언어를 말하게 하고, 전역 단축키로 어떤 앱에든 받아쓰기(Whisper)를 꽂고, 내장 MCP 서버 하나로 Claude·Cursor 같은 에이전트가 복제된 목소리로 말하게 한다 — 전부 클라우드 없이 기기 안에서. ElevenLabs와 WisprFlow를 합쳐 로컬로 돌리는 느낌의, Tauri(Rust) 데스크탑 앱 + Python FastAPI 백엔드. (저장소: jamiepine/voicebox · v0.5.0 · 638파일 · MIT · Spacedrive 창업자 Jamie Pine)
"내 목소리를, 내 컴퓨터 안에서, 사람도 AI 에이전트도 함께 쓰는 음성 작업대로."
지금까지 "AI 목소리"는 대부분 웹 서비스(ElevenLabs 등)에 살았다. 음성을 올리고, 클라우드에서 처리하고, 결과를 내려받는다 — 요금이 붙고, 내 목소리 데이터가 남의 서버를 거친다. Voicebox는 이 흐름을 통째로 내 노트북 안으로 가져온다. 몇 초짜리 녹음으로 목소리를 복제하고(zero-shot cloning), 그 목소리로 23개 언어를 말하게 하고, 전역 단축키 한 번으로 어떤 앱에든 음성 받아쓰기를 꽂는다. 게다가 MCP 서버로 자기를 열어, Claude Code 같은 에이전트가 "이 문장을 내 목소리로 읽어줘"를 직접 실행한다.
먼저 핵심 용어 TTS·STT부터 풀어두자. 컴퓨터가 글자를 소리로 바꾸는 게 TTS(Text-to-Speech, 음성 합성), 반대로 소리를 글자로 받아 적는 게 STT(Speech-to-Text, 음성 인식)다. Voicebox는 이 둘을 모두, 그리고 그 사이에 작은 로컬 LLM(Qwen3)을 끼워 "받아쓴 문장을 다듬거나" "목소리에 성격을 입히는" 일까지 한 앱에서 처리한다.
{참조 오디오 + 그 대본} 한 쌍만 주면 그 음색으로 새 문장을 읽는다.중요한 구분 하나. Voicebox는 "데스크탑 앱(Tauri)"이지만 그 속은 두 개의 프로그램이다. 겉껍데기는 Rust로 만든 네이티브 셸(창·단축키·오디오 캡처 담당)이고, 진짜 두뇌는 Python FastAPI 서버(AI 추론 담당)다. 앱을 켜면 Rust 셸이 Python 서버를 사이드카(sidecar)로 같이 띄운다. 라이선스는 MIT, 만든 사람은 파일 동기화 앱 Spacedrive로 유명한 Jamie Pine이다.
"클라우드 음성 SaaS의 기능을, 프라이버시·무료·확장성으로 되사온다."
2026년 현재 AI 음성은 두 갈래로 갈라져 있었다. 한쪽은 ElevenLabs 같은 합성 SaaS(목소리 복제·낭독), 다른 쪽은 WisprFlow 같은 받아쓰기 앱(말하면 글자로). 둘 다 강력하지만 클라우드 종속·구독료·데이터 업로드라는 같은 약점을 안고 있었다.
음성 복제 SaaS는 글자 수·생성 횟수로 과금하고, 내 음성 샘플이 업체 서버에 저장된다. 받아쓰기 앱도 마이크 음성을 클라우드로 보내 처리한다. 비행기 안이나 폐쇄망에서는 무용지물이고, 민감한 회의·일기를 받아쓰게 하기엔 찜찜하다. 게다가 합성과 인식이 서로 다른 앱·다른 구독으로 쪼개져 있다.
7개 TTS 엔진·Whisper STT·Qwen3 LLM이 한 데스크탑 앱에 들어 있고 모두 오프라인으로 동작한다. 모델은 처음 한 번만 내려받으면 끝. 내 목소리는 내 디스크에만 남는다. 그리고 MCP 서버로 열려 있어, 내가 쓰는 AI 코딩 에이전트가 곧 "목소리를 가진 비서"가 된다.
트렌딩을 끌어올린 진짜 한 방은 "음성 I/O 전체 고리를 하나로 닫았다"는 점이다. 단순한 TTS 모음이 아니라, 입력(받아쓰기) → 다듬기(LLM) → 출력(합성)까지 한 파이프라인으로 연결했고, 그걸 에이전트에게도 개방했다. 만든 사람은 이를 "ElevenLabs + WisprFlow를 합쳐 로컬로 돌리는 것"이라고 표현한다.
기존 = 녹음실을 시간당 빌리는 것 — 매번 예약하고, 요금을 내고, 스튜디오(클라우드) 밖으로는 장비를 못 들고 나온다.
Voicebox = 내 방에 차린 홈 스튜디오 — 마이크도 믹서도 성우(복제 목소리)도 전부 내 책상 위에 있어, 언제든 공짜로, 인터넷 없이, 문 닫고 쓴다.
| 구분 | ElevenLabs(합성) | WisprFlow(받아쓰기) | Voicebox |
|---|---|---|---|
| 처리 위치 | 클라우드 | 클라우드 | 온디바이스(로컬) |
| 기능 범위 | 합성·복제 | 받아쓰기 | 합성+인식+LLM 통합 |
| 에이전트 연동 | API | 없음 | 내장 MCP 서버 |
| 가격 | 구독/종량 | 구독 | 무료(오픈소스) |
| 프라이버시 | 업로드 | 업로드 | 외부 전송 없음 |
| 소스 공개 | 클로즈드 | 클로즈드 | MIT 오픈소스 |
물론 대가도 있다. 모델을 직접 내려받아 GPU/메모리로 돌려야 하므로, 클라우드처럼 "버튼만 누르면 끝"은 아니다. 엔진에 따라 300MB~8GB짜리 모델을 받고, 16GB 이상 RAM을 권장한다. 즉 Voicebox의 매력은 "가장 편한 음성 도구"가 아니라 "내가 통제하는, 공짜이고 확장 가능한 음성 인프라"다.
껍데기는 Rust(Tauri), 두뇌는 Python(FastAPI), 얼굴은 React. 세 언어가 한 앱에서 협업한다.
Voicebox는 Bun 워크스페이스 모노레포(여러 패키지를 한 저장소에)다. 크게 네 덩어리로 나뉜다 — ① 화면(React), ② 네이티브 셸(Rust/Tauri), ③ AI 두뇌(Python/FastAPI), ④ 브라우저 배포(web). 영역별로 "무엇이 무엇을 담당하는지" 지도를 보자.
창을 띄우고, 전역 단축키를 듣고, 마이크/시스템 오디오를 잡고, 클립보드에 결과를 꽂는 "몸"이다. Electron이 브라우저를 통째로 끼우는 것과 달리, Tauri는 OS 내장 웹뷰만 쓰고 본체는 Rust라 가볍고 빠르다.
| 역할 | 크레이트(Rust 라이브러리) |
|---|---|
| 앱 프레임워크 | tauri 2.0 + 플러그인(updater·process·dialog·fs·shell) |
| 오디오 출력/디코딩 | cpal 0.15(재생) · symphonia 0.5(디코드) · hound 3.5(WAV) |
| 전역 단축키 | keytap 0.4 — 제작자가 직접 만든 크레이트. 관찰 전용(observe-only) 키보드 탭으로 좌/우 수정키까지 구분. |
| macOS 캡처 | screencapturekit · coreaudio-sys · objc |
| Windows 캡처 | wasapi 0.22 · windows 0.62(UI 자동화·키입력·클립보드) |
rdev 라이브러리가 방치되고 macOS Sonoma에서 크래시를 내자, 제작자는 아예 새 크레이트 keytap을 만들어 crates.io에 공개했다. "있는 도구가 부실하면 직접 만든다"는, 시스템 프로그래밍의 한 단면.합성·인식·LLM 추론과 약 90개 엔드포인트를 담은 "두뇌"다. Rust 셸이 사이드카로 띄우고, 127.0.0.1:17493에서 HTTP로 대화한다.
| 레이어 | 핵심 라이브러리 |
|---|---|
| 웹 서버 | FastAPI >=0.109 · uvicorn[standard] · Pydantic 2 |
| DB | SQLAlchemy 2 + Alembic(마이그레이션) · SQLite |
| ML 핵심 | torch >=2.2 · transformers(>=4.36,<=4.57.6 핀) · accelerate · huggingface_hub |
| 오디오 처리 | librosa · soundfile · numpy <2.0 · numba <0.61 · pedalboard(Spotify, 8종 이펙트) |
| 에이전트 연동 | fastmcp >=3,<4 + sse-starlette |
| Apple Silicon 가속 | mlx >=0.30 · mlx-audio 0.4.1(--no-deps 설치) · miniaudio |
app/ 한 곳에 진짜 UI가 있고, 데스크탑(Tauri)과 브라우저(web)가 똑같은 React 앱을 공유한다.
| 분야 | 라이브러리 |
|---|---|
| 빌드·언어 | React 18.3 · TypeScript 5.6 · Vite 5.4 · Tailwind CSS 4.1 |
| 상태·데이터 | Zustand 4.5(스토어 8개) · TanStack Query 5 · TanStack Router |
| UI·모션 | Radix UI(접근성 프리미티브) · framer-motion 12 · wavesurfer.js 7(파형) |
| 폼·국제화 | react-hook-form + zod · i18next / react-i18next |
| 린터 | Biome 2.3(ESLint 아님) — 포맷+린트 통합 고속 도구 |
설계의 영리함은 "플랫폼 추상화"다. tauri/src/platform/과 web/src/platform/이 똑같은 이름의 인터페이스 모듈(audio.ts·filesystem.ts·lifecycle.ts)을 각자 구현하고, React의 PlatformProvider가 알맞은 것을 주입한다. 그래서 화면 코드 한 벌이 데스크탑 웹뷰에서도, 일반 브라우저에서도 그대로 돈다.
먼저 전체 그림 한 장 → 그다음 "받아쓰기 한 번"과 "한 문장이 목소리가 되기까지"를 손으로 따라간다.
Voicebox는 네 개의 프로세스로 깔끔하게 나뉜다 — Rust 셸, Python 백엔드, React UI, 그리고 외부 에이전트(MCP). 모든 AI 연산은 가운데 Python 백엔드에 모이고, 그 앞단을 셸·UI·에이전트가 두드린다. 숲을 먼저 보자.
핵심은 백엔드 내부의 4단 계층이다 — 들어온 요청은 routes/(검증만) → services/(흐름 조율) → backends/(실제 추론) → utils/(오디오 후처리) 순으로 흐른다. 라우트 핸들러는 일부러 얇게 두고, 모든 로직은 services/에 모은다. 이제 두 줄기를 따라가자.
# Rust 셸이 OS 레벨에서 통째로 처리하는 받아쓰기 루프
1. 감지 keytap이 단축키 코드(예: 우측 ⌘ 더블탭)를 잡음
2. 녹음 마이크 오디오 캡처 시작 (cpal / 플랫폼별 모듈)
3. 인식 녹음을 백엔드로 → Whisper STT가 글자로 변환
4. 다듬기 로컬 LLM(Qwen3)이 더듬거림·환각 반복 제거(refinement)
5. 삽입 클립보드를 "원자적으로" 저장→내 텍스트 붙여넣기→복원
→ 커서가 있던 어떤 앱에든 글자가 끼어든다
여기서 배울 점이 셋이다. (가) 클립보드를 원자적으로 보존한다 — 붙여넣기 전 기존 클립보드 내용을 저장했다가, 합성 키 입력으로 붙여넣은 뒤 곧바로 복원해 사용자의 복사 내용을 망치지 않는다. (나) 환각 반복 제거 — Whisper가 무음에서 "thanks for watching"을 반복하는 고질병을, refinement.py의 collapse_repetitive_artifacts()가 단어·문자 단위로 걸러낸다. (다) 받아쓰기 전 과정이 OS 통합 — 캡처·붙여넣기·포커스 복원이 전부 Rust 네이티브로 처리된다.
# services/generation.py → run_generation() 한 함수가 모든 모드 처리
1. (선택)성격 personality.py가 LLM으로 텍스트에 페르소나 입힘
2. 청크 분할 chunked_tts.py가 문장 경계로 안전 분할
(약어 Dr./e.g., 소수점, [tag], CJK 。!? 보호)
3. 음성 합성 선택한 TTS 엔진이 각 청크를 독립 생성
(복제: 참조오디오+대본을 zero-shot으로 주입)
4. 이어붙이기 equal-power 크로스페이드로 청크 경계 클릭음 제거
5. 이펙트 pedalboard로 8종 후처리 → .wav 파일 → 스피커
가장 인상적인 설계는 "엔진을 갈아 끼워도 윗단은 그대로"라는 점이다. 7개나 되는 TTS 엔진(Qwen3-TTS·Chatterbox·Kokoro…)이 전부 같은 약속(Protocol)을 따르기 때문에, 합성을 부르는 코드는 어떤 엔진인지 알 필요가 없다. 무제한 길이 생성을 위한 chunked_tts.py의 문장 분할기는 그 자체로 잘 만든 NLP 예제다 — 약어·소수점·대괄호 태그·CJK 문장부호를 모두 존중하며 자른다.
Protocol(프로토콜) = 콘센트 규격 — 벽의 220V 콘센트는 선풍기든 노트북 충전기든 "플러그 모양"만 맞으면 받아준다.
TTS 엔진 = 가전제품 — Kokoro(작고 빠름)든 TADA(크고 길게)든, 같은 플러그(TTSBackend 프로토콜)를 꽂으면 합성 코드는 똑같이 전원을 넣는다. 새 엔진 추가 = 새 가전을 같은 규격으로 만들기.
(가) 프로토콜 기반 엔진 추상화 — backends/__init__.py가 TTSBackend·STTBackend·LLMBackend를 typing.Protocol로 정의하고, 엔진별 파일이 이를 구현한다. 등록은 ModelConfig 데이터클래스로 선언적으로 — 새 엔진 추가 = "프로토콜 구현 + 설정 등록"이 전부. (나) 플랫폼 조건부 백엔드 — platform_detect.py가 Apple Silicon이면 mlx, 아니면 pytorch를 고른다. CUDA·ROCm·MLX·CPU의 차이가 추론 계층 위로는 보이지 않는다. (다) 직렬 GPU 큐 — task_queue.py가 한 번에 하나의 추론만 돌려 GPU 경합을 막고, 진행률은 SSE로 흘리며, 크래시로 멈춘 작업은 재시작 때 자동 복구한다.
Rust 쪽 Cargo.toml의 description은 옛 시절의 흔적이라 한 엔진만 언급한다. 실제 Voicebox는 그 사이 7개 엔진·받아쓰기·LLM·MCP를 갖춘 종합 스튜디오로 자랐다. 저장소를 파악할 땐 매니페스트의 한 줄 설명보다 backends/ 폴더와 README를 믿어야 한다.
폴더 이름이 곧 책임이다. "AI 두뇌(backend)"와 "네이티브 셸(tauri)"이 양대 축.
모노레포의 최상위는 역할별로 나뉜다. 처음 본다면 backend/(Python 두뇌)와 tauri/(Rust 셸) 두 폴더만 잡아도 절반은 이해한 것이다. 화면은 app/에 한 벌만 있다.
| 위치 | 한 줄 역할 |
|---|---|
| app/ | 화면 한 벌. 데스크탑·브라우저가 공유. 기능별 컴포넌트 폴더 25+개, Zustand 스토어 8개. |
| tauri/src-tauri/ | Rust 네이티브 셸. 단축키·오디오 캡처·클립보드·포커스를 OS 레벨에서 처리. |
| backend/backends/ | 추론 엔진 모음. 7개 TTS + Whisper STT + Qwen3 LLM, 전부 같은 프로토콜. |
| backend/services/ | 로직 본진. generation(합성 조율)·task_queue(직렬 GPU)·refinement(STT 다듬기) 등 17개. |
| backend/utils/chunked_tts.py | 무제한 길이 합성용 문장 분할 + 크로스페이드. NLP·DSP 교보재. |
| backend/mcp_server/ | 에이전트 연동. FastMCP 서버 + 4개 도구(speak·transcribe·list_captures·list_profiles). |
| .agents/skills/add-tts-engine/ | AI 에이전트가 새 TTS 모델을 스스로 통합하도록 설계된 스킬 문서. |
이 레포 하나로 "Tauri 네이티브 + Python ML 백엔드 + 음성 AI + MCP + 프론트 공유"를 한꺼번에.
Voicebox는 단일 기술 예제가 아니라 현대 로컬 AI 데스크탑 앱의 부품이 다 모인 교과서다. 분야별로 무엇을 건질지 짚는다.
Rust 셸이 Python FastAPI 서버를 자식 프로세스(사이드카)로 실행하고 HTTP로 대화하는 전 과정을 본다. 셸이 죽으면 부모-PID 감시로 백엔드도 자동 종료되고, PyInstaller로 Python+ML 스택을 통째로 얼려 배포한다. "데스크탑 앱에 ML을 싣는" 실전 패턴.
실습: server.py의 워치독과 tauri/src-tauri/의 사이드카 실행 코드를 비교해, 프로세스 수명주기가 어떻게 묶이는지 추적.
backends/__init__.py가 typing.Protocol로 "엔진이 지켜야 할 약속"을 정의하고, 7개 엔진이 각자 구현한다. 등록은 ModelConfig 데이터클래스로 선언적. 새 엔진 추가가 곧 데이터 한 줄 + 구현 한 파일이 되는, 확장 가능한 설계의 정석.
실습: 가장 작은 엔진 Kokoro 구현을 읽고, 프로토콜의 어떤 메서드를 채웠는지 표로 정리. 그다음 가짜 "에코 엔진"을 상상해 어떤 메서드가 필요할지 적어보기.
zero-shot 복제(mlx_backend.py: 참조오디오+대본을 inspect.signature로 확인 후 주입), 무제한 길이 청킹(chunked_tts.py), STT 환각 제거(refinement.py)를 한 흐름으로 본다. 음성 모델을 "쓰는 쪽"의 엔지니어링을 배우는 드문 자료.
실습: chunked_tts.py의 split_text_into_chunks()에 "Dr. Kim은 3.14를 [laugh] 말했다。" 같은 함정 문장을 넣었을 때 어디서 잘리는지 손으로 시뮬레이션.
fastmcp로 4개 도구(voicebox.speak·.transcribe 등)를 정의하고 /mcp에 마운트한다. 프로필 결정 우선순위(명시 인자 → 클라이언트별 바인딩 → 전역 기본)와 ASGI 라이프스팬 합성(MCP 세션 매니저를 FastAPI 생명주기에 끼워 넣기)이 백미.
실습: .mcp.json으로 Claude Code에 연결한 뒤, voicebox.speak(text, profile, personality=true)가 텍스트→성격LLM→TTS로 어떻게 흐르는지 관찰.
personality.py는 예시를 시스템 프롬프트에 인라인으로 넣지 않고 구조화된 대화 턴으로 전달한다 — "작은 모델은 인라인 예시를 글자 그대로 베끼지만, 구조화된 턴은 데이터로 취급"하기 때문. 모드별 온도(작문 0.9, 재작성 0.3)도 다르게 준다. 로컬 소형 LLM의 실전 프롬프트 공학.
실습: refinement.py의 collapse_repetitive_artifacts()가 반복 환각은 지우면서 "정말 정말 좋아" 같은 수사적 반복은 어떻게 살려두는지(임계값) 분석.
"모델을 내 GPU로 돌린다"가 핵심. RAM 16GB+ 권장, 모델은 300MB~8GB.
Voicebox는 클라우드가 아니라 내 기기의 GPU/CPU로 모델을 돌린다. 그래서 "어떤 가속기를 쓰느냐"가 속도를 좌우한다. 다행히 백엔드가 환경을 감지해 알맞은 경로를 고른다.
| 항목 | 요구/지원 |
|---|---|
| GPU 가속 | CUDA(NVIDIA) · MLX/Metal(Apple Silicon, "Neural Engine로 4~5배") · ROCm(AMD) · IPEX/XPU(Intel Arc) · DirectML(모든 Windows GPU) · CPU 폴백(5~50배 느림) |
| CUDA 처리 | 번들 안 함, 필요 시 다운로드(routes/cuda.py). 수 GB짜리 설치본을 피하려는 결정. |
| RAM | 엔진 1개에 최소 8GB, 여러 엔진 동시 로드엔 16GB+ 권장. Docker 기본 상한은 4 CPU / 8GB. |
| 복제용 녹음 | 참조 오디오 10~30초 권장. |
| 플랫폼 | macOS 11+(DMG, Apple Silicon+Intel) · Windows(MSI) · Docker. Linux는 소스 빌드만(프리빌트 없음). |
| 개발 도구 | Bun · Rust · Python 3.11+ · Tauri 사전요건(macOS는 Xcode). 빌드는 just(just setup·just dev·just build). |
| 엔진 | 크기 | 언어 | 특징 |
|---|---|---|---|
| Kokoro 82M | ~350MB | 8 | 가장 작음. 프리셋 목소리 50개. 입문용. |
| LuxTTS | ~300MB | en | 48kHz, CPU에서도 150배속. |
| Qwen3-TTS 0.6B/1.7B | 1.2 / 3.5GB | 10 | zero-shot 복제 기본 엔진. |
| Chatterbox Turbo | 1.5GB | en | [laugh] 같은 파라링귀스틱 태그. |
| Chatterbox 다국어 | 3.2GB | 23 | 최다 언어 지원. |
| TADA 1B/3B (HumeAI) | 4 / 8GB | 10 | 700초+ 일관 오디오. 가장 큼. |
| + Whisper STT | 가변 | 다국어 | base~large-v3-turbo 중 선택. |
| + Qwen3 LLM | 0.6B~4B | — | 다듬기·성격 공용. 한 인스턴스만 로드. |
학습 목적이라면 가장 가벼운 출발점은 Kokoro(350MB) 한 엔진이다. 8GB RAM이면 충분히 돌아가고, 합성 파이프라인 전체를 체험할 수 있다. 복제(Qwen3-TTS)나 다국어(Chatterbox)는 디스크·메모리 여유가 생기면 추가하면 된다. VOICEBOX_MODELS_DIR 환경변수로 모델 저장 위치를 바꿀 수 있고(곧 HF_HUB_CACHE로 연결), 쓰지 않는 모델은 개별 언로드해 GPU 메모리를 비운다.
"앱 설치·복제"는 10분, "MCP 연결·코드 읽기"는 한나절, "새 TTS 엔진 추가"는 주말 프로젝트. 난이도 순.
앱을 설치하고 Qwen3-TTS(또는 Chatterbox)를 받은 뒤, 10~30초 분량으로 내 목소리를 녹음해 음성 프로필을 만든다. 그 프로필로 아무 문장이나 합성해, "내 목소리"가 새 문장을 읽는 걸 들어본다.
받아쓰기 단축키(코드)를 설정하고, 메모장·브라우저·코드 에디터에 커서를 둔 채 말해본다. Whisper가 받아 적고 LLM이 다듬은 글이 커서 위치에 끼어드는지 확인한다.
저장소의 .mcp.json을 이용하거나 voicebox-mcp stdio 바이너리를 등록해, Claude Code가 voicebox.speak·voicebox.transcribe 도구를 보게 한다. "이 요약을 내 목소리로 읽어줘"를 시켜본다.
mcp_server/resolve.py를 열어 프로필 결정 우선순위(인자→바인딩→기본)를 코드로 확인.just setup → just dev로 개발 모드를 띄우고, services/generation.py의 run_generation()에 로그를 심어 청크 분할·크로스페이드·이펙트 단계를 추적한다.
.agents/skills/add-tts-engine/SKILL.md 가이드를 따라, 가짜 또는 실제 신규 모델을 TTSBackend 프로토콜로 감싸 ModelConfig에 등록한다. UI·MCP 어디도 고치지 않고 새 엔진이 선택지에 뜨는지 확인한다.
4주 코스 — "음성 AI 기초" → "데스크탑 통합" → "에이전트 개방" → "직접 확장".
Voicebox를 제대로 소화하려면 음성 ML과 데스크탑 시스템 프로그래밍을 함께 봐야 한다. 한 번에 다 하려 하지 말고, 주차별로 한 축씩 잡는 걸 권한다.
| 주차 | 주제 | 구체적 학습 / 산출물 |
|---|---|---|
| 1주차 | 음성 AI 기초 | TTS·STT·음성 복제 개념 잡기. Whisper로 받아쓰기, Kokoro/Qwen3-TTS로 합성 직접 돌려보기. HuggingFace 모델 캐시·다운로드 흐름 이해. |
| 2주차 | Python ML 백엔드 | FastAPI + SQLAlchemy 2 + SSE로 "작업 제출→진행률 스트리밍" 미니 서버 만들기. task_queue.py의 직렬 큐 패턴 모사. |
| 3주차 | Tauri 데스크탑 통합 | Tauri 2로 빈 앱 만들고, Python 사이드카 붙이기. 전역 단축키·클립보드·오디오 캡처 중 하나를 Rust로 구현. |
| 4주차 | MCP로 에이전트 개방 | FastMCP로 내 도구 2~3개를 정의해 Claude Code에 연결. 프로토콜 기반 플러그인 구조로 "엔진 갈아끼우기" 설계 연습. |
Voicebox의 가치는 새 모델을 훈련하는 데 있지 않다. 이미 있는 오픈 모델(Whisper·Qwen·Chatterbox…)을 로컬에서 안정적으로 돌리고, 청킹·후처리·큐·프로토콜로 제품화하는 데 있다. 그래서 GPU가 약해도 배울 게 많다 — 아키텍처·시스템 통합·프롬프트 공학이 핵심이다.
레포를 읽다 마주칠 용어를 한곳에.
| 용어 | 뜻 |
|---|---|
| TTS / STT | Text-to-Speech(글→소리, 음성 합성) / Speech-to-Text(소리→글, 음성 인식). Voicebox는 둘 다 로컬로. |
| 음성 복제(zero-shot) | 10~30초 참조 녹음 하나로, 추가 학습 없이 그 음색을 흉내 내는 합성. |
| Tauri | Rust 기반 데스크탑 앱 프레임워크. OS 내장 웹뷰만 써서 Electron보다 가볍다. |
| 사이드카(sidecar) | 메인 앱이 보조 프로세스를 같이 띄워 무거운 일을 맡기는 구조. 여기선 Rust 셸이 Python 서버를 실행. |
| FastAPI / Pydantic | Python 비동기 웹 프레임워크 / 데이터 검증 라이브러리. 백엔드 ~90개 엔드포인트의 토대. |
| MCP | Model Context Protocol. 에이전트가 외부 도구에 접근하는 표준 규약. Voicebox는 /mcp로 4개 도구 노출. |
| FastMCP | Python으로 MCP 서버를 쉽게 만드는 라이브러리. FastAPI에 마운트된다. |
| typing.Protocol | "이 메서드들을 가지면 이 타입으로 인정"하는 파이썬의 구조적 타이핑. 엔진 추상화의 핵심. |
| MLX | Apple Silicon용 머신러닝 프레임워크. Neural Engine 활용으로 맥에서 4~5배 빠른 추론. |
| Whisper | OpenAI의 다국어 음성 인식 모델. Voicebox가 받아쓰기에 로컬로 사용. |
| pedalboard | Spotify의 오디오 이펙트 라이브러리. 합성 결과에 8종 후처리 적용. |
| 크로스페이드(equal-power) | 청크들을 이어 붙일 때 경계의 "딱" 소리를 없애려 음량을 부드럽게 겹쳐 전환. |
| PyInstaller(동결) | Python 코드+의존성을 하나의 실행 바이너리로 "얼려" 배포. 무거운 ML 스택을 데스크탑에 싣는 방법. |
| Zustand | React용 경량 상태관리. Voicebox는 기능별 스토어 8개로 분리. |
| SSE | Server-Sent Events. 서버가 진행률 등을 한 방향으로 흘려보내는 스트리밍. 생성 상태 표시에 사용. |
원본을 직접 확인하며 깊이 파보자.