대체 이것은 무엇인가??? 첨부파일은 다 어디간거야??


가끔 Thunderbird나 기타 이메일 클라이언트를 쓰다보면 첨부파일로 winmail.dat 라는 파일을 받을때가 있습니다. 이건 사실 Microsoft의 규격에 의해 생긴 일로 Outlook 이외의 클라이언트로 Outlook에서 첨부파일을 보낼 때 생기는 일로 쉽게말해서 MS의 농간입니다.(...)


개나소나 Outlook을 쓰고 있지만 아직 이를 잘 활용하는 업체는 0에 가까운 고로(...어떤 회사에서든지 뉴스그룹 같은 것을 쓴 것을 본 적이 한 번도 없습니다.)그냥 기본설정으로 쓰다보니 생긴 폐해입니다.


https://support.mozilla.org/ko/kb/what-winmaildat-attachment


이를 보시면 잘못된 설정에 의해 생긴 폐해인데요. TNEF형태는 MS독점 형태이며 MS만이 사용가능합니다. 물론 이미 역 어셈블해서 분석이 완료되었지만 라이센스의 문제도 있어서 이래저래 문제가 있습니다.


결국 보내는 쪽(Outlook사용자)측에서 TNEF형태를 안 쓰도록 하는 것이 가장 좋지만 우리나라는 알다시피 그렇고 그런 나라(인데다가 관심도 없지요)이기에 TNEF를 그냥 쓰고 있을 겁니다.


일단은, 첨부된 것을 다시 보내달라고 하기는 힘드니(애초에 설정 건드는 것 자체가 고역인 사람들이라...) 잘못 날라온 winmail.dat파일을 열어서 확인하는 것을 알려드리겠습니다.


1. Thunderbird 확장 중 LookOut이란 확장을 쓰자.

위의 링크에보시면 나오는 것이라서 간단합니다만, 지원이 끊기면 답이 없습니다. 하지만 일단 설치해 놓으면 Thunderbird에서 바로 파일을 열 수 있어서 편리합니다.

하지만 제일 좋은 것은 TNEF자체를 사용하지 않는 것!


2. tnef 패키지를 쓰자.

위의 Lookout 확장에서 사용한 코드입니다. MS의 TNEF를 분석해서 만든 프로그램이며 메일에 첨부된 winmail.dat 파일의 암호를 디코딩해줍니다.


sudo apt-get install tnef


위 명령어로 설치하고


tnef winmail.dat


명령으로 디코딩합니다. 하지만 윈도우는......다른 프로그램을 사용합니다.

winmail opener라는 프리웨어를 사용하시면 됩니다. 이건 구글링하면 금방 나옵니다.(...윈도 사용자는 저한테 약간 무관심영역이다보니...)


그나저나 IE전용코드에 이어서 Outlook전용코드라니....이건 진짜 너무합니다. Thunderbird가 점유율이 아직 현저히 낮은 것이 원인인가요?


볼 사람은 아무도 없겠지만 Outlook을 사용하시는 분들께 고합니다.


제발 다른사람들이 요청하면 좀 모두가 볼 수 있는 설정을 사용해주시기 바랍니다. 그동안은 모르고 사용하셨겠지만 웹메일에서도 TNEF 형태는 에러가 납니다. 세상에는 이메일클라이언트가 Outlook만 있는 것이 아니랍니다. 모두에게 평등한 웹이 됩시다.

,

실시간 게임번역기란 물건이 있습니다. Monkey head's OCR Realtime Translator - 이하 Mort (http://www.steambb.com/bbs/board.php?bo_table=gamebb&wr_id=479632) 라는 물건입니다. 기존의 텍스트 후커는 API후킹방식을 주로 이용하여 이루어졌는데요. 이 방법은 그냥 화면에 나오는 문장을 OCR로 읽어서 텍스트를 읽어들입니다. 사실 이는 이전에 VNR(Visual Novel Reader)란 프로그램에서도 지원되는 기능이었지만 이 물건은 워낙 묵직했던데다가 API후킹도 지원되던 탓에 OCR방식은 잘 쓰이지 않았습니다. (모르는 사람도 있습니다.) 그에 비해 Mort는 성능도 괜찮고 그럭저럭 쓸만합니다. 단점이라면 Tesseract의 학습 기능을 어느 정도 쓰지 않았다면 인식률이 개판입니다. Mort는 학습 기능과 함께 이미지 전처리 기능을 넣어서 어느정도 인식률을 올린 듯 합니다. 그럼에도 여전히 엉망이라 Spell Checker 기능까지 우겨넣어서 인식률을 끌어 올려야 하더군요. 


