전체 글

· Casimiro Ferreira· 7 분 읽기

음성 복제 엔진 고르기

  • ONNX
  • voice cloning
  • voice conversion
  • self-hosted

음성 변환은 녹음과 참조 화자를 받아, 참조 화자의 목소리로 같은 단어들을 만들어냅니다. 파이프라인 어디에도 텍스트는 관여하지 않습니다: 입력도 오디오, 출력도 오디오이며, 모델은 전사를 읽거나 쓰지 않습니다. 이것이 텍스트에서 시작하며 보존할 원본 녹음이 없는 텍스트 음성 변환(TTS)과 이를 구분하는 지점입니다. 음성 변환은 더 좁은 질문에 답합니다: 이 녹음이 주어졌을 때, 단어는 그대로 유지하면서 다른 누군가처럼 들리게 만들라는 것입니다.

그 더 좁은 작업에는 실제 용도가 있습니다. 두 번째 성우를 고용하지 않고 녹음을 일관된 목소리로 더빙하는 것. 인터뷰나 상담 전화에서 단어는 그대로 유지하면서 화자를 익명화하는 것. 각 언어의 기반 음성이 독립적으로 학습되어 서로 다른 사람처럼 들릴 때, TTS 시스템의 출력에 언어 전반에 걸쳐 하나의 안정적인 정체성을 부여하는 것.

voiceclonnx는 이러한 엔진 10개를 하나의 Python API 뒤에서 구현하며, 모두 추론 시 PyTorch 없이 onnxruntime에서 실행됩니다. 이 엔진들은 서로 바꿔 쓸 수 있는 것이 아닙니다. 서로 다른 모델 계열에서 왔으며, 하나를 고른다는 것은 승자를 고르는 것이 아니라 트레이드오프를 고르는 것입니다.

API, 간단히

from voiceclonnx import VoiceCloner

cloner = VoiceCloner(engine="facodec")
out = cloner.clone_voice("source.wav", "reference.wav", "out.wav")
print(cloner.sample_rate)   # 16000

clone_voice(audio, reference_voice, out_path)는 원본 녹음, 대상 화자의 5-30초 참조 클립, 출력 경로를 받아 변환된 WAV의 경로를 반환합니다. 엔진을 바꾸는 것은 engine= 문자열을 바꾸는 것을 의미하며, 호출 형태는 바뀌지 않습니다. 예외가 하나 있는데, rvc는 참조 녹음 대신 .onnx 음성 모델 경로를 받습니다(아래에서 다룹니다). pip install voiceclonnx는 10개 엔진을 모두 끌어오며, 모델은 처음 사용할 때 Hugging Face에서 다운로드됩니다.

하나가 아니라 두 개의 축

변환이 얼마나 잘 되었는지는 두 숫자로 설명되며, 이 둘은 함께 움직이지 않습니다.

**단어 오류율(WER)**은 명료도를 측정합니다: 출력을 다시 음성 인식기에 통과시켜 원본 전사와 비교했을 때, 원래 문장이 얼마나 살아남았는지입니다. WER 0%는 모든 단어가 올바르게 전달되었다는 뜻입니다.

화자 유사도는 정체성을 측정합니다: 출력이 원본이 아니라 실제로 대상 화자처럼 들리는지입니다. 이는 화자 임베딩 — 같은 음높이와 음량에서 한 목소리를 다른 목소리와 다르게 들리게 만드는 음색을 나타내는, 목소리의 압축된 숫자 지문 — 을 출력과 참조 클립에서 각각 추출한 다음 코사인 유사도로 비교하여 계산됩니다. 1.0은 동일한 음색을 의미하며, voiceclonnx 자체의 기준선 — 변환하지 않은 원본 사본을 대상과 비교한 점수 — 은 0.09이므로, 그보다 의미 있게 높은 값은 실제 변환 작업을 하고 있다는 뜻입니다.

