같은 OpenBMB의 전작 VoxCPM1.5는 2025년 12월 GitHub 트렌딩 1위, 0.5B 버전은 2025년 9월 HuggingFace 트렌딩 1위였다. 이번 VoxCPM2는 2026년 4월 공개돼 다시 트렌딩 1위로 돌아왔다.
지금까지의 신경 TTS는 "도트 그림"이다. 음성을 수천 개의 정수 코드(코드북 인덱스)로 양자화한 뒤, LLM처럼 다음 코드를 예측한다. 도트가 거칠수록 그림이 거칠어지듯, 코드북이 거칠면 "ㅈㅈ거리는" 합성음이 된다.
VoxCPM은 "도트 대신 수채화"다. 음성을 양자화하지 않고 연속적인 색면(잠재 벡터)으로 다루며, 확산(diffusion)이라는 "여러 번 덧칠하는 붓질"로 텍스트가 시키는 음성을 그려낸다. 그래서 디테일이 안 깎인다.
F5-TTS·CosyVoice·MaskGCT 같은 대부분의 오픈소스 TTS는 이산(discrete) 오디오 토큰을 거친다. 음성을 EnCodec·DAC 같은 코덱으로 정수 코드 시퀀스로 만들고, LM이 그 다음 코드를 예측하는 방식이다. 양자화 단계에서 디테일이 깎이고, 이게 합성음 특유의 "기계적인" 느낌의 원인 중 하나다.
VoxCPM은 이 양자화 단계를 통째로 들어낸다. AudioVAE V2가 음성을 연속 잠재 벡터로 압축하고, 모델은 그 연속 공간 안에서 확산(diffusion)으로 다음 음성 표현을 직접 그려낸다.
코드북 크기가 무한하지 않으므로, 같은 음성이라도 가장 가까운 코드로 둥글어진다. 미세한 호흡·떨림·음색 변화가 코드 사이에 끼면 사라진다. 합성된 음성이 매끄럽긴 해도 "사람 같지 않은" 잔향이 남는 이유다.
잠재 벡터를 양자화하지 않고 연속값 그대로 다루며, 매 스텝마다 작은 확산 모델(LocDiT)이 다음 잠재를 매끄럽게 그려낸다. 코드북 둥글림이 없어 호흡·강세·감정 같은 미세한 결이 보존된다.
보통 음성 합성 도구는 "TTS만" 또는 "클로닝만" 한다. VoxCPM2는 같은 가중치 하나로 네 가지 작업을 처리한다.
중립적인 기본 화자가 자연스럽게 읽어준다. 한국어를 넣으면 한국어로, 일본어를 넣으면 일본어로 — 별도 언어 태그가 필요 없다.
텍스트 앞 괄호 안에 (A young woman, gentle and sweet voice) 같은 묘사를 넣으면, 그 묘사대로 새 목소리가 만들어진다. 화자 임베딩을 따로 학습할 필요가 없다.
참조 오디오 한 조각을 주면 음색을 복제하고, 동시에 (slightly faster, cheerful tone) 같은 스타일 명령으로 감정·속도를 따로 조절한다. 음색은 유지하면서 표현만 바꿀 수 있다.
참조 오디오에 해당 오디오의 transcript까지 함께 prompt로 넣으면, 모델이 "이 참조의 다음을 이어 읽는다"는 자세로 합성한다. 음색·리듬·감정·억양까지 가장 충실히 재현된다.
아랍어·버마어·중국어·덴마크어·네덜란드어·영어·핀란드어·프랑스어·독일어·그리스어·히브리어·힌디어·인도네시아어·이탈리아어·일본어·크메르어·한국어·라오스어·말레이어·노르웨이어·폴란드어·포르투갈어·러시아어·스페인어·스와힐리어·스웨덴어·타갈로그어·태국어·터키어·베트남어, 거기에 중국어 방언 9종(광동어·쓰촨화·우어·등). 언어 태그도 안 줘도 됨 — 텍스트 보고 알아서 한다.
대부분의 오픈소스 TTS는 16/22/24kHz로 출력한다. VoxCPM2는 48kHz로 직접 출력한다. 핵심은 AudioVAE V2의 비대칭(asymmetric) 인코더-디코더다.
RTF(Real-Time Factor)는 "1초 음성을 만드는 데 걸리는 시간"이다. 0.3이면 1초 음성을 0.3초에 만든다는 뜻이라 충분한 실시간. VoxCPM2는 RTX 4090에서 표준 PyTorch RTF ~0.30, Nano-vLLM 가속 시 RTF ~0.13까지 떨어진다. 동시 요청 배치도 된다.
VoxCPM은 순수 Python 100% 프로젝트다(README 기준). 다만 단순 한 덩어리가 아니라 "모델 백본 + 학습·추론 파이프라인 + 서빙 + CLI/SDK" 네 레이어로 나뉜다.
| 레이어 | 도구 | 역할 |
|---|---|---|
| 딥러닝 프레임워크 | PyTorch ≥ 2.5, CUDA ≥ 12.0 | 모델 정의·학습·추론 |
| 오디오 I/O | soundfile · librosa · torchaudio · torchcodec | WAV/FLAC/MP3 디코딩·인코딩 |
| 모델 로딩 | transformers · huggingface-hub · modelscope | HuggingFace/ModelScope에서 가중치 다운로드 |
| 웹 데모 | Gradio ≥ 6 | app.py·lora_ft_webui.py의 WebUI |
| 텍스트 정규화 | wetext · inflect | 숫자·약어 → 발음 가능한 문자열 |
| ASR 평가 | FunASR | 합성 결과의 WER/CER 자동 측정 |
| 파인튜닝 | LoRA · 풀 SFT | 5~10분 오디오로 화자 적응 |
| 패키지 매니저 | uv (uv.lock) | Rust 기반 초고속 의존성 해결 |
a710128/nanovllm-voxcpmNano-vLLM 기반 전용 추론 엔진. RTX 4090에서 RTF 0.13까지. async API + 동시 요청 배치 + FastAPI HTTP 서버가 묶여 있다.
vllm-project/vllm-omnivLLM의 공식 옴니모달 확장. PagedAttention으로 KV 캐시를 페이지로 관리하고, /v1/audio/speech라는 OpenAI 호환 엔드포인트를 그대로 띄울 수 있다. 라이브러리 코드 한 줄도 안 바꾸고 OpenAI 클라이언트로 호출 가능.
GGML/GGUF 포팅(bluryar/VoxCPM.cpp), ONNX 익스포트(bluryar/VoxCPM-ONNX), Apple Neural Engine 백엔드(0seba/VoxCPMANE)까지 커뮤니티가 따로 만들었다. M2 맥북·라즈베리파이에서도 굴릴 수 있다.
ComfyUI(노드 기반 AI 워크플로우 도구) 노드가 세 개나 나와 있다. 다중 화자 생성, LoRA 핫스왑, 자동 ASR 검증 같은 후처리를 노드 그래프로 묶을 수 있다.
# 설치
pip install voxcpm
# CLI: 음성 디자인
voxcpm design --text "VoxCPM2 brings studio-quality multilingual speech synthesis." \
--control "Young female voice, warm and gentle" \
--output out.wav
# CLI: 음색 클로닝
voxcpm clone --text "This is a voice cloning demo." \
--reference-audio path/to/voice.wav \
--output out.wav
# Python API
from voxcpm import VoxCPM
import soundfile as sf
model = VoxCPM.from_pretrained("openbmb/VoxCPM2", load_denoiser=False)
wav = model.generate(
text="VoxCPM2는 다국어 음성 합성에 적합합니다.",
cfg_value=2.0,
inference_timesteps=10,
)
sf.write("demo.wav", wav, model.tts_model.sample_rate)
VoxCPM2는 텍스트와 음성을 직접 매핑하지 않는다. 네 개의 모듈이 단계별로 정보를 다듬어 넘긴다. 이 분업이 "느린 자기회귀 + 빠른 확산"이라는 두 메커니즘을 한 모델 안에 공존하게 만드는 핵심이다.
대부분의 신경 TTS는 음성을 코드북 인덱스 시퀀스로 만든다. VoxCPM은 그 단계를 빼고 연속 잠재 분포 자체를 다룬다. 이렇게 하면 코드북 양자화 손실이 없는 대신, 일반 회귀 모델 하나로 정답을 짚을 수 없다 — 그래서 Flow Matching 기반 확산이 끼어든다.
음성 디자인 기능은 추가 네트워크가 아니다. 입력 텍스트 맨 앞 괄호 안 묘사를 LocEnc가 잡아내고, RALM이 이걸 잠재 조건으로 변환한다. "한 모델 안에서 텍스트 묘사 → 화자 임베딩 → 합성"이 매끄럽게 이어진다.
# 한 텍스트 필드 안에 묘사와 본문이 같이 들어간다
text = "(A young woman, gentle and sweet voice)Hello, welcome to VoxCPM2!"
# 클로닝 + 스타일 제어도 같은 방식
text = "(slightly faster, cheerful tone)This is a controlled clone."
VoxCPM1.5까지는 참조 오디오와 텍스트를 이어 붙여 "이 다음을 계속 읽어줘" 식의 클로닝만 됐다. VoxCPM2는 두 갈래로 갈린다.
참조 오디오를 음색 조건으로만 쓰고, 텍스트는 새로 시작한다. 그 위에 스타일 명령((빠르게, 명랑한 톤))을 얹을 수 있어 표현 제어가 자유롭다.
모델이 "참조의 바로 다음 한 문장이 이거다"라는 자세로 합성한다. 음색뿐 아니라 리듬·감정·억양·호흡까지 가장 충실히 따라온다. VoxCPM1.5와 동일한 방식.
TSLM은 초당 6.25개의 잠재 토큰만 예측한다. 보통 신경 코덱 TTS가 50~75Hz 토큰을 쓰는 것과 비교하면 10배 압축이다. 같은 길이 음성을 짧은 시퀀스로 다룰 수 있어 RTF가 떨어진다. 대신 거친 잠재를 LocDiT가 매끄럽게 다듬어야 하므로, TSLM(저속·자기회귀)과 LocDiT(고속·확산)가 역할을 나눈 셈이다.
패키지를 src/voxcpm처럼 한 단계 더 들어간 디렉토리에 둔다. 현재 디렉토리에서 실수로 import 되는 사고를 막아주는 정석. 학습·추론을 한 패키지로 묶어 배포하는 라이브러리 프로젝트가 자주 쓴다.
scripts/train_voxcpm_finetune.py --config_path conf/voxcpm_v2/voxcpm_finetune_lora.yaml 한 줄로 LoRA·풀파인튜닝을 같은 진입점에서 처리한다. Hydra·Lightning CLI 같은 자동 매핑 도구 없이도 간결.
uv.lock이 루트에 있다는 건 pip+venv 대신 uv(Rust로 만든 초고속 패키지 매니저)로 의존성을 잠가둔다는 뜻. 최근 Python ML 프로젝트가 uv로 옮겨가는 흐름의 대표 사례다.
이미지에서 시작한 확산이 음성·잠재 공간으로 일반화되는 진화 과정을 정리해보자. 마지막 단계인 Flow Matching이 VoxCPM의 LocDiT 핵심이다.
실습 아이디어: MNIST에 Flow Matching을 10 step으로 구현해 깨끗한 숫자 생성. 같은 코드 구조가 LocDiT 안에서 동작한다.
RVQ(Residual Vector Quantization, 잔차 벡터 양자화)가 있는 코덱과 VoxCPM처럼 연속 잠재만 쓰는 VAE 코덱이 어떻게 다른지가 핵심.
실습 아이디어: Descript의 descript-audio-codec으로 본인 목소리를 1.5kbps에 인코딩·디코딩 → 어디가 깎이는지 직접 들어보기.
전체 가중치를 건드리는 SFT 대신 작은 저랭크 어댑터만 학습. 학습이 끝나면 어댑터 파일 하나만 갈아 끼워 화자를 바꾼다.
실습 아이디어: lora_ft_webui.py를 띄우고 본인 목소리 5분 녹음으로 LoRA 학습 → 같은 텍스트를 본인 음성으로 읽게 만들기.
vLLM의 PagedAttention과 연속 배칭(continuous batching)이 TTS에도 어떻게 들어가는지. OpenAI 호환 엔드포인트가 표준화되는 흐름도 같이 본다.
실습 아이디어: vllm serve openbmb/VoxCPM2 --omni로 띄우고 OpenAI SDK로 /v1/audio/speech 호출. 라이브러리 코드 한 줄도 안 바꾸고 백엔드 교체 체험.
긴 텍스트를 통째로 합성하면 첫 음성이 나오기까지 수 초가 걸린다. generate_streaming 같은 청크 단위 합성 + 큐 기반 재생 설계.
실습 아이디어: FastAPI + WebSocket으로 텍스트를 받아 청크 PCM을 흘리고, 브라우저 AudioWorklet으로 실시간 재생하는 데모 만들기.
| 항목 | VoxCPM2 (2B) | VoxCPM1.5 (0.6B) | VoxCPM-0.5B |
|---|---|---|---|
| VRAM | ~8 GB | ~6 GB | ~5 GB |
| RTF (RTX 4090) | ~0.30 | ~0.15 | ~0.17 |
| RTF (Nano-vLLM) | ~0.13 | ~0.08 | ~0.10 |
| 출력 샘플레이트 | 48 kHz | 44.1 kHz | 16 kHz |
| 언어 수 | 30 | 2 (zh/en) | 2 (zh/en) |
| 소프트웨어 | 요구 버전 |
|---|---|
| Python | ≥ 3.10 (< 3.13) |
| PyTorch | ≥ 2.5.0 |
| CUDA | ≥ 12.0 |
RTX 3090 / 4070 Ti SUPER 이상 (12GB+). 16GB면 마진 충분.
RTX 4090 24GB + Nano-vLLM 가속. 동시 요청 적당히, 응답 빠름.
A100 / H100 + vLLM-Omni. PagedAttention KV 캐시 공유 + 동시 연결 수십 건 처리.
VoxCPM.cpp(GGML/GGUF 포팅) 또는 VoxCPMANE(Apple Neural Engine 백엔드)로 갈아탄다. 양자화된 GGUF를 쓰면 M2 맥북에서도 의미 있는 속도로 합성 가능하다 — GPU가 없어도 시도해볼 수 있다.
VoxCPM2를 그대로 깔고 한국어 문장 20개를 합성한다. cfg_value를 1.5 / 2.0 / 2.5로 바꿔가며 음질을 청취 비교.
배우는 것: CFG(Classifier-Free Guidance, 무조건부 가이던스) 값이 클수록 텍스트 충실도는 올라가지만 자연스러움이 떨어지는 트레이드오프를 귀로 직접 체감.
"(중후한 50대 남성, 라디오 DJ 톤)" / "(밝고 빠른 20대 여성, ASMR 속삭임)" / "(피곤한 새벽 3시 목소리)" 같은 자연어 묘사 30개를 만들어 같은 한국어 문장을 30번 합성.
배우는 것: 어떤 묘사 어휘(나이·성별·감정·환경)가 잘 통하고 어떤 게 무시되는지 패턴 정리. 그대로 한국어 Voice Design 프롬프트 가이드가 된다.
본인 음성 5~10분 + transcript 준비. conf/voxcpm_v2/voxcpm_finetune_lora.yaml을 조금 손봐서 LoRA를 학습하고, 베이스 모델 vs LoRA 모델로 같은 텍스트를 합성해 비교.
배우는 것: 데이터 정제(노이즈 제거·세그먼테이션)부터 LoRA 학습률·rank 설정, 어댑터 핫스왑까지 한 사이클을 직접 돈다.
generate_streaming을 사용해 텍스트를 받아 WebSocket으로 PCM 청크를 흘리는 작은 서버 구현. 브라우저에서 텍스트 → 실시간 음성 재생까지.
배우는 것: 첫 음성까지 지연(TTFB) 측정·튜닝, 청크 크기와 버퍼링 트레이드오프, 끊김 없이 재생하기 위한 큐 관리.
vllm serve openbmb/VoxCPM2 --omni로 OpenAI 호환 엔드포인트를 띄우고, 인증·API 키 발급·과금·요청 로그를 묶는다. 동시 사용자 10명 시뮬레이션 → RTF·지연·VRAM 측정.
배우는 것: PagedAttention 기반 연속 배칭이 TTS에서 어떻게 동작하는지 직접 관찰. 프로덕션 TTS 인프라의 핵심 모듈을 손에 익힌다.
Tacotron 2 → FastSpeech 2 → VITS → 신경 코덱 TTS(VALL-E·CosyVoice) → Flow Matching TTS(F5-TTS·VoxCPM)의 진화. 각 단계에서 "왜 다음 단계가 필요했나"를 묻는다.
Sohl-Dickstein 2015 → Ho et al. 2020(DDPM) → Song et al. 2021(DDIM) → Lipman et al. 2023(Flow Matching). 마지막으로 DiTAR(arXiv:2502.03930)를 정독하고 MNIST에 Flow Matching을 구현.
EnCodec, DAC, AudioVAE V2의 흐름. RVQ와 연속 VAE의 차이, 비대칭 인코더-디코더가 슈퍼 리졸루션을 만들어 내는 메커니즘. descript-audio-codec으로 본인 음성을 1.5kbps에 압축·복원해 보기.
vLLM 공식 블로그 + Kwon et al. 2023으로 PagedAttention을 이해. vLLM-Omni 예제로 VoxCPM2를 띄우고, locust·wrk로 부하 테스트 → 동시 요청 수에 따른 RTF·VRAM 변화 정리.
| 용어 | 뜻 |
|---|---|
| TTS | Text-to-Speech. 텍스트 → 사람 목소리 |
| Tokenizer-Free | 음성·텍스트를 정수 코드로 자르지 않고 연속 표현으로 다루는 접근 |
| Diffusion AR | 다음 토큰을 회귀로 한 번에 예측이 아니라, 작은 확산 스텝으로 다음 잠재를 그려내는 방식 |
| Latent (잠재 표현) | 신경망이 음성을 압축한 "본질" 벡터. AudioVAE V2 잠재 공간에서 모든 일이 일어남 |
| VAE | Variational Autoencoder. 데이터를 잠재 분포로 인코딩하고 복원하는 신경망 |
| Flow Matching | 노이즈→데이터 경로를 직접 학습하는 확산 변종. ~10 step으로 충분 |
| CFG | Classifier-Free Guidance. 조건부·무조건부 예측 가중합으로 텍스트 충실도 조절 |
| RTF | Real-Time Factor. 1초 음성 만드는 데 걸리는 시간 비율. 1.0 미만이면 실시간 가능 |
| WER / CER | 합성 음성을 ASR로 받아쓰게 한 뒤 원문과 비교한 오류율. 명료도 지표 |
| SIM | Speaker Similarity. 합성 화자가 참조 화자와 얼마나 비슷한지를 임베딩 코사인 유사도로 |
| LoRA | Low-Rank Adaptation. 큰 모델에 작은 어댑터만 끼워 효율적으로 파인튜닝 |
| SFT | Supervised Fine-Tuning. 모델 전체를 지도학습으로 적응시키는 일반 파인튜닝 |
| PagedAttention | vLLM 핵심. KV 캐시를 OS 가상 메모리처럼 페이지 단위로 관리해 GPU 메모리 절약 |
| Continuous Batching | 요청이 끝나기 전이라도 새 요청을 같은 배치에 끼워 처리. GPU 활용도 ↑ |
| DAC | Descript Audio Codec. SOTA 신경 오디오 코덱. AudioVAE V2의 토대 |
| MiniCPM-4 | OpenBMB의 소형 LLM. VoxCPM2의 텍스트-음성 백본(TSLM) |
| ComfyUI | 노드 그래프 기반 AI 워크플로우 도구. 원래 Stable Diffusion용 → LLM·TTS로 확장 |
| Apache-2.0 | 관대한 오픈소스 라이선스. 상업 사용·재배포·사유 결합 모두 허용 |