Transformers documentation
X-Codec
이 모델은 2024-08-30에 HF papers에 게시되었으며, 2025-08-15에 Hugging Face Transformers에 기여되었습니다.
X-Codec
개요
X-Codec 모델은 Zhen Ye, Peiwen Sun, Jiahe Lei, Hongzhan Lin, Xu Tan, Zheqi Dai, Qiuqiang Kong, Jianyi Chen, Jiahao Pan, Qifeng Liu, Yike Guo, Wei Xue가 발표한 Codec Does Matter: Exploring the Semantic Shortcoming of Codec for Audio Language Model에서 제안되었습니다.
X-Codec 모델은 HuBERT와 같은 자기지도 학습 모델에서 추출한 의미론적 정보와 전통적인 음향 정보를 통합하는 신경 오디오 코덱입니다. 이를 통해 다음이 가능합니다:
- 음악 연속 생성: 음악적 의미에 대한 모델링이 개선되어 더 일관된 연속 생성이 가능합니다.
- 텍스트-사운드 합성: X-Codec은 텍스트 프롬프트와 생성된 오디오 간의 의미적 정합성을 포착합니다.
- 의미 인식 오디오 토큰화: X-Codec은 YuE 가사 기반 노래 생성 모델에서 오디오 토크나이저로 사용됩니다.
해당 논문의 초록은 다음과 같이 서술합니다:
음성 생성 분야의 최근 발전은 대규모 언어 모델(LLM)의 기능에 의해 크게 촉진되었습니다. 기존 음성 LLM 연구는 주로 음성 언어 모델의 아키텍처와 규모를 향상시키고 더 큰 데이터셋을 활용하는 데 집중되었으며, 일반적으로 EnCodec과 같은 음향 코덱이 음성 토큰화(audio tokenization)에 사용됩니다. 그러나 이러한 코덱은 원래 음성 압축을 위해 설계되었기 때문에 음성 LLM 컨텍스트에서 최적이지 않은 성능을 초래할 수 있습니다. 본 연구는 현재 음성 LLM 코덱의 한계를 해결하는 것을 목표로 하며, 특히 생성된 음성에서 의미적 무결성을 유지하는 데 있어 직면한 문제를 다룹니다. 예를 들어, 텍스트 전사본에 조건을 부여하여 음향 토큰 생성을 수행하는 VALL-E와 같은 기존 방법은 음향 토큰의 의미적 오해석으로 인해 콘텐츠 부정확성과 높은 단어 오류율(WER)을 겪는 경우가 많으며, 이는 단어 생략과 오류로 이어집니다. 이러한 문제를 극복하기 위해, 우리는 X-Codec이라는 단순하면서도 효과적인 접근법을 제안합니다. X-Codec은 Residual Vector Quantization(RVQ) 단계 전에 사전 학습된 의미 인코더의 의미적 특징을 통합하고, RVQ 이후에 의미 재구성 손실을 도입합니다. 코덱의 의미적 능력을 향상시킴으로써, X-Codec은 음성 합성 작업에서 WER을 현저히 줄이고 이러한 이점을 음악 및 사운드 생성을 포함한 비음성(non-speech) 응용 분야로 확장합니다. 텍스트-음성 변환, 음악 연속 생성, 텍스트-사운드 변환 작업에 대한 우리의 실험은 의미 정보를 통합하면 음성 생성에서 언어 모델의 전반적인 성능이 크게 향상됨을 보여줍니다.
모델 카드:
- (음성을 위한) xcodec-hubert-librispeech
- xcodec-wavlm-mls (음성용)
- (음성을 위한) xcodec-wavlm-more-data
- xcodec-hubert-general (일반 오디오용)
- xcodec-hubert-general-balanced (일반 오디오용)
이 모델은 Manal El Aidouni님이 기여하였습니다. 원본 코드는 여기에서, 다섯 가지 다른 모델의 원본 체크포인트는 여기에서 찾을 수 있습니다.
데모는 이 페이지에서 확인할 수 있습니다.
사용 예시
이 모델을 사용하여 오디오를 인코딩하고 디코딩하는 간단한 예시입니다:
from datasets import Audio, load_dataset
from transformers import AutoFeatureExtractor, XcodecModel
dummy_dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
# load model and feature extractor
model_id = "hf-audio/xcodec-hubert-librispeech"
model = XcodecModel.from_pretrained(model_id, device_map="auto")
feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)
# load audio sample
dummy_dataset = dummy_dataset.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
audio_sample = dummy_dataset[-1]["audio"]["array"]
inputs = feature_extractor(raw_audio=audio_sample, sampling_rate=feature_extractor.sampling_rate, return_tensors="pt").to(model.device)
# encode and decode
encoder_outputs = model.encode(inputs["input_values"])
decoder_outputs = model.decode(encoder_outputs.audio_codes)
audio_values = decoder_outputs.audio_values
# or the equivalent with a forward pass
audio_values = model(inputs["input_values"]).audio_values원본 오디오와 재구성된 오디오를 청취하려면 아래 스니펫을 실행한 후, 생성된 original.wav와 reconstruction.wav 파일을 음악 플레이어에서 열어 비교해 보세요.
import soundfile as sf
original = audio_sample
reconstruction = audio_values[0].cpu().detach().numpy()
sampling_rate = feature_extractor.sampling_rate
sf.write("original.wav", original, sampling_rate)
sf.write("reconstruction.wav", reconstruction.T, sampling_rate)XcodecConfig
클래스 transformers.XcodecConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonetarget_bandwidths: list[int | float] | tuple[int | float, ...] = (0.5, 1, 1.5, 2, 4)sample_rate: int = 16000kernel_size: int = 3channel_ratios: list[int] | tuple[int, ...] = (1, 1)strides: list[int] | tuple[int, ...] = (1, 1)block_dilations: list[int] | tuple[int, ...] = (1, 1)unit_kernel_size: int = 3codebook_size: int = 1024codebook_dim: int | None = Noneinitializer_range: float = 0.02acoustic_model_config: dict | transformers.configuration_utils.PreTrainedConfig | None = Nonesemantic_model_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None )
매개변수
- target_bandwidths (
List[float], 선택 사항, 기본값[0.5, 1, 1.5, 2, 4]) — 모델이 오디오를 인코딩할 수 있는 다양한 대역폭(kbps) 범위입니다. - sample_rate (
int, 선택 사항, 기본값16000) — 오디오 파일을 디지털화할 때 사용할 샘플링 주파수입니다. 헤르츠(Hz) 단위로 표시됩니다. - kernel_size (
int, 선택 사항, 기본값3) — 합성곱 커널의 크기입니다. - channel_ratios (
List[float], 선택 사항, 기본값[1, 1]) — 각 의미론적 블록의 출력 채널 수에 대한 확장 계수입니다. - strides (
List[int], 선택 사항, 기본값[1, 1]) — 각 semantic encoder 블록에 대한 stride 값입니다. - block_dilations (
List[int], 선택 사항, 기본값[1, 1]) — 시맨틱 블록 내 잔차 유닛의 dilation 계수입니다. - unit_kernel_size (
int, 선택 사항, 기본값 3) — semantic 블록 내 각 ResidualUnit의 kernel size입니다. - codebook_size (
int, 선택 사항, 기본값1024) — 모델이 사용하는 병렬 코드북의 수입니다. - codebook_dim (
int, 선택 사항) — 각 codebook 임베딩 벡터의 차원. - initializer_range (
float, 선택 사항, 기본값0.02) — 모든 가중치 행렬을 초기화하는 truncated_normal_initializer의 표준 편차입니다. - acoustic_model_config (
Union[Dict, DacConfig], 선택) — 음향(DAC) 모델의 구성 인스턴스입니다. - semantic_model_config (
Union[Dict, HubertConfig, WavLMConfig], 선택) — 의미론적(HuBERT) 모델의 설정 객체 인스턴스입니다.
이것은 XcodecModel의 구성을 저장하기 위한 구성 클래스입니다. 지정된 인자에 따라 Xcodec 모델을 인스턴스화하여 모델 아키텍처를 정의하는 데 사용됩니다. 기본값으로 구성을 인스턴스화하면 Manel/X-Codec의 구성과 유사한 구성이 생성됩니다.
Configuration 객체는 PreTrainedConfig를 상속하며 모델 출력을 제어하는 데 사용할 수 있습니다. 자세한 내용은 PreTrainedConfig의 문서를 참고하세요.
예:
>>> from transformers import XcodecModel, XcodecConfig
>>> # Initializing configuration
>>> configuration = XcodecConfig()
>>> # Initializing a model (with random weights) from the configuration
>>> model = XcodecModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configXcodecModel
class transformers.XcodecModel
< source >( config: XcodecConfig )
매개변수
- config (XcodecConfig) — 모델의 모든 매개변수를 포함하는 모델 구성 클래스입니다. 구성 파일로 초기화하는 것은 모델과 관련된 가중치를 로드하지 않으며, 구성 정보만 로드합니다. 모델 가중치를 로드하려면 from_pretrained() 메서드를 확인하세요.
Xcodec 신경 오디오 코덱 모델.
이 모델은 PreTrainedModel에서 상속됩니다. 라이브러리가 모든 모델에 대해 구현하는 일반적 메서드(다운로드 또는 저장, 입력 임베딩 크기 조정, 헤드 프루닝 등)에 대한 세부 사항은 상위 클래스 문서를 확인하세요.
이 모델은 또한 PyTorch torch.nn.Module의 하위 클래스입니다. 일반적인 PyTorch Module처럼 사용하며, 일반적인 사용법 및 동작과 관련된 모든 사항은 PyTorch 문서를 참조하세요.
decode
< source >( audio_codes: Tensorreturn_dict: bool | None = None )
매개변수
- audio_codes (
torch.LongTensor, shape(batch_size, num_quantizers, codes_length)) —model.encode를 사용하여 계산된 이산 코드 인덱스. - return_dict (
bool, 선택 사항) — ModelOutput를 반환할지 여부
encode
< source >( input_values: Tensorbandwidth: float | None = Nonereturn_dict: bool | None = None )
매개변수
- input_values (
torch.Tensor, shape(batch_size, channels, num_samples)) — 입력 오디오 웨이브폼의 부동소수점 값. - bandwidth (
float, 선택 사항) — (kbps) 단위의 목표 대역폭입니다.config.target_bandwidths에 포함된 값만 지원합니다. 기본값은 사용 가능한 최고 대역폭인4.0kbps입니다. - return_dict (
bool, 선택) — ModelOutput를 반환할지 여부.
forward
< source >( input_values: Tensoraudio_codes: typing.Optional[torch.Tensor] = Nonebandwidth: float | None = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → XcodecOutput or tuple (audio_codes, audio_values)
매개변수
- input_values (
torch.Tensor, shape(batch_size, channels, num_samples)) — 입력 오디오 웨이브폼의 원시 float 값입니다. - audio_codes (
torch.LongTensor, shape(batch_size, num_quantizers, codes_length)—model.encode를 사용하여 계산된 이산 코드 인덱스. - bandwidth (
float, 선택 사항) — kbps 단위의 목표 대역폭입니다.config.target_bandwidths중 하나여야 합니다. 기본값은 사용 가능한 가장 높은 대역폭입니다. - bandwidth (
float, 선택 사항) — kbps 단위의 목표 대역폭입니다.config.target_bandwidths중 하나여야 합니다. 기본값은 사용 가능한 가장 높은 대역폭입니다.
반환값
XcodecOutput 또는 (audio_codes, audio_values) 튜플
audio_codes:(batch_size, num_quantizers, codes_length)모양의 양자화된 이산 코드.audio_values의 shape이(batch_size, channels, num_samples)인 재구성된 오디오 웨이브폼입니다.
XcodecModel의 forward 메서드는 __call__ 특수 메서드를 오버라이드합니다.
이 함수 내에서 forward pass의 레시피를 정의해야 하지만, 이후에는 이 함수 대신
Module인스턴스를 호출해야 합니다. 전자는 전처리 및 후처리 단계를 실행하는 것을 처리하는 반면, 후자는 이를 조용히 무시하기 때문입니다.
예:
>>> from datasets import load_dataset
>>> from transformers import AutoFeatureExtractor, XcodecModel
>>> model_id = "hf-audio/xcodec-hubert-librispeech"
>>> model = XcodecModel.from_pretrained(model_id)
>>> feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)
>>> dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
>>> audio_sample = dataset[0]['audio']['array']
>>> inputs = feature_extractor(raw_audio=audio_sample, return_tensors="pt")
>>> outputs = model(**inputs)
>>> audio_codes = outputs.audio_codes
>>> audio_values = outputs.audio_values