voiceclonnx는 두 참조 음성으로 변환된 동일한 문장에 대해 측정한 두 숫자를 모든 엔진에 대해 공개합니다. WER은 faster-whisper에서 나오고, 화자 유사도는 wespeaker-resnet34 임베딩 모델에서 나옵니다(다른 두 모델과 교차 검증됨). 나란히 놓으면 패턴이 드러납니다: 어떤 엔진도 두 열 모두에서 1위를 차지하지 않습니다.

엔진계열WER대상 유사도
focalcodeckNN 특징 교체15-19%0.61
lscodec화자 분리 코덱~35%0.54
chatterboxAR 코덱-LM4-8%0.54
knnvckNN 특징 교체12-15%0.49
facodec인수분해 코덱0%0.44
openvoice음색 전이0%0.37
bicodec의미론적 + 전역 토큰12%0.29
triaanTriple-AAN4%0.29
cosyvoice흐름 매칭8%0.21

(rvc는 임의의 참조 클립이 아니라 하나의 고정된 커뮤니티 학습 음성으로만 원본을 변환하므로, 이 표에서 비교할 수 없습니다. 아래를 참고하세요.)

이 표는 단일 최고 라인을 찾기보다 행 단위로 읽으세요. facodecopenvoice는 WER 0% — 모든 단어가 살아남음 — 에 자리하며 적당한 유사도를 보입니다. focalcodeclscodec은 반대쪽 끝에 있습니다: 이 집합에서 가장 강한 음색 전이를 15-35%의 단어를 틀리게 하는 대가로 얻습니다. chatterbox는 두 축 모두에서 동시에 잘하는 유일한 엔진이며(WER 4-8%, 유사도 0.54), 이는 다음에 다룰 그 아키텍처의 속성입니다.

계열마다 다르게 동작하는 이유

이 엔진들은 서로 다른 접근법으로 나뉘며, 그 접근법이 위 표에서 어디에 자리하는지를 예측합니다.

kNN 특징 교체(knnvc, focalcodec). 원본 오디오는 짧은 프레임으로 쪼개지고, 각각은 사전 학습된 자기지도 인코더에 의해 특징 벡터로 바뀝니다. 각 원본 프레임에 대해, 알고리즘은 대상 화자 특징들의 풀에서 가장 가까운 k개의 프레임을 찾아 평균을 내어 섞어넣어, 인코더 자체의 표현에서 추출된 위치에 있는 근본적인 음성학적 내용은 그대로 두면서 원본의 음색을 프레임 단위로 교체합니다. 한 목소리를 다른 목소리로 매핑하는 학습된 디코더가 없습니다 — 교체는 최근접 이웃 조회입니다 — 이것이 음색 전이가 공격적일 수 있는 이유(focalcodec은 0.61 유사도에 도달합니다)이며, 그 대가로 대상 풀에서 일치가 나쁜 프레임을 가끔 뭉갤 수 있고, 이는 WER로 나타납니다.

인수분해 코덱(facodec). 신경 오디오 코덱 — 음성을 압축된 토큰 시퀀스로 압축하고 다시 재구성하는 모델 — 이 그 토큰들을 콘텐츠 스트림과 음색 스트림으로 명시적으로 분리하도록 학습됩니다. 콘텐츠가 전용 스트림이므로, 디코더는 단어를 높은 충실도로 재구성합니다. 음색 스트림만 대상 화자의 것으로 교체됩니다. 그 명시적 분리가 facodec이 WER 0%에 도달하는 이유입니다: 콘텐츠 보존이 다른 어떤 것과도 경쟁하지 않기 때문입니다.

음색 전이(openvoice). 별도의 인코더가 언어적 내용을 고정한 뒤, 변환 모듈이 톤 색상 — 음높이 윤곽과 음색 — 을 바꿉니다. 발상은 인수분해 코덱 접근과 비슷하지만, 이산 토큰이 아니라 멜 스펙트로그램 위에서의 색상 전이 단계로 구현됩니다. 이 또한 WER 0%에 도달하며, facodec보다는 다소 낮은 유사도를 보입니다.

