Spaces:
Sleeping
Sleeping
#! /usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# Copyright 2020 Imperial College London (Pingchuan Ma) | |
# Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) | |
"""Transforms mp4 audio to npz. Code has strong assumptions on the dataset organization!""" | |
import os | |
import librosa # 음원 데이터 분석 라이브러리 | |
import argparse # 명령행 인자를 파싱해주는 모듈 | |
from utils import * # utils.py 모듈에 있는 모든 함수(read_txt_lines(), save2npz(), read_video()) 불러오기 | |
# 인자값을 받아서 처리하는 함수 | |
def load_args(default_config=None): | |
# 인자값을 받을 수 있는 인스턴스 생성 | |
parser = argparse.ArgumentParser(description='Extract Audio Waveforms') | |
# 입력받을 인자값 등록 | |
# -- utils | |
parser.add_argument('--video-direc', default=None, help='raw video directory') | |
parser.add_argument('--filename-path', default='./vietnamese_detected_face_30.csv', help='list of detected video and its subject ID') | |
parser.add_argument('--save-direc', default=None, help='the directory of saving audio waveforms (.npz)') | |
# -- test set only | |
parser.add_argument('--testset-only', default=False, action='store_true', help='process testing set only') | |
# 입력받은 인자값을 args에 저장 (type: namespace) | |
args = parser.parse_args() | |
return args | |
args = load_args() # args 파싱 및 로드 | |
lines = open(args.filename_path).read().splitlines() # 문자열을 '\m' 기준으로 쪼갠 후 list 생성 | |
lines = list(filter(lambda x: 'test' == x.split('/')[-2], lines)) if args.testset_only else lines # args.testset_only 값이 있다면 test 폴더 속 파일명만 불러와서 list 생성, 아니라면 원래 lines 그대로 값 유지 | |
# lines 개수만큼 반복문 실행 | |
for filename_idx, line in enumerate(lines): | |
# 파일명, 사람id | |
filename, person_id = line.split(',') | |
print('idx: {} \tProcessing.\t{}'.format(filename_idx, filename)) # 파일 인덱스번호, 파일명 출력 | |
video_pathname = os.path.join(args.video_direc, filename+'.mp4') # 영상디렉토리 + 파일명.mp4 | |
dst_pathname = os.path.join( args.save_direc, filename+'.npz') # 저장디렉토리 + 파일명.npz | |
# 파일이 있는지 확인, 없으면 AssertionError 메시지를 띄움 | |
assert os.path.isfile(video_pathname), "File does not exist. Path input: {}".format(video_pathname) # 원하는 조건의 변수값을 보증하기 위해 사용 | |
# wav 파일 읽는 라이브러리: librosa | |
# librosa 로 데이터를 읽으면 데이터 범위가 [-1,1]로 정규화됨 | |
# librosa 입력에서 sr=None 으로 지정하지 않고 임의의 sample_rate를 설정하면 load할 때 resampling 수행함 | |
data = librosa.load(video_pathname, sr=16000)[0][-19456:] | |
save2npz(dst_pathname, data=data) # librosa 로 읽은 데이터를 npz 형식으로 저장 |