vibevoice.cpp: Microsoft VibeVoice(TTS + long-form ASR)의 ggml/C++ 포팅 버전, CPU/CUDA/Metal/Vulkan 지원 및 추론 시 Python 불필요
vibevoice.cpp: Microsoft VibeVoice (TTS + long-form ASR with diarization) ported to ggml/C++, runs on CPU/CUDA/Metal/Vulkan, no Python at inference
핵심 요약
Microsoft VibeVoice를 C++로 포팅하여 Python 의존성 없이 로컬 환경에서 효율적인 TTS와 ASR 실행이 가능해짐.
- C++ 포팅 — Python 없이 ggml 기반으로 구현되어 CPU, CUDA, Metal, Vulkan 등 다양한 환경에서 실행 가능함.
- 성능 최적화 — 0.5B 모델로 실시간 TTS를 지원하며, 7B 모델을 통한 긴 오디오의 ASR 및 화자 분리 기능을 제공함.
- 배포 편의성 — 단일 바이너리 또는 C ABI 라이브러리 형태로 제공되어 LocalAI 등 다양한 프로젝트에 쉽게 통합 가능함.
- 현재 한계 — 긴 오디오 처리 시 높은 메모리 사용량과 스트리밍 출력 미지원 등 개선이 필요한 부분이 존재함.
몇 주 전, 저는 Microsoft VibeVoice(음성 복제 기능을 갖춘 음성 대 음성 모델, https://github.com/microsoft/VibeVoice)를 순수 C++ ggml로 포팅한 vibevoice.cpp(https://github.com/mudler/vibevoice.cpp)를 공개했습니다. 이 엔진이 단순한 '초기 포팅' 단계를 넘어 다른 분들도 실제로 사용해 볼 만한 수준이 되었기에 이곳에 후속 소식을 전합니다.
이 작업은 LocalAI(https://github.com/mudler/LocalAI) 팀의 사랑을 담아 진행되었습니다!
주요 기능:
- TTS(사전 변환된 음성 프롬프트 사용): 업스트림의 .pt 음성 파일이나 스크립트(scripts/convert_voice_to_gguf.py)를 통해 변환된 음성을 사용할 수 있습니다. 30초 분량의 참조 클립을 제공하면 복제된 음성으로 24kHz 음성을 생성합니다. 사전 변환된 GGUF(0.5B 실시간 모델)는 https://huggingface.co/mudler/vibevoice.cpp-models 에서 제공합니다.
- 긴 오디오 ASR 및 화자 분리: 7B 파라미터 모델을 사용하며, JSON 세그먼트 {start, end, speaker, content}를 반환합니다. 최대 17분 분량의 오디오를 한 번에 테스트했습니다.
백엔드: ggml의 백엔드 디스패치를 통해 CPU(기본), CUDA, Metal, Vulkan, hipBLAS를 지원합니다. 단일 바이너리 또는 libvibevoice.so + 평면 C ABI로 제공되어 임베딩(purego/cgo/dlopen 친화적)이 가능합니다.
성능 수치:
Inference RTF Peak RSS
68s sample, CUDA Q4_K (GB10): 28 s 0.41 ~6 GB
68s sample, CPU Q4_K (R9): 150 s 2.20 ~8 GB
17min audio, CPU Q8_0: 1929 s 1.94 ~26 GB
기존 Microsoft Python + Transformers + vLLM 플러그인과 비교:
- 동일한 Qwen2.5 7B/0.5B 백본, 동일한 DPM-Solver 확산 헤드, 동일한 윈도우 프리필(mlx-audio 패턴에 따라 텍스트 토큰 5개 / 음성 프레임 6개)을 사용합니다.
- 폐쇄 루프 TTS→ASR 테스트에서 고정 시드 기준 100% 소스 단어 재현율을 보장하며 CI에서 실행됩니다.
- 추론 시 Python, vLLM, torch를 사용하지 않습니다.
한계점 / 솔직한 평가:
- 17분 오디오 처리 시 인코더 활성화 풀과 14GB Q8_0 가중치 때문에 CPU에서 여전히 26GB의 메모리를 사용합니다. Q4_K는 모델 측면에서 용량을 줄여주지만(~10GB), 인코더 풀은 별도의 작업이 필요합니다.
- 확산 헤드는 잠재 프레임당 20개의 작은 그래프를 생성하는데, 그래프 재사용이 다음 개선 과제입니다.
- 아직 스트리밍 출력은 지원하지 않으며, 전체 WAV / 전체 스크립트를 생성합니다.
- ASR 스크립트 품질은 업스트림과 동일합니다. 17분 분량의 이탈리아어 오디오에서 복구된 스크립트는 자연스러운 문장 경계까지 충실하게 유지되었습니다.


