Transformers documentation

MMS

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

이 모델은 2023-05-22에 HF papers에 게시되었으며, 2023-06-20에 Hugging Face Transformers에 기여되었습니다.

MMS

개요

MMS 모델은 Vineel Pratap, Andros Tjandra, Bowen Shi, Paden Tomasello, Arun Babu, Sayani Kundu, Ali Elkahky, Zhaoheng Ni, Apoorv Vyas, Maryam Fazel-Zarandi, Alexei Baevski, Yossi Adi, Xiaohui Zhang, Wei-Ning Hsu, Alexis Conneau, Michael Auli가 Scaling Speech Technology to 1,000+ Languages에서 제안했습니다.

해당 논문의 초록은 다음과 같습니다:

음성 기술의 언어 커버리지를 확장하면 더 많은 사람들이 정보에 접근할 수 있는 기회가 확대될 수 있습니다. 그러나 현재 음성 기술은 약 100개 언어로 제한되어 있으며, 이는 전 세계에서 사용되는 7,000개 이상의 언어 중 극히 일부에 불과합니다. Massively Multilingual Speech(MMS) 프로젝트는 작업에 따라 지원 언어 수를 10~40배까지 늘립니다. 주요 구성 요소는 공개된 종교 텍스트의 낭독을 기반으로 한 새로운 데이터셋과 자기지도 학습(self-supervised learning)의 효과적인 활용입니다. 1,406개 언어를 커버하는 사전 학습된 wav2vec 2.0 모델, 1,107개 언어를 위한 단일 다국어 자동 음성 인식 모델, 동일한 수의 언어를 위한 음성 합성 모델, 그리고 4,017개 언어를 위한 언어 식별 모델을 구축했습니다. 실험 결과, FLEURS 벤치마크의 54개 언어에서 Whisper의 단어 오류율을 절반 이상으로 줄이는 다국어 음성 인식 모델을, 라벨링 데이터의 극히 일부만 사용하여 학습할 수 있음을 보여주었습니다.

MMS 프로젝트에서 오픈소스로 공개된 다양한 모델입니다. 모델과 코드는 원래 여기에서 공개되었습니다. transformers 프레임워크에 추가하여 사용이 더 쉬워졌습니다.

자동 음성 인식(ASR)

ASR 모델 체크포인트는 mms-1b-fl102, mms-1b-l1107, mms-1b-all에서 찾을 수 있습니다. 가장 높은 정확도를 위해 mms-1b-all 모델을 사용하세요.

팁:

  • 모든 ASR 모델은 음성 신호의 원시 웨이브폼에 해당하는 float 배열을 입력으로 받습니다. 원시 웨이브폼은 Wav2Vec2FeatureExtractor로 전처리해야 합니다.
  • 모델은 connectionist temporal classification(CTC)을 사용하여 학습되었으므로, 모델 출력은 Wav2Vec2CTCTokenizer를 사용하여 디코딩해야 합니다.
  • load_adapter()를 통해 서로 다른 언어에 해당하는 언어 어댑터 가중치를 로드할 수 있습니다. 언어 어댑터는 대략 200만 개의 파라미터로만 구성되어 있어, 필요할 때 효율적으로 온더플라이(on-the-fly)로 로드할 수 있습니다.

로딩

기본적으로 MMS는 영어 어댑터 가중치를 로드합니다. 다른 언어의 어댑터 가중치를 로드하려면 target_lang=<your-chosen-target-lang>과 함께 "ignore_mismatched_sizes=True도 지정해야 합니다. ignore_mismatched_sizes=True 키워드를 전달해야 지정된 언어의 어휘에 따라 언어 모델 헤드의 크기를 조정할 수 있습니다. 마찬가지로, 프로세서도 동일한 대상 언어로 로드해야 합니다

from transformers import AutoProcessor, Wav2Vec2ForCTC


model_id = "facebook/mms-1b-all"
target_lang = "fra"

processor = AutoProcessor.from_pretrained(model_id, target_lang=target_lang)
model = Wav2Vec2ForCTC.from_pretrained(model_id, target_lang=target_lang, ignore_mismatched_sizes=True, device_map="auto")

다음과 같은 경고는 무시하셔도 됩니다:

Some weights of Wav2Vec2ForCTC were not initialized from the model checkpoint at facebook/mms-1b-all and are newly initialized because the shapes did not match:
- lm_head.bias: found shape torch.Size([154]) in the checkpoint and torch.Size([314]) in the model instantiated
- lm_head.weight: found shape torch.Size([154, 1280]) in the checkpoint and torch.Size([314, 1280]) in the model instantiated
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.

ASR 파이프라인을 사용하려면 선택한 대상 언어를 다음과 같이 로드할 수 있습니다:

from transformers import pipeline


model_id = "facebook/mms-1b-all"
target_lang = "fra"

pipe = pipeline(model=model_id, model_kwargs={"target_lang": "fra", "ignore_mismatched_sizes": True})

추론

다음으로, ~PretrainedModel.from_pretrained를 호출한 후 추론 시 MMS를 실행하고 어댑터 레이어를 변경하는 방법을 살펴보겠습니다. 먼저 Datasets를 사용하여 다양한 언어의 오디오 데이터를 로드합니다.

