글쓰기에 앞서 프로젝트 진행에 변경사항이 있어서 먼저 말하겠다.
#4-계획 정리에서 다중언어를 지원하는 모델을 사용하여 음성합성을 진행한다고 언급했다.
하지만 계속 생각해본 결과 2가지 정도의 문제점 때문에 다중언어 모델을 포기하게 되었다.
첫 번째는 다중언어를 지원하는 모델의 소스파일이 많이 없어서 선택폭이 좁다는 문제였고,
두 번째는 첫 번째 문제의 연장선으로, 다중언어를 지원하는 모델의 소스파일에서 한글을 지원하는 게 없어서 한글 인식을 위한 코드를 직접 짜야한다는 문제이다.
최대한 빨리 결과를 보고 싶었기에, 다중언어를 지원하지 않는 모델을 선택하게 되었다.
text데이터는 음성의 한국어 음차표기로 제작하였다.
ex) わたし(음성) -> 와타시(한국어 text)
위에서는 다중언어 모델을 포기했다고 했지만, 결과물을 보고 음차 번역으로는 한계가 생긴다면 다중언어 모델을 사용할 생각이다. 물론, 한국어 적용에 필요한 코드도 만들어야겠지만..
---------------------------------------------------------------------------------------------------------------------------------
3-1에서는 음성 데이터를 text값으로 바꾸는 작업을 진행했다.
(음성, text(일본어))데이터 셋을 만들었으니, 이제는 일본어로 구성된 텍스트를 음차 번역을 통해서
한국어로 구성된 텍스트로 변환하는 작업만 거치면 데이터 셋 제작은 끝이 난다.
그런데 문제는... 일본어에서 한국어로 음차 변환하주는 툴이 보이지 않는다...
일본어에서 영어로 음차변환 해주는 라이브러리는 많이 있고, 사용에 편리하다.
내 경우에는 pororo라이브러리를 사용해서 테스트를 해 보았다. 깔끔하게 잘 나왔었다.
(pororo라이브러리를 테스트 해 볼 때는 colab을 사용했다. 이 라이브러리가 이유는 모르겠는데
자꾸 충돌이 일어나서 실행이 안되더라... 근데 colab에서는 오류 없이 깔끔하게 실행돼서 어이없었다.
충돌 이유 찾아보는데 pororo라이브러리가 충돌에서 유명한 편이었음. 다른 사람들도 충돌 많이 일어난다고 댓글 쓰신걸 많이 볼 수 있었음. 통곡의 뽀로로라고 부르더라고요..)
영어에서 한글로 음차변환 해주는 라이브러리 또한 존재한다.
(hangulize였던가...)
하지만 일본어에서 한국어로 음차변환 해주는 라이브러리나 소스코드를 찾지 못했다..
그래서 처음 생각한 방법은
(일본어 --> 영어 --> 한글) 순서대로 pororo라이브러리를 이용하여 일본어를 영어 음차로 번역하고, hangulize라이브러리를 이용하여 영어를 한글 음차로 번역하는 방법이다.
실제로 colab에서 위의 방법을 사용 해 보았는데, 음성 데이터와 최종 음차 번역으로 나온 한글의 매칭이 좀 안 맞았다.
뭐랄까 들어보면 맞는데 조금씩 뒤틀려있는 느낌이 들었다.
ex) わたし(와타시) -> watashi -> 와타쉬
그래서 다른 방법을 찾던 도중
파파고를 보게 되었는데, 파파고를 사용하는 사람이라면 알겠지만 외국어를 입력 칸에 입력하면 밑에 그 외국어를 한국어로 음차 번역해준다.
근데 잘 보면 밑의 음차 번역의 퀄리티가 제법 좋은 걸 알 수 있다.
3-1에서 만든 데이터 몇 개를 넣어보면서 음성과 한국어 음차 번역을 비교해본 결과, 파파고를 사용하면 깔끔한 text음차 번역 데이터를 만들 수 있겠다고 판단했다.
그런데 문제는 저 밑의 음차 번역을 어떻게 사용할 수 있을까?
api를 제공한다면 api를 사용하려고 했다. 그런데 api소개를 보니 음차 번역(transliteration)에 관한 지원은 보이지 않았다.
그리고 여기 가격이 생각보다 많이 비싸다...
3-1에서 stt작업에 필요한 요금은 1달러 근처였는데, 파파고 번역은 최소 단위가 2만 원이다 ㄷㄷ
(물론 이건 음차 번역이 아니라 그냥 번역이지만)
그래서 어떻게 할까 하다가 아이디어가 하나 떠올랐다.
"그냥 저기에 일본어 text데이터를 다 집어넣고, 밑에 한글 음차 번역 텍스트를 들고 와서 쓰면 되지 않을까?"
실제로 회차별로 한 회차의 일본어 text를 다 집어넣으니 다 음차 번역이 되었다. 문제는 데이터와 데이터 사이의 경계가 없어서 그냥 한 뭉텅이의 문자열이 되어버린다는 것이다.
경계를 구분 짓기 위해 #이나 ?같은 특수기호를 사용하려고 했지만 음차 번역에서는 특수문자는 그냥 무시해버렸다.
그래서 어떻게 할까 고민을 하다가
번역기에 입력하는 언어가 일본어라는 것에서 힌트를 얻어서, 일본어에는 없는 단어를 각각의 일본어 데이터의 끝부분에 추가하고 파파고에 집어넣는 방법을 생각하게 되었다.
그다음 이 문장들을 전부 복사하고, 파파고에 집어넣는다.
나는 '선풍기'라는 단어를 집어넣었는데, 선풍기를 집어넣으면 '손푼기'라고 음차 번역 칸에 번역이 된다.
그리고 나온 문자열 덩어리를 '손푼기'를 기준으로 자르면 끝이다.
아래는 이 작업에서 사용한 코드이다.
(3-1에서의 stt작업으로 만들어진 일본어 text json파일이 있어야 한다. 여기서는 azure_stt.json이 일본어 text json파일)
def split(num):
papago_text = ""
list = papago_text.split("손푼기")
print(list)
print(len(list))
for i in range(len(list)):
print(str(i+1) + list[i])
dic = {}
namelist=[]
# 파일이름 뽑아내는거
with open('azure_stt.json', 'r', encoding='UTF8') as f:
l = json.load(f)
for i in l:
if i.split("_")[0]==str(num):
namelist.append(i)
print(namelist)
with open('kor_text.json', 'r', encoding='UTF8') as f:
dic = json.load(f)
for i in range(len(namelist)):
dic[namelist[i]] = list[i]
with open('kor_text.json', 'w', encoding='UTF8') as f:
json.dump(dic, f, ensure_ascii=False, indent=2)
def alltxt(num):
with open('azure_stt.json', 'r', encoding='UTF8') as f:
l = json.load(f)
for i in l:
if i.split("_")[0] == str(num):
print(l[i] + " 선풍기")
if __name__=='__main__':
alltxt(13)
#split(13)
사용방법을 서술하자면, 우선 alltxt에서 내가 음차 번역하고 싶은 회차를 인수로 전달한다.
alltxt함수 실행을 하면 일본어 text와 뒤에 선택한 단어가 붙어서 출력될 것이다. (split은 일단 주석 처리한다.)
출력된 문자열들을 복사한 후, 파파고에 집어넣는다. (여기서 번역 설정은 일본어 -> 한국어)
그 후 기다리면 밑의 부분에 회색 글자로 한국어 음차 번역이 된 문자열들이 나올 것이다. 그것들을 모두 드래그해서 복사한 후, 위의 소스코드에서 papago_text 변수에 집어넣는다. 그리고 alltxt함수를 주석 처리해주고, split함수 앞의 #을 제거한다. split함수 인자는 앞에서 alltxt에 집어넣은 인수와 같아야 한다.
split함수를 실행시키면, '손푼기'를 기준으로 자르고, 각 데이터의 일본어 text의 한국어 음차 번역 text가 kor_text.json에 저장이 된다.
위의 과정을 반복하면 된다.
솔직히 수작업이 조금 필요하긴 하다.
최대한 자동화를 하고 싶었지만, 배보다 배꼽이 더 커질 것 같았고, 끽해봐야 1 회차하는데 1분도 안 걸리니 그냥 하기로 했다.
(내 경우에는 가끔 list 범위 에러가 날 때가 있었는데, 그 이유는 파파고 음차 번역에서 특정 부분을 음차 번역하지 못했거나 마음대로 생략한 경우이다. 내 경우에는 2번 정도 이런 이슈가 있었는데, 사이에 끼워 넣는 단어를 바꾸는 방법이 해결법이 될 수 있다. 만약 안된다면 직접 생략되는 부분을 찾아야 한다.. 파이팅)
모든 회차에 대해서 위의 작업을 수행하면, kor_text.json파일에는
(wav파일이름 : 한국어 음차 번역 text) 셋이 들어 있을 것이다.
자, 이제 데이터셋 제작은 여기서 끝이다.
이제 학습만이 남았다!
'프로젝트 > 음성합성(tts)' 카테고리의 다른 글
음성 합성 데이터 셋 제작 툴 (0) | 2022.05.19 |
---|---|
캐릭터 보이스 만들기#6-학습 진행 (0) | 2022.05.03 |
캐릭터 보이스 만들기#5-데이터 셋 제작(3-1) (0) | 2022.04.21 |
캐릭터 보이스 만들기#5-데이터 셋 제작(2) (0) | 2022.04.11 |
캐릭터 보이스 만들기#5-데이터 셋 제작(1) (2) | 2022.04.06 |