그래도 상당히 좋은 물건인 듯 해서 리눅스에서 돌릴 수 있는지 봤는데...


닷넷 프레임워크를 필요로 합니다. mono로는 실행이 안 됩니다. 그래서 약간의 폭발 이후 비슷한 클론을 하나 만들어 냈습니다.

...물론 대충 만들어서 모양은 별로이며 동일한 Tesseract 엔진이라 인식률은 꽝입니다. 심지어 이미지 전 처리 기능도 없습니다.....(PIL이나 OpenCV를 써서 넣으면 되기는 합니다만...)

적당히 만들어서 Gitjub 정도에 올리면 되지 않을까 생각하고 있습니다. 자신 있게 올리기엔 코드가 더러운게 흠이지만요.(저는 프로그래밍 전공이 아닙니다. 그래서 알고리즘이 최적화 되어있지 않습니다.)


제작 언어는 제작 속도가 더럽게 빠르기로 유명한 Python 2.7입니다.(3.x는 일부 라이브러리 때문에 사용 불가) 그리고 Tkinter와 기타 플랫폼 독립적 라이브러리를 이용했기 때문에 (OSX, Windows, Linux만 되기는 하지만)크로스 플랫폼(!) 입니다. Tesseeract-OCR를 라이브러리 형태가 아니기에 따로 추가 설치 해주셔야 합니다. (하지만 Tesseract-OCR도 각 플랫폼 별 바이너리를 제공하기에 큰 문제는 없습니다.)


Mort에 비하면 UI가 공대 감성입니다. 미리 말씀드리자면 완성된 프로그램도 아니고 그냥 비슷한 기능을 구현한 것입니다. 작동 되면 좋고 아님 마는 겁니다.


구성은 창 2개입니다. 왼쪽 터미널 위에 있는 컨트롤 창과 오른쪽 Scan Area 창 두 개입니다.


우선 캡쳐 하고자 하는 부분을 Scan Area 창으로 가려 버립니다(!) 저 Scan Area 창은 X버튼의 기능을 삭제 했습니다. 때문에 그냥 구역 설정 기능만 갖춘다고 생각하시면 됩니다.


...그리고 Start를 누르면...Scan Area창이 최소화되면서 해당 Area 부분을 캡쳐한 뒤 신나게 OCR로 읽어들입니다. 인식률은????.........아직은 포기하면 편해요. 이미지 전처리 기능을 만들지 않는 이상 인식률을 효과적으로 끌어올리기는 힘들 듯 합니다.


그리고 한국어 번역을 쓰는데 구글 웹 번역기(?)를 씁니다. goslate란 모듈이 이를 지원합니다. (영어 → 한국어) 보다는 (영어 → 일어 →한국어)가 더 번역율이 높다고 들어서 한번 해봤는데 구어체는 별 차이가 없습니다. 그래서 그냥 (영어 → 한국어) 로 처리 중입니다.


그냥 한번 어떻게 되는지 구경이나 해봅시다.



번역을 하고 싶은 부분을 찾아서 Scan Area 창을 신나게 가지고 놀자


일단 게임을 실행하고 작성한 파이썬 스크립트를 실행합니다. 항상 위 옵션으로 걸려있으므로 Scan Area 창은 절대로 게임 창 뒤로 가지 않습니다.


번역을 하고자 하는 구역을 Scan Area 창으로 가려버리자! 추후 여기에 번역문을 띄울까 하는 생각도 해봤지만...그건 별로


번역을 하고자 하는 부분 위에 창을 올려놓고 조절합니다. 그냥 가리면 됩니다. 참 쉽죠?


그리고 Start를 하면??? Scan Area 창이 자동으로 최소화 됩니다. 그리고 터미널에 보면!!!


