팀프로젝트 진행 전, 기존 유사 프로젝트에 대한 코드 리뷰를 진행하기로 하였다.
[get_data.py]
우선 해당 프로젝트 내 get_data.py는 데이터 준비 단계에 해당하며, 유튜브에서 음성을 얻어내는 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
chrome_dir = './chromedriver.exe'
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("--get_links", default=False, action="store_true")
parser.add_argument("--get_videos", default=False, action="store_true")
parser.add_argument("--get_texts", default=False, action="store_true")
parser.add_argument("--get_audios", default=False, action="store_true")
parser.add_argument("--labeling", default=False, action="store_true")
parser.add_argument("--get_images", default=False, action="store_true")
args = parser.parse_args()
links_dir = os.path.join(".", "data", "links.csv")
links_videos_dir = os.path.join('.', 'data', 'links_videos.txt')
links_videos_texts_dir = os.path.join('.','data','links_videos_texts.txt')
audios_texts_length_dir = os.path.join('.', 'data', "audios_texts_length_labels.csv")
|
cs |
파이썬 실행파일에 우선 chromedriver을 사용한다.
parser = argparse.ArgumentParser()은 Terminal에서 Python script을 터미널에서 실행할 때 명령어 옵션에 대한 parameter를 python으로 전달할 때 사용하는 방법이다.
ArgumentParser에서 add_argument() 메서드는 옵션 문자열 list, actionk, 명령어 인자수, default, type, help 인자에 대한 설명을 할 수 있습니다. 또한, 변수 args에 parser에 대한 인자값을 추가한다.
os.path.join()이란 경로(path)명 조작에 관한 처리를 모아둔 모듈로써 구현되어 있는 함수이다. 인수에 전달된 2개ㅢ 문자열을 결합하여, 1개의 경로로 할수 있다. 합치면 .\\data\\links.csv로 볼 수 있다. 아래 다른 링크 결합들도 이와 동일한 방법으로 경로를 생성하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
if args.get_links:
print('Get Links')
playlist_urls = ['링크들']
save_playlist_links(playlist_urls, links_dir)
if args.get_videos:
print('Get Videos')
video_dir = os.path.join('.','data','video')
make_dir(video_dir)
df = pd.read_csv(links_dir)
save_videos(df, links_videos_dir)
if args.get_texts:
from crawling import crawling
print('Get Texts')
text_dir = os.path.join('.','data','text')
make_dir(text_dir)
df = pd.read_csv(links_videos_dir)
crawling(df, chrome_dir, links_videos_texts_dir)
if args.get_audios:
print('Get Audios')
audio_dir = os.path.join('.','data','audio')
make_dir(audio_dir)
df = pd.read_csv(links_videos_texts_dir)
save_audios(df, audios_texts_length_dir)
if args.labeling:
print('Labeling')
df = pd.read_csv(audios_texts_length_dir, encoding='ms949')
labeling(df, audios_texts_length_dir)
if args.get_images:
print('Get Images')
wave_to_image(audios_texts_length_dir)
|
cs |
위의 코드는 링크를 가져왔다면 순차적으로, 동영상, 텍스트, 오디오, 라벨링, 이미지를 가져오는 코드들이다.
pd.read_csv(links_dir)는 links_dir에 해당하는 파일을 불러와 읽는다.
crawling(df, chrome_dir, links_videos_texts_dir)는 해당 영상 경로에 대한 텍스트들을 웹 크롤링하는 것이다.
크롤링을 통해 해당 주소의 meta 태그의 내용을 가져올 수 있다.
[audio_label_cliping.ipynb]
해당 코드는 데이터를 음성 클래스 별로 분해하는 단계이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#from utils import make_dir
def make_dir(dir_):
if not os.path.isdir(dir_):
os.mkdir(dir_)
audio_label_clip_dir = os.path.join('.', 'data', 'audio_label_clip')
make_dir(audio_label_clip_dir)
def save(audios, label):
data = pd.DataFrame({
'audios':audio, 'label':label })
data.to_csv(audio_label_clip_dir+'/audio_label_clip.csv', index=False, encoding='euc-kr')
## 레이블링 데이터 위치 : ./data/label
files = []
for file in os.listdir(os.path.join('.', 'data', 'label')):
_, file_id = os.path.split(file)
if file_id.endswith('txt'):
name = file_id.split(".")[0]
if(name not in files):
files.append(name)
|
cs |
os.path.isdir(path)의 경우, path가 존재하는 디렉터리이면 True를 반환한다. 이것은 심볼릭 링크를 따르므로, 같은 경로에 대해 islink()와 isdir()이 모두 참일 수 있습니다.
def save(audios, label) 부분을 보면, DataFrame 객체(audio와 label을 딕셔너리 바인딩)를 생성하여, data 변수에 바인딩한다. 또한, 바인딩한 DataFrame 객체를 csv파일로 내보니고 있다.
파이썬의 os.listdir() 메써드는 지정한 디렉토리 내의 모든 파일과 디렉토리의 리스트(list)를 리턴한다. 파일의 아이디가 "txt"로 끝난다면, "."으로 나누고, files 리스트에 이름들을 추가한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
audio = []
label = []
shi = 0
jon = 0
sha = 0
byoung = 0
background = 0
negative = 0
count = 0
for file in files:
print("file name:" + file)
text = './data/label/' + file + ".txt"
aud = './data/label/' + file + ".wav"
print("read new file")
data = pd.read_csv(text, sep="\t", names=['start', 'end', 'label'])
print(data)
# data.start.astype('float')
# data.end.astype('float')
for i in range(len(data)):
lab = data.label[i]
print(data.start[i], data.end[i], data.label[i])
try:
start = float(data.start[i])
end = float(data.end[i])
except ValueError:
continue
if start >= end:
continue
if np.array(data.label[i])==np.nan:
continue
full_audio = AudioFileClip(aud)
if(lab==10): #shi
name = "shi_" + str(shi)
shi += 1
elif(lab==11): #jon
name = "jon_" + str(jon)
jon += 1
elif(lab==12): #sha
name = "sha_" + str(sha)
sha += 1
elif(lab==13): #byoung
name = "byoung_" + str(byoung)
byoung += 1
elif(lab==9): #background
name = "background_" + str(background)
background+= 1
elif(lab==0): #negative
name = "negative_" + str(negative)
negative += 1
tmp_audio = full_audio.subclip(start, end)
name = os.path.join(audio_label_clip_dir, name + ".wav")
try:
tmp_audio.write_audiofile(name)
except OSError:
print('oserror')
continue
audio.append(name + ".wav")
label.append(int(lab))
print('dd')
count += 1
save(audio, label)
|
cs |
MoviePy를 통해 비디오와 오디오 클립에 대한 클래스 분리를 진행한다.
해당 label 번호에 따라, 이름을 다시 정정하였다.
subclip() 함수는 시작시간과 종료시간 사이에 현재 클립의 내용을 재생하는 클립을 반환한다.
출처: https://github.com/LEEMINJOO/Beeeep--
'AI > Machine Learning&Deep Learning' 카테고리의 다른 글
[CodeReview] NLP_문장 및 단어 유사도 분류 (0) | 2021.10.05 |
---|---|
[CodeReview] 웹크롤링/유틸스 코드리뷰 (0) | 2021.09.24 |
딥러닝챗봇_토크나이징 (0) | 2021.07.27 |
Konlpy를 활용한 한국어 분석 (0) | 2021.07.12 |
Deep Learning_딥러닝을 활용한 분류 예측 (0) | 2021.04.06 |