AR 코덱-LM(chatterbox). 대상 화자의 임베딩에 조건화되어 코덱 토큰을 하나씩 예측하는 자기회귀 언어 모델로, 텍스트 음성 변환 언어 모델과 비슷하지만 텍스트 대신 원본 녹음의 콘텐츠 토큰에 조건화됩니다. 운율(리듬, 강세, 억양)을 원본에서 직접 복사하는 대신 같은 자기회귀 과정의 일부로 생성하므로, 음색과 함께 말하는 스타일도 함께 나를 수 있습니다 — 문서가 “가장 강한 원본-대상 전환”을 준다고 언급하는 이유입니다 — 그리고 명료도와 유사도 양쪽에서 동시에 좋은 점수를 내는 유일한 엔진입니다.

흐름 매칭(cosyvoice). 구성 가능한 횟수(ode_steps, 기본값 10)만큼 단계를 거치는 ODE(상미분방정식) 솔버를 사용해 노이즈를 대상 멜 스펙트로그램으로 반복적으로 정제하는 연속 생성 과정입니다. 그 콘텐츠 인코더는 교차 언어 전이를 위해 설계되었으며, 그 범용성이 아마도 이 집합에서 가장 낮은 대상 유사도 점수의 이유일 것입니다: 그 표현은 언어 독립성을 위해 최적화되어 있지, 가장 밀착된 화자 매칭을 위한 것이 아닙니다.

화자 분리 코덱(lscodec). facodec처럼 콘텐츠와 화자 정체성을 분리하도록 학습된 코덱이지만, 콘텐츠 스트림의 정밀도를 직접적인 대가로 치르면서 유사도를 더 밀어붙이도록 조정되어, ~35%의 WER과 이 집합에서 두 번째로 높은 유사도에 자리합니다.

Triple-AAN과 의미론적+전역 토큰 코덱(triaan, bicodec)은 두 축 모두에서 중간 — 적당한 WER, 적당한 유사도, 어느 쪽으로도 강한 편향 없음 — 에 자리합니다.

Any-to-ONE 코덱 + 보코더(rvc). ContentVec(콘텐츠 인코더)이 VITS 보코더에 공급하는 구조로, 임의의 참조 클립을 받는 대신 대상 목소리별로 학습됩니다. 이 엔진의 reference_voice는 오디오 파일이 아니라 .onnx RVC 모델 파일의 경로 또는 Hugging Face 저장소 ID입니다:

cloner = VoiceCloner(engine="rvc")
out = cloner.clone_voice("source.wav", "/path/to/myvoice.onnx", "out.wav")

각 RVC 모델은 하나의 대상 목소리로 학습되므로, 추론 시 참조 클립을 받지 않으며 any-to-any 엔진들과 같은 유사도 벤치마크로 채점되지 않습니다. 측정된 38%의 WER은 커뮤니티가 학습시킨 표본 모델 하나를 반영하는 것이지, 아키텍처 일반을 반영하는 것이 아닙니다 — 품질은 그 특정 모델이 어떻게 학습되었는지에 달려 있습니다. 수천 개의 커뮤니티 RVC 음성이 Hugging Face에 존재하며 저장소 ID로 바로 로드됩니다.

어느 것을 실행할지 결정하기

빠른 범용 파이프라인. facodec이나 openvoice로 시작하세요. 둘 다 측정된 WER 0%에 적당한 유사도(각각 0.44, 0.37)를 보이며, 둘 다 품질 저하가 기록되지 않은 INT8 양자화 변형을 제공합니다 — 더 작고 빠른 모델을 위해 quantized=True를 전달하세요.

최대 화자 유사도. 15-19%의 WER이 그 용도에 받아들일 만하다면 focalcodec(측정된 최고치인 0.61 유사도)을 사용하고, 그렇지 않다면 chatterbox(유사도 0.54, WER 4-8%)를 사용하세요. chatterbox는 또한 24kHz로 실행되며, 이는 이 집합에서 any-to-any 변환 중 가장 높은 출력 표본율입니다 — rvc는 위의 any-to-ONE 모드에서만 최대 48kHz로 실행됩니다.

