그런거 없음? 없지? 너무 슬프다.










 그럼 뭐다? 목마른 놈이 우물 파야지.



 아직 완성된 것은 아니지만 지금 짜고 있는 코드는 크게 세 단계를 거침


 1. 영상에서 대사가 있는 프레임을 찾아 중복되지 않게 저장 (직접 코딩 해야 하는 부분)

 2. 대사가 있는 프레임들에서 대사 부분만 모아서 중문 추출 (구글이 해주는 부분)

 3. 얻은 중문을 번역 (네이버가 해주는 부분)


 저 ~가 해주는 부분은 API를 사용한다는 의미인데 쉽게 표현하면 일감을 외주로 주고 결과를 받아온다는 의미임.


 스토리 영상은 지금은 스토리 진행을 오토로 놓고 느릿느릿 하게 진행되는 영상으로 테스트를 하고 있음.

 영상을 입력해서 프레임 하나하나 알고리즘을 돌려서 적절한 프레임들을 거르고 있음.

 

 먼저 명일방주에서 스토리 대사가 어떻게 출력되는지를 생각해보자.

 일단 배경 이미지가 있고, 캐릭터의 스프라이트 이미지가 올라오고, 대사가 있는 부분은 그 위에 반투명한 검은색 배경이 올라오고 그 위에 흰색으로 대사가 출력이 되는 구조임.

 그리고 흰색의 한자를 마치 타자 치듯이 한 글자씩 생겼다가 다음 대사가 나올 때는 모두 사라졌다가 다시 한 글자씩 나옴.

 모두가 아는 방식임. 


 먼저 프레임을 순서대로 가져와서 가져 올 때 마다 이 프레임의 픽셀들 중에 밝가 50 미만인 픽셀이 있거나 205 이상인 픽셀이 있는 친구들만 1차로 거름.

 밝기는 해당 픽셀의 BGR 값을 모두 합해서 3으로 나눈 값임.

 RGB는 들어봤는데 BGR은 처음 듣는다는 사람도 있을텐데 같은 형식인데 RGB의 빨초파 순서를 파초빨로 바꾼 것 뿐임. 

 왜 저런 형식을 쓰는지는 나도 모르지만 아무튼 Python의 이미지 및 영상 처리 라이브러리인 Opencv가 저런 형식을 기본으로 사용해서 저걸 쓰는 거임

 이렇게 걸러진 친구들은 대사가 있을 가능성이 있는 친구들임.

 아니 밝기는 0~255가 나올 텐데 50 205로 나누는건 너무 널널하겠다고 생각할 수도 있겠지만 놀랍게도 알고리즘은 그렇지 않다고 주장을 함.

 반투명한 배경에 대사가 올라오는 것이 문제인데 정확히는 반투명한 검은색 그라데이션이 적용된 배경이지.

 그래서 흰색은 몰라도 저 반투명한 부분 때문에 검은색은 꽤 널널하게 유격을 잡아주는 것이 속이 편함.


 그 다음에는 해당 프레임의 대사가 위치하는 부분을 조금만 잘라서 그 부분에서 흰색 비스무리한 픽셀들만 남겨서 밝기들을 모두 더하고 그 값을 저장함. 

 흰색 비스무리한 픽셀은 위의 정의를 그대로 이용하되 조건을 하나 추가해서 BGR 값의 최대 최소의 차이가 특정구간에 들어오는 것만 남기기로 했음.

 내가 할 때는 일단 10으로 정의했음. 

 그럼 이 값은 대사의 개수에 비례해서 오르내릴 것임.

 대사는 흰색이고 나는 흰색 픽셀의 개수를 센 것과 다름없으니까.

 

 여기가 가장 중요한 부분인데 이렇게 계산된 값을 이전의 값과 비교를 함.

 그랬을 때 만약에 내가 이전보다 작아졌다면 대사가 감소했다고 유추할 수 있음.

 스토리 영상에서 대사가 감소하는 부분은 딱 하나 밖에 없음. 

 한 대사가 완료되고 다음 대사가 출력될 때임.

 따라서 이전 프레임은 모든 대사가 출력이 완료 된 시점이라는 것이라고 예상할 수 있음.


 이제 이전 프레임이 마지막으로 검은색 배경이 있는지 다시 확인을 함.

 이번에는 특정 두 픽셀의 값으로 해당 값이 검은색 영역에 들어오는지 확인을 하고 해당 프레임을 저장함.


 마지막으로 이건 오토로 놓은 스토리를 촬영할 때는 상관이 없는데 만일의 사태를 대비해서 연속으로 프레임을 저장하지 못 하도록 조건문을 하나 더 걸음. 

 대사가 나오는 방식을 생각해 보면 절대로 연속된 프레임이 내가 원하는 결과일 리가 없기 때문임.

 

 이렇게 해서 대사만 나온 부분을 10장씩 묶어서 저장함.



 이런식으로


 문제가 있다면 이렇게 해도 일부 대사들이 누락이 된다는 점임. 

 알고리즘을 여러 차례 고치고 변수들의 값들도 조절해 보았지만 현재의 방식이 최선이지만 아직도 부족함.


 당연한 이야기지만 영상의 길이가 길수록 프레임을 추출하는데 더 많은 시간이 필요함. 

 스토리 안 보고 그냥 넘길 때처럼 그냥 탭을 다다다다 해 놓은 영상으로도 테스트를 해 보고 있기는 함.

