옆동네에 한번 질문글로 올렸었지만
팬박스 긁어서 워드로 저장하는 프로그램이랑
그걸 AI 한테 번역시키는 프로그램을 AI 시켜서 만들어봤는데
얼추 결과물이 나온것 같아서 올려봄
*주의
중간중간 일본어가 삽입되어 있을 수 있음
효과음은 최대한 일본어 발음대로 번역하라곤 했는데 AI가 잘 안지키는 경우가 많음
여러 모델이 섞어서 사용한지라(제미니 1.5 pro, 2.0 flash, 1.5 flash) 번역퀄이 들쑥날쑥 할 수 있음
그 밖에 이상한거 있을 수 있는데 제보해주면 감사
프로그램 자체는 안올릴거 같음
아니 그보단 올릴게 못됌
공유할 걸 상정하지 않고 당장 돌아가는 기능 구현에만 집중한거라
프로그램으로서의 완성도나... 결정적으로 다른 환경에서의 동작을 보장하지 못함
그걸 다듬을만한 실력이나 의지도 없고
링크: aHR0cHM6Ly9raW8uYWMvYy9keTBVY0dUZHgySkxyNmJvQnV6NUti
약 2주 만료
비번 여기 국룰
9/21 재업
이하 밑으론 개발 후기? 일기? 여튼 그런거니 진짜로 안봐도 됌
내가 어떻게 했다는걸 그래도 말해두곤 싶어서..
팬박스 스크래퍼
-> 로그인 하고 작가랑 페이지 입력하면 알아서 긁어서 워드 파일로 저장하는 툴
사이트 구조 설명해주고, HTML 코드도 던져주면서 클로드/제미니랑 씨름해서 만듬
가장 중요하게 생각했던건 이미지랑, 형식 유지
특히 이미지는 해당 페이지에서 보이는 압축된 jpeg가 아니라, 한번 눌러서 원본 사이즈로 보기 눌러서 나오는 원본 png 파일을 저장하도록 했음
이 이미지들이 본문 내의 알맞은 위치에 들어가는 것도 신경썼던 부분
크기 조정은 좀 고치려다 만 부분인데, 아무래도 원본이 들어가다보니 왠만하면 한 페이지보다 더 커져서리
걍 더 크게 보려고 맞춤으로 넣었음
형식은, 특정 작가의 경우 글씨 굵기랑 크기를 연출용으로 자주 쓰는데
그걸 단순 txt 파일로 옮기면 다 죽어버리는게 아쉬워서...
애초에 word로 옮길 생각도 그래서 한거
처음엔 문장 하나에 한가지 형식만 적용되게 만들었다가
문장 하나에 여러개 있는 경우를 확인해서 또 그거에 대응되게 고침
또 애먹었던게, 팬박스에서 글이 써진 방식이 좀 다른데,
그냥 하나의 블록 안에 내용 전체를 다 때려박는 경우와
문장마다 데이터 블록으로 나눠진 경우가 있었음
shift 엔터랑 그냥 엔터의 차이라고 해야하나
여튼 그 두개의 경우에 다 대응하게 했음
아직 또 뭔가 경우의 수가 빠져있을 수도 있는데 슈발 모르겠다
전자의 경우 워드에도 실제로 shift 엔터로 저장됐는데
문제는 다음에 있는 번역 프로그램의 청크 분할 시스템에서 저 shift 엔터를 문단이 나눠졌다고 인식하지를 못했음
난 그래서 번역 프로그램 쪽에서 shift 엔터까지 알아보게 하려고 한참 씨름을 했었는데...
발상의 전환으로 그냥 스크래퍼에서 그걸 죄다 그냥 엔터로 바꾸게 하니깐 의외로 쉽게 해결되더라
어차피 우리가 보는건 둘다 줄넘김이니깐 차이는 없거든
AI 워드 번역기
-> word 파일을 넣으면 AI 한테 번역 시켜주는 프로그램
요건 만드는데 제미니만 사용함. 클로드는 대화 제한 때문에..
사실 비슷한 식으로 txt파일을 번역해주는 노벨티라는 프로그램을 거의 그대로 참고해서 만들었는데,
수많은 마개조를 거친 끝에 이젠 원본과 전혀 다른 놈이 되어 버린 것 같음...
청크 분할 방식 변경 -> 원본이 지정한 토큰과 동일한 위치에서 청크를 나누는걸, 문장의 연속성을 생각해서 문장 단위에서 나누도록 했음
쉽게 말해 대충 지정한 토큰수의 얼추 근처에 있는 \n을 기준으로 나누는 것
진짜로 잘 나눠서 보내는걸까? 잘 모름. 근데 통신내역 보면 얼추 잘 되는듯?
이미지, 글자 형식 유지
이것도 가장 신경썼던 부분
특히 이미지가 있으면 일단 청크를 끊고 이미지를 청크로 처리하고 다음 청크로 넘어가게 했고
글자 형식 이게 가장 힘들었는데
제일 문제가 뭐냐면 ai가 번역본을 줄 때 그야말로 지좆대로 준다는거임
지 맘대로 문장을 이어붙이거나, 없는 빈 줄을 끼워 넣는다거나.. 반대로 빼거나.. 원문을 넣는다거나
해결 방식으로, 일단 청크를 처리 할 때 원문의 문장/빈 줄의 순서를 기억하고 형식이 어떤 순서로 있는지 기억하게 함
번역이 완료되면 그 순서를 비교해서 원본과 맞도록 빈 줄을 추가하거나 함
그 다음에 형식을 기억해놨던 순서대로 입히게 했음
이걸로도 못잡는다? 그건 어쩔 수 없음
그런데 문장 하나에 형식이 여러개 있는 경우는?
AI는 자꾸 형식 코드까지 API에 던지자고 제안했음
ㅅㅂ 그걸 허용할 리가 없잖아 안그래도 AI가 좆대로 형식 바꾸는것 때문에 고생하고 있는데
해결방법은 문장 중간에 형식을 발견하면 그 경계에 일단 \n을 넣고
그렇게 임시로 넣은 \n을 미리 기억해둔 다음
AI한테 던지고 받은 번역물을 위에 써둔 빈 줄 동기화를 한 다음에 형식을 입힘
그 다음에 임시로 넣어둔 \n을 빼는 방식으로 했음
여기서 가장 힘들었던건 AI가 문제에 대한 적합한 해결 방식을 도저히 떠올리질 못했다는것...
내가 해결 방안을 설계해서 이렇게 이렇게 하라고 예시까지 들먹이면서 떠먹여 줘야 했음
프롬프트
프리필을 위해서 사전 사후 프롬프트를 나눠놨음
제대로 먹히고 있는걸까? "몰루"
뭐 전송 로그를 보면 일단 순서는 맞게 가고 있음
용어집
이거도 사전 사후 나눠져 있지만 둘이 동작이 다름
하나는 ai에 같이 보내짐
하나는 워드 파일 만들 때 사용됨
이상하게 나오는 여러 단어를 조정할 수 있음
보통 이름이나 효과음 등에 쓰는데
애초에 번역은 ai 시키고 난 감상만 하고 싶은데 등장인물 이름을 미리 알 수가 없으니 초큼 사후약방문 같은 느낌
로그
과정을 보기 쉽게 바꿨는데..
사실상 개발 중에 어느 부분에서 문제인지 알기 위해 추가한 것들이 많음
api한테 정확히 뭔 내용이 전송되는지에 대한 로그도 따로 저장됨(휘발성)
API, 검열 등
AI 십새들 야설 넣으면 자꾸 검열을 해댐
검열된 부분만 내가 나중에 처리하는 방법이 있겠지만..
난 '딸깍'을 하고 싶어서 만든거라고~
어떻게 할까?
더 검열이 약한 모델을 쓴다? 사실상 공짜 수준인 제미니 외엔 소설같은 긴거 돌리기엔 돈이 너무 많이 듬
심지어 클로드도 너무 노골적인 야설 넣으면 검열 뱉어댐
프롬프트를 깎는다? 확실하지도 않고 너무 시행착오가 오래걸림
그냥 될때까지 시키면 안댐? -> 채택
기본적으로 주APi와 보조 API 두개를 씀
일단 청크를 주 API로 번역해
실패해? 그러면 두개로 나눠서 한번 더 돌려
실패해? 그러면 보조 API 1번 써
실패해? 그러면 보조 API 2번 써
그래도 실패해???
어 이번엔 3개로 나눌거야~
3개로 나누고 다시 위와같은 API 뺑뺑이를 돌림
한번 이라도 성공하면 챙겨가는거
만약 그거 마저도 실패한다?
그 실패한 내용만 다른 word 파일로 빼고 그 부분엔 표시를 남김
이건 내가 직접 처리하면 되는거
사실 첫 단계에서도 보조 API로 돌릴 수 있지만 일부러 이렇게 했음
나눠서 하면 일부분이라도 주 API로 번역될 가능성이 높거든
아무래도 주 API가 성능은 더 좋은걸 쓸거니...
쨌든 이런 무식한 방법을 쓰니 사실상 제미니 외엔 테스트도 안됐음
심지어 버전도 높은걸 못씀 추론때문인지 뭔지 여튼 검열이 너무 심해서
그래서 API는 1.5 pro 2.0 flash 1.5 flash를 차례로 사용함
아무리 버전이 1.5여도 pro 번역이 훨 좋긴 하드라
실패 판단
원문이 30% 넘어간 경우
하나의 반복 문자가 200자를 초과한 경우 (출력 폭주)
MAX Token에 걸리는 경우 -> 기본적으로 이건 여유있게 주고 돌리고 있어서 넘기면 그냥 AI가 병신짓 한거임
검열 출력하는 경우 등
이런경우에 전부 실패로 판정하고 다시 돌리게 했음
여튼 끝
이제야 나도 좀 감상을 할건데
난 요걸 epub로 변환하든가 해서 모바일로 볼까 생각하고 있음
추천 받았던 다른 작가도 팍팍 해보고 싶긴 한데 아무래도 내 돈이 나가는지라 조금 생각중
픽시브도 긁고 싶은데 너무 귀찮타
이제 그만 좀 ai랑 씨름하고 시픔
