그리하여 데이터 증강기법을 음성에 적용하기로 했고 sox의 tempo와 dither 기능을 사용해 목소리의 속도를 미묘하게 바꿔 데이터를 증강하였다. tempo 0.9 0.85 이 둘만 해도 사람 귀에는 크게 거슬리지 않는 소리가 나오며 1.05배도 큰 차이를 못 느낀다. 하지만 dither 기능으로 이 모든 음성은 Mel Spectrogram이 전혀 다른 녀석이 튀어나오며 데이터 증강효과가 발생한다. (하지만 속도만 조절한것이기에 문장자체는 동일하므로 데이터 증강 효과가 없을지도...)
#!/bin/bash find ./audio/ | while read entry do sox "${entry}" "${entry//.wav/_slow.wav}" -V tempo 0.8 done
위 bash 스크립트를 audio 폴더 밖에서 만들어서 실행하면 _slow가 붙은 wav파일이 추가된다. recognition.json파일은 어차피 이 글을 보고 있는 이상 dataset을 만들줄 알고 있다는 의미일테니 길게 설명하지는 않을 것이다. 해당 json파일에 추가된 slow파일 리스트를 추가하면 데이터 증강이 된다. 이 파일을 수정하면 0.8배 0.9배 1.1배(빠르게 만드는 것은 발음이 뭉개지기 때문에 추천하지 않음)데이터 증강을 할 수있다. 이건 응용하는 사람에 따라 다를 것이다.
본래 데이터셋이 말이 좀 빠르다면 0.7배까지도 문제 없을 것으로 생각된다.
그리하여 어느정도 괜찮은 결과는 나왔지만 문제는 데이터의 증가폭이 너무 큰 나머지 학습속도가 무지막지하게 느려졌다. 하지만 뭐.... 결과만 잘나오면 장땡이지.
이외에도 수정한 hparam을 정리한다. hparam.py를 열면 잔뜩 있는데 여기를 수정하면서 학습튜닝하는것이 노가다지만 의외로 재미있다.
griffin_lim_iters=100, #기본은 60이며 Mel-spectrogram을 Linear-spectrogram으로 바꾸고 이를 다시 시간영역으로 바꾸는 알고리즘. Wavenet이 등장해서 이걸로 대체하기도 하지만 속도면에서 아직 Griffin-Lim이 나에겐 더 맞는 방식이었다. Iters를 100이상으로 늘리니 조금 더 들어줄만한 음성이 나온다.
main_data_greedy_factor = 0.5, main_data = ['./data/monika'], # 이곳에 있는 directory 속에 있는 data는 가중치를 'main_data_greedy_factor' 만큼 더 준다.
이 파라미터는 어느 목소리를 메인으로 할 것인가를 결정한다. Multi Speaker 는 말이좋아 multi-speaker지 엄밀히 말해서 부족한 데이터를 대신해 메인이 되는 것을 대량의 데이터가 도와주는 것에 가깝다. greedy_factor를 많이 주면 많이 줄 수록 메인 데이터 위주로 학습을 이뤄지며 보조데이터셋의 학습속도는 떨어진다. 적절한 값을 찾지 않으면 모두 학습이 느려지는 결과를 초래한다. 대신 Overfitting은 잘 이뤄지지 않는다.
silence_threshold = 1, trim_silence = True, #Whether to clip silence in Audio (at beginning and end of audio only, not the middle) 기본은 0인데 무음부분을 삭제한다. 앞뒤의 무음만 삭제하므로 학습효과를 올려주는 효과가 있다.
Nvidia의 논문에 따르면 앞뒤에 무음이 있으면 Attention이 잘 잡히지 않아 학습속도가 떨어진다고 한다.
일단 이 정도로 파라미터를 수정하고 돌리니 1시간 음성을 3시간으로 뻥튀기 하고 200k STEP이 돌아가는 와중에도 attention은 아직 제대로 안 잡힌다. 그런데 조금씩조금씩 잡혀가는게 1000k쯤되면 문제 없을 듯.
뭔가 300k부터 align이 안 잡히는 것이 보인다. 이건 문제가 있다. 역시 dataset이 문제 아닐까 싶은데 자세히 보니 내 데이터는 stereo로 되어있었다. 혹시 이건가...?
하지만 벡터이미지를 만드는 것에는 Adobe Illustrator를 제외하면 이것밖에 없다고 해도 과언이 아닙니다.
아니면 CAD를 쓰는 방법도 있기는 한데 애초에 CAD는 그림그리라고 만든것이 아니라서 Spliine 처리하다보면 빡칩니다.
그리고 어차피 대부분 벡터 이미지 쓰는 곳이면 *.ai파일 아니면 *.svg인데 SVG야 잉크스케이프의 네이티브 파일이니 그렇다 치고 ai파일 읽어 들이는 것도 잉크스케이프에서는 문제가 없어서 간단한 작업에는 크게 문제가없습니다.
그래서 잉크스케이프가 잘 쓰이는 곳이 있습니다.
보통 회사 로고들은 ai파일로 제공합니다. 하지만 그 로고를 도면에 넣으려면 어찌 되었든 AutoCAD형식으로 바꿔야 합니다. (LibreCAD는 PDF형태로 된 것을 바로 읽는다고 하지만 그것도 완벽하지 않습니다.) 특히 공개된 포맷인 DXF가 여기저기 편리합니다. 그래서 잉크스케이프로 ai파일을 읽은 다음 DXF로 변환해서 넣으면 도면에 깔끔하게 들어가지요.
그런데 회사에서 쓰기 위해 잉크스케이프 1.0을 쓰던 도중에 ai나 PDF로 만든 DXF가 오류나더군요. AutoCAD에서 읽히지가 않아서 LibreCAD로도 해봤는데 마찬가지로 오류가 났습니다.
방법을 몰라서 이리저리 옵션을 바꾸면서 수많은 오류를 경험하고 그냥 잉크스케이프 버전을 0.92로 낮추니까 잘 되네요.
그냥 ai파일을 잉크스케이프로 읽은 다음에 dxf형태로 변환하는 것으로도 아무 문제가 없습니다.
아무래도 동봉된 Python이 문제된것이 아닐까 싶은데 잉크스케이프 0.92버전은 Python2.7을 사용하고 이후 버전은 Python3를 사용합니다. 그리고 저는 Python3을 버전별로 깔아두고 쓰고 있지요. (32비트, 64비트, 3.6 3.7 3.8...) 이게 원인일 가능성이 매우 높습니다.
리눅스야 시스템에 설치된 Python을 적극 활용하게 패키징을 하니 문제가 없지만 (정 안 되면 버전과 관련없이 쓸 수 있는 SNAP이 있지요.) 윈도우는 시스템에 Python을 추가로 설치하다보니 기존에 설치된 Python과 충돌이 난 듯 합니다.
예로부터 오픈소스 삼대장은 윈도우에서 성능이 그닥 잘 안나오긴 했는데 이번에 또 한번 실감하네요.
실제로 미러링임에도 딜레이가 적었으며 디버그 모드를 활성화 해서 PC를 기억해두면 연결후에 바로 화면이 뜨는 등 매우 편리한 프로그램이었습니다.
그런데 사용하고 있는 PC가 아니라 오래된 랩탑에 scrcpy만 설치해서 필요에 따라 스마트폰 화면을 띄우는 독으로 만들면 어떨까라는 생각을 했습니다.
비슷한것으로 삼성Dex가 있고 더 옛날로 돌아가면 모토로라의 아트릭스가 있겠네요.
일단 Dex나 아트릭스나 있으면 좋겠지만 삼성 휴대폰이 아니더라도 넓은 화면으로 스마트폰을 쓰고 싶은 사람들도 있을 것이고 외부 모니터를 지원하지 않는 휴대폰도 있을 것이며 때에 따라서는 HDMI모니터 대신 오래되서 버려진 랩탑을 사용하는 또다른 방법이 될 수도 있겠다는 생각을 했습니다.
소스가 올라온지 2년 정도 되긴 했지만 제가 fork해서 일단 필요하면 계속 발전 시킬까 생각은 하고 있습니다. 기존 프로젝트에서 Requirement만 일단 모아놓고 추후에 가능하면 Tensorflow 2.x 로 가능할지 찾아보고 있습니다. 물론 제 성격상 언제 할 수 있을지 아무도 모릅니다.
3. KSS 데이터셋이라는 것이 있습니다. 한국어 음성 딥러닝을 공부하는 데에 있어서 정말 눈물나게 고마운 데이터입니다. 어떤 성우분인지 모르지만 12시간 분량의 문장을 녹음해 주었습니다.
분명 이름은 쿠키샵인데 쿠키는 절대로 안 파는 경영게임 "쿠키샵"입니다. 그런데 이거 정말 오래된 게임인데 지금해도 꽤 난이도가 있습니다. RPG요소가 같이 섞여 있다보니 전투도 치뤄야하고 손님이 오면 후다다닥 처리도 해야하고 할일이 엄청 많습니다. 이걸로 마우스를 꽤나 망가뜨린 경우가 많다고 하네요.
단 하나... 시디롬 인식이 잘 안 되서 gCDemu를 설치한 후에 gCdemu에서 iso 이미지를 마운트 했습니다.
이전에 프린세스 메이커3때도 그랬지만 이 당시에는 시디롬을 잘 활용했었습니다. 덕분에 시디가 없으면 안 돌아가는 경우가 많았습니다. 그런데 쿠키샵은 일단 시디롬이라고 인식되기만 하면 어찌되었든 돌아가서 복제방지가 허술한 축에 속합니다. 그리고 640x480으로 돌리니 상당히 눈이 아프네요. 이미 회사가 망해버려서 다시 리마스터링 한다거나 할 수도 없겠지요.