사실 알고리즘을 생각해 보면 이렇게 해도 별다른 차이 없이 정상적으로 잘 될것 같지만 알고리즘은 그렇지 않다고 주장하고 있음.

 더 많은 대사들을 추출하지 못하기 때문에 일단은 보류중인 상태임.


 지금 생각으로는 Pytorch라는 라이브러리를 이용해서 간단하게 기계학습을 시켜서 대사 이미지들을 걸러내야겠다고 생각중임. 

 근데 이건 또 내가 해본적이 없어서 헤딩을 해야 하기 때문에 언제쯤 결과가 나올 건지 잘 모르겠음.


 어쨌든 이렇게 모은 대사를 구글보고 처리해 달라고 하면 이렇게 일을 해온다.



 역시 구글이다.

 순서가 조금 꼬였기는 한데 글자 단위로는 정확히 인식을 하는 듯 싶다.


 사실 여기서 번역까지 구글에다 맡기고 싶기는 했지만 최종 결과는 한글이 되어야 한다는 점과 한 군데에서 너무 많이 API 사용 요청을 하면 무료 사용 횟수를 초과할 우려가 있기 때문에 파파고를 이용하기로 함.


 순서가 꼬인 것을 다듬는 것도 코드를 짜야겠지만 일단은 급한대로 내가 직접 교정하고 파파고에 처리를 해 달라고 했음.


极境 : 喂喂,喂喂喂,接一下啊?总不能又不接通讯吧? 

极境 : 喂?啊,唉唉!听到了听到了。

极境 : 哎,你总算接了

极境 : 你现在应该已经到那边了吧?怎么样,汐斯塔如何?

极境 : 我听博士说,那边热得随时有人会晕倒在大街上,然后被免费的啤酒浇醒,是不是真的?

极境 : 哎对了,这次的音乐节都来了哪些名人?大帝是不是要来?

极境 : 哎,你见到日落即逝的成员了吗,我都用她们的曲子做背景音乐,你听这首一- 

棘刺 : 有事直说,没事的话我挂了。

极境 : 等下等下等下,别这样!

极境 : 有事有事,我还有事没说完,别挂兄弟!


 이렇게 다듬어서

 중국어 번체를 한글로 번역을 해 달라고 요청하면.


극경 : 야야야, 야야야야, 야야?아무래도 또 연락 안 할 수 없지 않니? 극경 : 여보세요? 아, 에라!들었어. 극경 : 아, 이제야 겨우 극경을 잇네 : 넌 지금 이미 저쪽에 도착했겠지?시스타는 어때? 극경: 박사님께서 그러시길, 저쪽에서는 언제든 누군가가 길바닥에 쓰러질 정도로 덥다가 공짜 맥주에 잠에서 깬다고 하셨는데, 정말이야? 극경: 아참, 이번 음악제에는 어떤 명사들이 모였어?대제가 올 것이야? 극경: 아이, 일몰하는 멤버들 봤니? 나는 그녀들의 곡으로 배경음악을 하고 있는데, 이 곡을 들어봐-까칠: 일이 있으면 솔직히 말할게, 괜찮으면 끊을게요. 극경: 이러지 마! 극경: 일이 있어.


 이렇게 반환이 된다.


 극경 : 아, 이제야 겨우 극경을 잇네 : 넌 지금 이미 저쪽에 도착했겠지?


 이 부분을 보면 얘도 일부 순서가 꼬이는 것 같기는 한데 이건 내가 저 대사를 그냥 엔터 없이 통째로 대사들을 입력해서 그렇게 된 것 같음.

 다음부터는 \n (줄바꿈) 을 사이사이에 끼워서 입력을 해야 할 듯.

 저걸 가독성 좋게 좀 고쳐보면