저자원 하드웨어. INT8 상태의 knnvc는 디스크에서 약 123MB로 이 집합에서 가장 작은 용량이며, 유사도 0.49와 WER 12-15%를 보입니다 — 제한된 메모리에 합리적인 절충입니다. 모든 엔진이 깔끔하게 양자화되지는 않습니다: focalcodeccosyvoice는 INT8에서 성능이 저하된다고 문서화되어 있으므로, 이 둘은 fp32로 유지하세요.

엔진이 학습받지 않은 언어. cosyvoice의 콘텐츠 인코더는 교차 언어 전이를 위해 만들어졌으며, 이는 측정된 유사도(0.21)가 직접 비교 가능한 아홉 개 엔진 중 가장 낮음에도 불구하고 같은 언어 변환에 맞춰진 엔진 대신 이를 선택하는 문서화된 이유입니다.

정확한 단어보다 목소리 정체성. lscodec은 비교 가능한 집합에서 가장 높은 WER(~35%)를 대가로, 코덱 계열 엔진 중 가장 강한 음색 전이(0.54, chatterbox와 동률)를 제공합니다. 목표가 “이것이 대상 화자처럼 들리는가”이고 출력의 이따금 있는 단어 오류를 견딜 수 있을 때 고르세요.

임의의 클립이 아니라 하나의 고정된 커뮤니티 목소리. 참조 녹음 대신 사전 학습된 .onnx 음성 모델을 사용하는 rvc.

먼저 확인해야 할 비상업적 제약. bicodec 가중치는 CC BY-NC-SA 4.0으로 라이선스되어 있습니다. 다른 모든 엔진의 가중치는 MIT, Apache-2.0, 또는 CC BY 4.0입니다. 상업적으로 배포하기 전에 배포할 특정 가중치의 라이선스를 확인하세요.

이것이 잘하지 못하는 것, 그리고 누구에게 사용해서는 안 되는가

위의 모든 숫자에는 같은 주의사항이 붙습니다: 이 숫자들은 두 개의 특정 참조 목소리 사이에서 변환된 영어 데모 문장을 설명합니다. 다른 언어, 더 시끄러운 원본 녹음, 더 짧거나 품질이 낮은 참조 클립, 혹은 엔진의 학습 데이터에 있는 어떤 것과도 거리가 먼 목소리를 가진 원본 화자는 모두 그 숫자를 대개 더 나쁜 쪽으로 움직입니다. 이 엔진들 중 어느 것도 저품질 원본 녹음에 대한 보편적인 해결책이 아닙니다 — 몇몇은 원본 노이즈를 그대로 통과시키면서 음색을 기꺼이 변환하는데, 노이즈에는 콘텐츠/음색 분리가 항상 깔끔하게 분리해내지는 못하는 자체적인 음향 서명이 있기 때문입니다.

음성 변환은 또한 이 팀이 이미 고민해야 했던 그 가까운 사촌, TTS를 위한 음성 복제와 마찬가지로 실질적인 위험을 제기합니다: 녹음을 실제로 식별 가능한 사람처럼 들리게 변환하는 것은, 의도가 있었든 없었든 사칭 가능한 기술입니다. 이 팀이 합성 음성 전반에 적용하는 규칙 — 실제 사람의 목소리를 공여자나 대상으로 사용하기 전에 명시적 동의를 얻고, 동의가 불가능할 때는 퍼블릭 도메인 녹음이나 의도적으로 독창적인 목소리로 대체한다는 것 — 이 여기서도 예외 없이 적용됩니다. 실제 사람의 참조 클립은 동의의 관점에서 그 사람 목소리의 완전한 학습 세트와 다르지 않습니다. 다만 쓸 만한 결과를 만드는 데 훨씬 적은 양이 필요할 뿐이며, 이는 덜 조심할 이유가 아니라 더 조심할 이유입니다.

음성 변환이 여러분이 만들고 있는 파이프라인의 일부라면 문의를 통해 연락하시거나 저희가 제공하는 것을 확인해 보세요.