from datasets import Audio, load_dataset


# English
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "en", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
en_sample = next(iter(stream_data))["audio"]["array"]

# French
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "fr", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
fr_sample = next(iter(stream_data))["audio"]["array"]

다음으로, 모델과 프로세서를 로드합니다


from transformers import AutoProcessor, Wav2Vec2ForCTC


model_id = "facebook/mms-1b-all"

processor = AutoProcessor.from_pretrained(model_id)
model = Wav2Vec2ForCTC.from_pretrained(model_id, device_map="auto")

이제 오디오 데이터를 처리하고, 처리된 오디오 데이터를 모델에 전달한 뒤, Wav2Vec2ForCTC에서 일반적으로 하듯이 모델 출력을 전사합니다.

inputs = processor(en_sample, sampling_rate=16_000, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model(**inputs).logits

ids = torch.argmax(outputs, dim=-1)[0]
transcription = processor.decode(ids)
# 'joe keton disapproved of films and buster also had reservations about the media'

이제 동일한 모델을 메모리에 유지한 채, 모델에는 load_adapter() 함수를, 토크나이저에는 set_target_lang()을 호출하여 언어 어댑터만 간단히 교체할 수 있습니다. 대상 언어를 입력으로 전달하며, 프랑스어는 "fra"를 사용합니다.

processor.tokenizer.set_target_lang("fra")
model.load_adapter("fra")

inputs = processor(fr_sample, sampling_rate=16_000, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model(**inputs).logits

ids = torch.argmax(outputs, dim=-1)[0]
transcription = processor.decode(ids)
# "ce dernier est volé tout au long de l'histoire romaine"

이와 동일한 방식으로 모든 지원 언어로 전환할 수 있습니다. 다음을 참고하세요:

processor.tokenizer.vocab.keys()

지원되는 모든 언어를 확인하려면

ASR 모델의 성능을 한층 더 향상시키기 위해 언어 모델 디코딩을 사용할 수 있습니다. 자세한 내용은 여기의 문서를 참고하세요.

음성 합성(TTS)

MMS-TTS는 v4.33에 🤗 Transformers에 추가된 VITS와 동일한 모델 아키텍처를 사용합니다. MMS는 프로젝트에 포함된 1100개 이상의 언어 각각에 대해 별도의 모델 체크포인트를 학습합니다. 사용 가능한 모든 체크포인트는 Hugging Face Hub의 facebook/mms-tts에서 찾을 수 있으며, 추론 문서는 VITS 아래에 있습니다.

추론

MMS 모델을 사용하려면 먼저 Transformers 라이브러리를 최신 버전으로 업데이트하세요:

pip install --upgrade transformers accelerate

VITS의 flow-based 모델은 비결정적이므로, 출력의 재현성을 보장하기 위해 시드를 설정하는 것이 좋은 관행입니다.

  • 영어나 프랑스어와 같이 로마 자를 사용하는 언어의 경우, 토크나이저를 직접 사용해 텍스트 입력을 전처리할 수 있습니다. 다음 코드 예제는 MMS-TTS 영어 체크포인트를 사용해 포워드 패스를 실행합니다.
import torch

from transformers import VitsModel, VitsTokenizer, set_seed


tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-eng")
model = VitsModel.from_pretrained("facebook/mms-tts-eng", device_map="auto")

inputs = tokenizer(text="Hello - my dog is cute", return_tensors="pt").to(model.device)

set_seed(555)  # make deterministic

with torch.no_grad():
   outputs = model(**inputs)

waveform = outputs.waveform[0]

결과 웨이브폼은 .wav 파일로 저장할 수 있습니다:

import scipy


scipy.io.wavfile.write("synthesized_speech.wav", rate=model.config.sampling_rate, data=waveform)

또는 Jupyter Notebook / Google Colab에서 다음과 같이 표시됩니다:

from IPython.display import Audio


Audio(waveform, rate=model.config.sampling_rate)

아랍어, 만다린, 힌디어와 같이 로마 문자가 아닌 문자 체계를 사용하는 특정 언어의 경우, 텍스트 입력을 로마 문자로 전처리하려면 uroman perl 패키지가 필요합니다.

tokenizer의 is_uroman 속성을 확인하여 해당 언어에 uroman 패키지가 필요한지 검사할 수 있습니다:

from transformers import VitsTokenizer


tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-eng")
print(tokenizer.is_uroman)

필요한 경우, VitsTokenizer에 텍스트를 전달하기 전에 uroman 패키지를 텍스트 입력에 적용해야 합니다. 현재 토크나이저는 자체적으로 전처리를 수행하는 것을 지원하지 않기 때문입니다.

이를 위해 먼저 uroman 저장소를 로컬 머신에 클론한 후, bash 변수 UROMAN을 로컬 경로로 설정합니다:

git clone https://github.com/isi-nlp/uroman.git
cd uroman
export UROMAN=$(pwd)

다음 코드 스니펫을 사용하여 텍스트 입력을 전처리할 수 있습니다. UROMAN bash 변수를 uroman 저장소를 가리키도록 사용하는 방법과, uromanize 함수에 uroman 디렉토리를 인수로 전달하는 방법 중 하나를 선택할 수 있습니다:

import os
import subprocess

import torch

from transformers import VitsModel, VitsTokenizer, set_seed


tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-kor")
model = VitsModel.from_pretrained("facebook/mms-tts-kor", device_map="auto")

def uromanize(input_string, uroman_path):
    """Convert non-Roman strings to Roman using the `uroman` perl package."""
    script_path = os.path.join(uroman_path, "bin", "uroman.pl")

    command = ["perl", script_path]

    process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # Execute the perl command
    stdout, stderr = process.communicate(input=input_string.encode())

    if process.returncode != 0:
        raise ValueError(f"Error {process.returncode}: {stderr.decode()}")

    # Return the output as a string and skip the new-line character at the end
    return stdout.decode()[:-1]

text = "이봐 무슨 일이야"
uromanized_text = uromanize(text, uroman_path=os.environ["UROMAN"])

inputs = tokenizer(text=uromanized_text, return_tensors="pt").to(model.device)

set_seed(555)  # make deterministic
with torch.no_grad():
   outputs = model(inputs["input_ids"])

waveform = outputs.waveform[0]

팁:

  • MMS-TTS 체크포인트는 소문자화되고 구두점이 없는 텍스트로 학습되었습니다. 기본적으로 VitsTokenizer는 정규화를 통해 입력에서 대소문자와 구두점을 제거하여, 모델에 어휘 밖 문자가 전달되는 것을 방지합니다. 따라서 모델은 대소문자와 구두점에 무관하므로, 텍스트 프롬프트에서는 이를 피해야 합니다. 토크나이저 호출 시 normalize=False를 설정하여 정규화를 비활성화할 수 있지만, 이는 예상치 못한 동작을 유발할 수 있으므로 권장되지 않습니다.
  • model.speaking_rate 속성에 원하는 값을 설정하여 발화 속도를 변경할 수 있습니다. 마찬가지로, model.noise_scale을 통해 노이즈의 무작위성을 제어합니다:
import torch

from transformers import VitsModel, VitsTokenizer, set_seed


tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-eng")
model = VitsModel.from_pretrained("facebook/mms-tts-eng", device_map="auto")

inputs = tokenizer(text="Hello - my dog is cute", return_tensors="pt").to(model.device)

# make deterministic
set_seed(555)

# make speech faster and more noisy
model.speaking_rate = 1.5
model.noise_scale = 0.8

with torch.no_grad():
   outputs = model(**inputs)

언어 식별(LID)

인식할 수 있는 언어의 수에 따라 다양한 LID 모델이 제공되며, 126, 256, 512, 1024, 2048, 4017개 언어를 지원합니다.

추론

먼저, transformers와 다른 라이브러리를 설치합니다

pip install torch accelerate datasets[audio]
pip install --upgrade transformers

다음으로, datasets를 통해 몇 개의 오디오 샘플을 로드합니다. 오디오 데이터가 16000 kHz로 샘플링되었는지 확인하세요.

from datasets import Audio, load_dataset


# English
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "en", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
en_sample = next(iter(stream_data))["audio"]["array"]

# Arabic
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "ar", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
ar_sample = next(iter(stream_data))["audio"]["array"]

다음으로, 모델과 프로세서를 로드합니다


from transformers import AutoFeatureExtractor, Wav2Vec2ForSequenceClassification


model_id = "facebook/mms-lid-126"

processor = AutoFeatureExtractor.from_pretrained(model_id)
model = Wav2Vec2ForSequenceClassification.from_pretrained(model_id, device_map="auto")

이제 오디오 데이터를 처리하고, ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition과 같은 Wav2Vec2 오디오 분류 모델에서 일반적으로 수행하듯 처리된 오디오 데이터를 모델에 전달하여 언어로 분류합니다.

# English
inputs = processor(en_sample, sampling_rate=16_000, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model(**inputs).logits

lang_id = torch.argmax(outputs, dim=-1)[0].item()
detected_lang = model.config.id2label[lang_id]
# 'eng'

# Arabic
inputs = processor(ar_sample, sampling_rate=16_000, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model(**inputs).logits

lang_id = torch.argmax(outputs, dim=-1)[0].item()
detected_lang = model.config.id2label[lang_id]
# 'ara'

체크포인트에서 지원하는 모든 언어를 확인하려면, 다음과 같이 언어 ID를 출력할 수 있습니다:

processor.id2label.values()

오디오 사전 학습 모델

두 가지 다른 크기, 300M과 1Bil의 사전학습 모델이 제공됩니다.

ASR용 MMS 아키텍처는 Wav2Vec2 모델에 기반하며, 다양한 다운스트림 작업을 위한 모델의 파인튜닝 방법에 대한 자세한 내용은 Wav2Vec2 문서 페이지를 참고하세요.

MMS-TTS는 VITS와 동일한 모델 아키텍처를 사용하며, API 참조는 VITS 문서 페이지를 참고하세요.

Update on GitHub