극경 : 야야야, 야야야야, 야야?아무래도 또 연락 안 할 수 없지 않니?

극경 : 여보세요? 아, 에라!들었어.

극경 : 아, 이제야 겨우 극경을 잇네 : 넌 지금 이미 저쪽에 도착했겠지?시스타는 어때?

극경: 박사님께서 그러시길, 저쪽에서는 언제든 누군가가 길바닥에 쓰러질 정도로 덥다가 공짜 맥주에 잠에서 깬다고 하셨는데, 정말이야?

극경: 아참, 이번 음악제에는 어떤 명사들이 모였어?대제가 올 것이야?

극경: 아이, 일몰하는 멤버들 봤니? 나는 그녀들의 곡으로 배경음악을 하고 있는데, 이 곡을 들어봐-

까칠: 일이 있으면 솔직히 말할게, 괜찮으면 끊을게요.

극경: 이러지 마!

극경: 일이 있어.


 대충 이런 느낌이 될 것임.

 중문가 한글이 번갈아가면서 나오도록 하는 것이 최종적으로 내가 원하는 결과임.

 아래건 그냥 이해를 돕기 위해서 내가 직접 타이핑 한거지 아직은 코드가 만들어주지 않음.


极境 : 喂喂,喂喂喂,接一下啊?总不能又不接通讯吧? 

극경 : 야야야, 야야야야, 야야?아무래도 또 연락 안 할 수 없지 않니?

极境 : 喂?啊,唉唉!听到了听到了。

극경 : 여보세요? 아, 에라!들었어.

极境 : 哎,你总算接了

极境 : 你现在应该已经到那边了吧?怎么样,汐斯塔如何?

극경 : 아, 이제야 겨우 극경을 잇네 : 넌 지금 이미 저쪽에 도착했겠지?시스타는 어때?

极境 : 我听博士说,那边热得随时有人会晕倒在大街上,然后被免费的啤酒浇醒,是不是真的?

극경: 박사님께서 그러시길, 저쪽에서는 언제든 누군가가 길바닥에 쓰러질 정도로 덥다가 공짜 맥주에 잠에서 깬다고 하셨는데, 정말이야?

极境 : 哎对了,这次的音乐节都来了哪些名人?大帝是不是要来?

극경: 아참, 이번 음악제에는 어떤 명사들이 모였어?대제가 올 것이야?

极境 : 哎,你见到日落即逝的成员了吗,我都用她们的曲子做背景音乐,你听这首一- 

극경: 아이, 일몰하는 멤버들 봤니? 나는 그녀들의 곡으로 배경음악을 하고 있는데, 이 곡을 들어봐-

棘刺 : 有事直说,没事的话我挂了。

까칠: 일이 있으면 솔직히 말할게, 괜찮으면 끊을게요.

极境 : 等下等下等下,别这样!

극경: 이러지 마!

极境 : 有事有事,我还有事没说完,别挂兄弟!

극경: 일이 있어.



 이런 느낌으로.


 물론 이렇게 해도 번역을 하는 사람이 교정을 하는 과정이 당연히 필요함.

 당장 위의 결과만 보더라도 대제는 아마 엠페러일 것이고 ‘일몰하는 멤버들’도 AUS 일 것 같고 ‘시스타’도 시에스타일 것임.

 까칠도 쏜즈 같은데 까칠아 내가 미아내.

 이런 고유명사들의 번역들은 물론이고 어색한 표현들도 교정을 해야 하기 때문에 바야흐로 AI 시대라고 부르는 이 시기에도 무수한 번역가들이 여전히 활동하고 있는 이유임.

 

 

 부족하지만 그래도 이렇게 하면 스토리를 번역하는 사람이나 스토리가 너무 궁금한 사람들에게 도움이 되지 않을까 싶어서 만들어보고 있는 프로그램임.

 마음 같아서는 다음 이벤트 시작하기 전에 완성을 목표로 하고 있는데 될지는 으음...


또 글이 길어졌는데 읽어줘서 고마워!

 그리고 난 전공도 이 쪽이 아닌 프로그래밍 알못인데 프로그래밍 잘알들의 의견은 언제나 환영함