Fairseq - Wav2vec 2.0 Pretraining (1) 입력 데이터 준비하기
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 로 저장되어있음