48 kHz로 목소리를 클로닝하기
VoxCPM2로.
새로운 TTS 모델이 방금 Soniqo에 들어왔습니다. 당신의 노트북에서 돌아가고, 스튜디오 품질의 48 kHz 오디오를 출력하며, 짧은 클립 하나에서 목소리를 클로닝합니다. 이 글은 그것으로 무엇을 만들 수 있는지, 목소리를 클로닝하는 세 가지 방법, 그리고 모델이 내부에서 어떻게 작동하는지를 친근하게 살펴봅니다.
클로닝이 로컬로 돌 때 바뀌는 네 가지.
기기에서 클로닝을 돌리면 네 가지 속성이 한꺼번에 열립니다 — 프라이버시, 오프라인 사용, 호출당 비용 없음, 그리고 목소리의 완전한 소유. 각각은 다른 방식으로는 만들기 까다로운 제품 부류를 엽니다.
부모가 읽는 30초를 녹음하세요. 오디오북 앱은 이후 그 목소리로 어떤 장이든 낭독합니다 — 같은 온기, 같은 억양으로, 세션마다 로컬 생성.
유튜버와 팟캐스터는 30개 언어에서 일관된 목소리 하나를 유지합니다. 영어로 한 번 녹음하고, 같은 에피소드를 일본어, 스페인어, 힌디어로 성우진 없이 내보내세요.
목소리를 잃을 위기에 있는 사람은 짧은 클립에 목소리를 저장하고, 일반 TTS 엔진이 아니라 자신처럼 들리는 보조 기술로 계속 말할 수 있습니다.
원하는 목소리를 설명하면 — "젊은 여성, 부드럽고 따뜻한 목소리" — 모델이 참조 녹음 없이 설계합니다. 게임 NPC, 키오스크 안내, 브랜드 보이스 A/B 테스트에 유용.
VoxCPM2와 ElevenLabs 비교.
ElevenLabs는 명백한 클라우드 API 대안입니다. 트레이드오프는 무엇이 어디서 도는가 — 그리고 그다음 목소리는 누구의 것인가입니다.
프라이버시 보장, 오프라인 작동, 호출당 제로 비용이 필요한 제품에는 온디바이스 클로닝이 유일한 선택지입니다 — 모든 ElevenLabs 호출은 오디오를 그들의 서버로 업로드합니다.
| VoxCPM2 (Soniqo) | ElevenLabs | |
|---|---|---|
| 어디서 도는가 | 사용자 기기에서 | 호스팅 API |
| 오디오가 기기를 떠나는가 | 아니오 | 예 (ElevenLabs로 업로드) |
| 오프라인 사용 | 예 | 아니오 (인터넷 필요) |
| 호출당 비용 | 없음 | 문자 단위 과금 |
| 모델 라이선스 | Apache 2.0, 오픈 가중치 | 독점, SaaS 전용 |
| 최대 출력 샘플레이트 | 48 kHz 네이티브 | 48 kHz (Pro 등급 이상) |
| 언어 | 30 | 29 (Multilingual v2) · 70+ (Eleven v3) |
| 필요한 참조 클립 | 5–30초 | 1분 (Instant) · 30분 (Professional) |
| 텍스트에서 보이스 설계 | 예 | 예 |
두 엔진 모두 48 kHz에 도달하고, 둘 다 일상 클로닝을 위한 비슷한 언어 범위를 지원하며, 둘 다 텍스트 설명에서 보이스 설계를 제공합니다. 진짜 차이는 오디오가 애초에 기기를 떠나느냐입니다.
하나의 모델, 세 가지 진입.
모델은 모든 호출에서 같습니다. 바뀌는 것은 당신이 넘기는 인자입니다 — 그것이 설명에서 목소리를 설계할지, 녹음된 목소리를 복사할지, 억양을 보존할지를 결정합니다.
목소리를 자연어로 설명하세요. 모델은 어울리는 목소리를 고르고 호출 간에 일관성을 유지합니다.
let audio = try await tts.generateVoxCPM2(
text: "Welcome to the show.",
instruct: "A young woman, gentle and warm voice."
)깨끗한 음성 5–30초를 넘기세요. 모델은 음색과 리듬을 복사하고 그 목소리로 새 텍스트를 합성합니다.
let ref = try AudioFileLoader.load(
url: URL(fileURLWithPath: "speaker.wav"),
targetSampleRate: 16000
)
let audio = try await tts.generateVoxCPM2(
text: "This is a cloned voice.",
refAudio: ref
)클립과 그 전사를 함께 넘기세요. 이제 모델은 음향 특징을 음소와 맞출 수 있습니다 — 억양과 모음 선택이 이어집니다.
let audio = try await tts.generateVoxCPM2(
text: "Hello from the cloned voice.",
refAudio: ref,
promptText: "this is what the reference clip actually said",
promptAudio: ref
)같은 입력 슬롯에 서로 다른 조각을 채웁니다. 모델은 결코 플래그를 보지 않습니다 — 시퀀스를 읽습니다.
VoxCPM2가 오디오를 만드는 법.
협력하는 네 개의 모듈. 모델을 쓰는 데 이걸 알 필요는 없지만, 48 kHz가 어디서 오는지 궁금하다면 — 여기 있습니다.
파이프라인은 텍스트 토큰과 (선택적) 참조 오디오를 하나의 벡터 스트림으로 융합하는 로컬 인코더(LocEnc)로 시작합니다. 그 스트림은 TSLM에 들어갑니다 — 텍스트 LM이 다음 토큰을 고르는 것과 똑같이 다음에 어떤 오디오 "패치"가 올지 결정하는 28층 MiniCPM-4 언어 모델입니다. RALM을 통한 두 번째 패스가 각 패치를 다듬습니다.
여기까지는 전부 트랜스포머입니다. 흥미로운 반전은 LocDiT입니다. 이산 오디오 토큰의 고정 어휘에서 고르는 대신, 작은 확산 과정을 돌려 각 슬롯의 오디오 잠재를 "그립니다". 이산 코덱이 없다는 건 양자화 병목이 없다는 뜻 — 그것이 마지막 단계인 AudioVAE V2가 곧장 48 kHz로 디코딩하게 합니다. 이 스택의 다른 모든 온디바이스 엔진은 24 kHz에서 멈춥니다.
이 분업은 주목할 만합니다. 자기회귀 LM은 다음에 무엇이 와야 하는지(내용, 리듬, 길이)를 결정하는 데 뛰어나고, 확산 헤드는 음향 디테일(위상, 스펙트럼)을 그리는 데 뛰어납니다. VoxCPM2는 각자 잘하는 일을 하게 둡니다. 그래서 모델이 겨우 2B 파라미터로도 버팁니다 — 지각 품질을 버는 건 크기가 아니라 아키텍처입니다.
원본 연구를 읽어 보세요.
세 가지 크기. 디스크 예산으로 고르세요.
세 번들 모두 같은 아키텍처로 돌아갑니다. 언어 모델을 얼마나 공격적으로 양자화하는지만 다릅니다. int8 번들이 권장 기본값입니다 — 8문장 왕복 벤치마크에서 업스트림 Python 파이프라인과 맞먹으면서도 bf16보다 빠르고 40% 작습니다.
| 번들 | 크기 | 적합 |
|---|---|---|
| bf16 | ~5.0 GB | 참조 / 디버깅. |
| int8 기본 | ~3.0 GB | 일상 클로닝, 오디오북, 팟캐스트. |
| int4 | ~1.9 GB | 디스크가 제한된 배포. |
CLI에서.
# Voice design — no reference clip
speech speak "Welcome to the show." \
--engine voxcpm2 \
--voxcpm2-instruct "A young woman, gentle and warm voice." \
--output design.wav
# Reference cloning — 5–30 s clean clip
speech speak "This is a cloned voice." \
--engine voxcpm2 \
--voxcpm2-variant int8 \
--voice-sample speaker.wav \
--output clone.wav