왼쪽에 터미널을 주목하자 아직 출력 창을 안 만들었기에 터미널에 번역문을 대신 띄우고 있다. 참으로 공대감성이 아닐 수 없다.

....번역기의 성능은 기대 안 하는 것이 좋습니다. 어차피 구글 번역기이니까요. 심지어 잘 못 인식된 글자도 있네요. 저것은 이미지 전 처리 기능과 Spell Checker를 추가로 붙여서 보완해야 합니다. 하지만 이를 리눅스로 구현했다는 데에 의의가 있습니다. (그런데 테스트에 쓴 게임은 Windows용 Wine 구동 게임...)


이걸 조금만 더 다듬으면 훌륭한 크로스 플랫폼 실시간 번역기가 될 수 있을 듯한데 모양도 별로고 조금 공대 감성을 탈피해야 합니다. (범인은 Tkinter) 하지만 3일만에 만든 것 치고는 그럭저럭 괜찮네요. 이제 OCR된 문자열 및 번역문 츨력창을 따로 만들고 이미지 전 처리 기능을 넣고 Hunspell- Spell Checker (http://hunspell.sourceforge.net/)을 적용하면 인식률을 엄청 끌어 올릴 수 있을 것 같은데 뭐....언젠가는 하겠지요 뭐...

,

Tesseract는 구글이 만든 OCR엔진입니다. 오픈소스라 무료로 이용이 가능합니다. 다만 사용하기 애매하게 만들어졌다는 단점이 있습니다만, Python으로 이용 가능하도록 누군가가 잘 Wrapper를 만들었습니다. 동작하는거 봐서는 그냥 /tmp에다가 넣어서 뿌리는 듯 하지만요.


제가 사용한 것은 pytesseract(https://github.com/madmaze/pytesseract/)란 놈으로 그냥 시스템에 설치된 tesseract를 실행해주는 간단한 스크립트입니다. 대신 간단한 만큼 /tmp를 어마어마하게 써 댑니다. 그냥 tmpfs로 마운트해서 써야겠습니다. python-tesseract(https://code.google.com/p/python-tesseract/)를 쓰면 좀 나을 것 같기는 한데 라이브러리 방식에 고생을 할 것 같으니 일단은 넘어갑시다.


대충 아래와 같이 쓰면 되기 때문에 간단하게 OCR을 쓸 수 있습니다.

우분투에선

sudo apt-get install tesseract-ocr

위 명령어로 OCR엔진을 설치할 수 있구요.(어쨌건 해당 엔진이 설치되어 있어야 합니다.)


import pytesseract
try: import Image except ImportError: from PIL import Image
print(pytesseract.image_to_string(Image.open('test.png')))


다른것은 둘째 치고 hocr로 만들어주는 고마운 기능이 있더군요.


print image_to_string(image 객체,lang=None, boxes=False, config="o hocr") 

요런 명령을 때리면 hocr로 뽑아주는데 에러가 납니다....


알고보니 hocr기능이 들어가기 전에 프로젝트가 중단된 것인지 소스 수정이 필요하더군요.


/usr/local/lib/python2.7/dist-packages/pytesseract 여기로 쫓아가서


pytesseract.py 파일을 관리자 권한으로 열어줍시다.



    if not boxes:
        output_file_name = '%s.txt' % output_file_name_base
    else:
        output_file_name = '%s.box' % output_file_name_base

    if not boxes:
        if config=="o hocr":
            output_file_name = '%s.hocr' % output_file_name_base
        else:
            output_file_name = '%s.txt' % output_file_name_base  
    else:
        output_file_name = '%s.box' % output_file_name_base


위의 것을 아래로 수정하시면 hocr로 뽑히게 됩니다. 뽑힌 내용을 QTwebview등으로 뿌리면 OCR화 된 내용을 볼 수 있습니다. 그렇다는 것은 크롬에서 hocr파일을 열고 구글의 번역 기능을 돌려버릴 수도 있고 (구글 번역 기능은 api 사용료가 붙습니다. 하지만 크롬을 쓰면 이야기는 달라집니다.) PDF화도 가능합니다.


....사실 python보다는 bash로 처리하는 것이 훨씬 더 경제적이었다는 느낌이 드네요. 뭐하러 Python으로 만들었지?

,