Spoken Language Processing

Fairseq - Wav2vec 2.0 Pretraining (1) 입력 데이터 준비하기

햇농nongnong 2022. 5. 27. 18:44

Wav2vec 2.0


- wav2vec 2.0 은 speech representation 의 self-suprvised learning 을 위한 프레임워크이고, 레이블이 없는 데이터에 대한 음성 표현을 학습한다.
(wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations (Baevski et al., 2020)

 

- wav2vec 2.0 XLSR 모델은 다국어를 위해 사전 훈련된 모델이다.

- 다국어 사전훈련을 위해 MLS : Multilingual LibriSpeech (8 languages, 50.7k hours), CommonVoice (36 languages, 3.6k hours), Babel (17 languages, 1.7k hours) 의 데이터셋을 사용한다.

 

Model Architecture Hours Languages Datasets
XLSR-53 Large 56k 53 MLS, CommonVoice, BABEL

 

 

CLI 툴킷을 사용해 새 모델 학습시켜보기


- pretraining 을 위해 wav 파일들이 있는 디렉토리 준비

- 각 wav 파일은 10 - 30 초 길이로 준비

 

1. 훈련 데이터 준비

  • 먼저 오디오 파일을 읽고 쓸 수 있는 soundfile 라이브러리 설치하기 
    (soundfile - wav 파일 외에도 raw 파일 등 사운드 파일 구조를 오브젝트, 팡리 형태로 읽거나 쓰는데 특화된 라이브러리. 단, 파일의 신호를 가공/처리하는 함수들은 지원하지 않음. librosa 같은 고수준의 라이브러리들이 soundfile 을 읽거나 쓸 때 내부적으로 사용하는 라이브러리)
pip install soundfile

 

  • 입력 데이터 경로 파일 생성
python examples/wav2vec/wav2vec_manifest.py /path/to/waves --dest /manifest/path --ext $ext --valid-percent $valid

- $ext 는 soundfile 이 읽을 수 있는 범위에서 내 데이터셋의 포맷. ex) flac, wav

- $valid 는 validation set 에 사용할 훈련 데이터 비율 ex) 0.01   

- librispeech 의 dev-other 과 같은 사전 정의된 validation set 을 사용하기 위해서는 $valid 를 0 으로 설정

- 그러면 valid.tsv 를 별도로 사전 처리된 manifest file로 덮어씀

  • /path/to/waves 는 오디오 파일이 있는 경로
  • 위 코드를 실행하면, /manifest/path 의 경로에 train.tsv 와 valid.tsv 가 생성됨
  • /manifest/path 는 위 코드 실행 후 생성 결과물인 train.tsv 와 valid.tsv 를 저장하는 경로

 

wav2vec_manifest.py
def main(args):
    assert args.valid_percent >= 0 and args.valid_percent <= 1.0

    if not os.path.exists(args.dest):
        os.makedirs(args.dest)

    dir_path = os.path.realpath(args.root)
    search_path = os.path.join(dir_path, "**/*." + args.ext)
    rand = random.Random(args.seed)

    valid_f = (
        open(os.path.join(args.dest, "valid.tsv"), "w")
        if args.valid_percent > 0
        else None
    )

    with open(os.path.join(args.dest, "train.tsv"), "w") as train_f:
        print(dir_path, file=train_f)

        if valid_f is not None:
            print(dir_path, file=valid_f)

        for fname in glob.iglob(search_path, recursive=True):
            file_path = os.path.realpath(fname)

            if args.path_must_contain and args.path_must_contain not in file_path:
                continue

            frames = soundfile.info(fname).frames
            dest = train_f if rand.random() > args.valid_percent else valid_f
            print(
                "{}\t{}".format(os.path.relpath(file_path, dir_path), frames), file=dest
            )
    if valid_f is not None:
        valid_f.close()

 

위 코드를 살펴보면,

  • train.tsv 와 valid.tsv 에 frames 정보를 작성한다.
  • 따라서 train.tsv 와 valid.tsv 를 열어보면, filename.wav (파일이름) 과 n_frames (프레임 개수) 이 들어있다.

 

train.tsv, valid.tsv 파일 생성하기

sudo python3 examples/wav2vec/wav2vec_manifest.py /data2/haeyoung/librispeech/LibriSpeech/train-clean-100/ --dest /data2/haeyoung/wav2vec_example/manifest/ --ext flac --valid-percent 0.01
  • 이제 실제로 위의 코드를 사용해 manifest 파일 생성해보기
  • 이렇게 해서 생성된 train.tsv 와 valid.tsv 의 manifest 파일은 main() 의 입력으로 들어간다.
  • 위의 코드를 실행하면 지정해준 입력 데이터 waveform 저장 경로인 '/data2/haeyoung/librispeech/LibriSpeech/train-clean-100/' 에서 지정해준 저장 경로인 '/data2/haeyoung/wav2vec_example/manifest' 경로에 'train.tsv' 와 'valid.tsv' 파일을 만듦. 
  • manifest 파일은 아래 사진과 같이 입력 flac form 으로 넣어준 데이터의 파일 이름과 해당 음성 파일의 프레임 개수  pair 로 저장되어있음

valid.tsv
train.tsv

 

 

 Reference