실시간 화면 번역. 바뀌는 화면을 그 자리에서 바로 한국어로.
채팅이 올라오고 자막이 넘어가고 페이지를 스크롤해도, 렌즈 아래 번역이 화면을 따라 바로 바뀌어요.
brew install midagedev/tap/mwoyeo무료 · 오픈소스(MIT) · macOS 26 이상 · Apple silicon(M1 이상) · 디스크 이미지 바로 받기
Mwoyeo는 화면이 바뀌는 동안 계속 번역해요. 렌즈 아래 글자를 쉬지 않고 읽어서 화면에서 지우고 같은 자리에 같은 크기와 색으로 번역을 다시 써요. 새 메시지가 올라오면 바로, 자막이 넘어가면 바로, 페이지를 스크롤하면 스크롤하는 대로 번역이 따라와요. 번역 팝업도, 화면 아래 자막 줄도 없어서 원래 한국어로 된 화면을 보는 것처럼 읽혀요. 기본 설정에서는 모든 처리가 Mac 안에서 끝나고 화면 내용은 어디에도 보내지 않아요. 클라우드 번역 엔진을 직접 붙였을 때만 렌즈가 읽은 글자가 그 엔진으로 가요.
brew install midagedev/tap/mwoyeoHomebrew를 안 쓴다면 디스크 이미지를 받아 Mwoyeo를 응용 프로그램 폴더로 옮기면 돼요. Apple 공증을 받은 앱이에요.
새 버전은 Mwoyeo가 하루에 한 번 GitHub에서 확인하고 나오면 메뉴에서 알려 줘요. brew upgrade mwoyeo를 실행하거나
새 디스크 이미지를 받으면 업데이트돼요. 수동 확인, 자동 확인 끄기, 릴리즈 노트와 이슈 트래커 링크는 설정 › 정보에
모여 있어요.
| macOS | 26.0 이상(언어 팩 없이 번역하기와 고품질 엔진은 26.4 이상) |
| Mac | macOS 26 이상이 설치된 Apple silicon(M1 이상) Mac이나 MacBook Neo면 다 돼요. Intel 버전은 없어요. |
| 권한 | 화면 기록만 있으면 돼요. 손쉬운 사용 권한이나 키 입력 감시는 쓰지 않아요. |
| 네트워크 | 기본 설정에서는 번역할 때 쓰지 않아요. 하루 한 번 하는 업데이트 확인이 전부이고 이것도 끌 수 있어요. 클라우드 엔진을 직접 붙였을 때만 그 엔진과 통신해요. |
| 용량 | 앱은 20MB 정도예요. 언어 팩과 Apple Intelligence 모델(최대 8~14GB)은 macOS가 따로 받아서 관리해요. |
| 디스플레이 | 여러 대를 연결해도 어느 화면에나 렌즈를 놓을 수 있어요. |
어떤 기능에 무엇이 필요한가요? 어느 경우든 처리는 Mac 안에서 끝나요. 쓸 수 있는 번역 엔진만 달라져요.
| 기능 | 필요한 것 |
|---|---|
| 글자 인식(Vision), 원문 지우기(Core ML) | 따로 필요한 것 없음. 위 조건에 맞는 Mac이면 다 돼요. |
| 언어 팩으로 번역(가장 빠르고 오프라인에서도 됨) | 해당 언어 쌍의 언어 팩. Mwoyeo 설정 › 번역이나 시스템 설정 › 일반 › 언어 및 지역 › 번역 언어에서 한 번만 받으면 돼요. |
| 언어 팩 없이 번역, 고품질 엔진, 용어집 우선 | 시스템 설정 › Apple Intelligence 및 Siri에서 Apple Intelligence를 켜 두세요. 언어 팩 없이 번역하기와 고품질 엔진은 macOS 26.4 이상에서 돼요. |
Apple Intelligence는 위 조건에 맞는 Mac이면 어디서나 돌아가요. 다만 Mac 언어와 Siri 언어를 지원 언어 하나로 똑같이 맞춰야 하고 중국 본토에서는 쓸 수 없어요. Mwoyeo가 다루는 언어 가운데 영어, 한국어, 일본어, 중국어, 프랑스어, 독일어, 스페인어, 이탈리아어, 포르투갈어, 베트남어는 Apple Intelligence가 지원해요. 러시아어, 우크라이나어, 태국어는 지원하지 않아서 언어 팩으로만 번역돼요. Apple Intelligence를 끄고 써도 괜찮아요. 그때는 모든 번역을 언어 팩이 맡아요.
지원 언어. 영어, 한국어, 일본어, 중국어(간체·번체), 프랑스어, 독일어, 스페인어, 이탈리아어, 포르투갈어(브라질), 러시아어, 우크라이나어, 베트남어, 태국어 가운데 macOS에 번역 모델이 있는 조합이면 어느 방향으로든 번역해요. 원문 언어를 자동으로 두면 줄마다 알아서 판단해요. 앱 화면은 영어, 한국어, 일본어, 중국어(간체·번체), 프랑스어, 독일어, 스페인어, 이탈리아어, 포르투갈어(브라질), 러시아어, 우크라이나어로 나와요.
- Mwoyeo를 실행해요. 메뉴 막대에 뷰파인더 아이콘이 생기고 환영 창이 나머지를 차례로 안내해요.
- 화면 기록을 허용해요. 허용하기를 누른 다음 시스템 설정 › 개인정보 보호 및 보안 › 화면 및 시스템 오디오 녹음에서 Mwoyeo를 켜세요. 그래도 렌즈가 비어 있으면 Mwoyeo를 껐다가 다시 켜 주세요.
- 언어를 골라요. 원문은 자동으로 두면 되고 번역은 처음부터 Mac 언어로 맞춰져 있어요.
- 언어 팩을 받아요(권장). Mwoyeo 설정 › 번역에서 언어 쌍 옆의 내려받기를 누르세요. 언어 팩이 있으면 번역이 거의 바로 나오고 인터넷이 끊겨도 돼요. 없으면 Apple Intelligence가 대신 번역해요. 받을 건 없지만 한 줄에 1초 안팎이 걸려요.
- ⌃⌥L을 누르고 읽고 싶은 곳을 드래그해요. 디스코드 채널의 메시지 목록이나 레딧 스레드 같은 곳이요. 드래그 대신 클릭하면 클릭한 자리에 렌즈가 놓여요. 이때 ⌥를 누르고 있으면 렌즈가 창이 아니라 화면에 고정돼요(아래 참고).
- 옮기기: 빛나는 테두리나 위쪽 이름표를 끌어요. 번역은 아래 글자에 붙어 있어서 렌즈 안에 들어온 부분만 보여요.
- 크기 조절: 오른쪽 아래 모서리를 끌어요.
- 닫기: 렌즈에 포인터를 올리면 이름표에 ✕가 나타나요.
- 스크롤도 채팅도 평소처럼. 렌즈 안쪽은 클릭이 그대로 통과해서 아래 페이지를 그냥 쓰면 돼요. 새 메시지는 올라오는 대로 번역되고 스크롤하면 번역도 같이 따라와요.
- 창 렌즈와 화면 렌즈. 창 위에 놓은 렌즈는 창 렌즈예요(이름표에 🪟). 창을 옮기면 따라오고 창을 최소화하거나 다른 창이 가리면 숨어요. 화면 렌즈(📌)는 놓은 자리에 계속 있으면서 아래에 어떤 앱이 오든 번역해요. 자막이 나오는 줄이나 여러 앱을 번갈아 띄우는 자리에 좋아요. 이름표의 아이콘을 누르면 둘 사이를 바꿀 수 있어요.
- 렌즈는 작게. 브라우저 전체보다 채팅 영역처럼 실제로 읽는 부분만 감싸야 번역이 빠르고 배터리도 덜 써요. 렌즈는 여러 개 띄울 수 있어요.
메뉴 막대 아이콘을 누르면 렌즈 목록이 나와요. 여기서 렌즈를 하나씩 켜고 끄거나 지우고 새로 추가할 수 있어요. 원문 보기, 일시정지, 설정도 이 메뉴에 있어요.
어느 앱을 쓰고 있든 동작해요. 설정 › 단축키에서 바꾸고 싶은 단축키를 누른 다음 새 키를 입력하면 돼요. 지울 수도 있어요. 다른 앱이 이미 같은 키를 쓰고 있어도 macOS는 알려 주지 않아요. 단축키를 눌렀는데 다른 일이 같이 일어나면 다른 키로 바꿔 주세요. 기본 단축키는 Rectangle이나 Magnet 같은 창 관리 앱과 겹치지 않게 골랐어요.
| ⌃⌥L | 렌즈 추가(드래그해서 영역 지정, 클릭하면 그 자리에 놓기, ⌥를 누르고 있으면 화면에 고정) |
| ⌃⌥O | 원문 보기 / 번역 보기 |
| 없음 | 모든 렌즈 일시정지, 다시 번역(메뉴에 있어요. 필요하면 설정에서 키를 지정하세요) |
| 없음 | 원문 복사, 소리 내어 읽기, 렌즈 이미지 저장(포인터 아래 렌즈에, 없으면 가장 최근 렌즈에 적용돼요) |
렌즈 이름표를 오른쪽 클릭하면 그 렌즈에서 할 수 있는 일이 모여 있어요.
- 원문 보기, 원문 복사, 번역 복사: 렌즈 안 글자를 읽는 순서대로 복사해요.
- 소리 내어 읽기: 번역을 시스템 음성으로 읽어 줘요. 그 언어 음성이 없으면 시스템 설정 › 손쉬운 사용 › 읽기 및 말하기에서 추가하세요.
- 렌즈 이미지 저장: 번역이 올라간 렌즈 화면을 PNG로 저장해요.
- (앱 이름)에서 이 언어 기억하기: 창 렌즈에서만 보여요. 지금 언어 쌍을 그 앱에 묶어 두면 그 앱이 맨 앞에 올 때 언어가 자동으로 바뀌어요. 언어 쌍은 한 번에 하나만 쓰기 때문에 맨 앞에 있는 앱의 설정이 모든 렌즈에 적용돼요. 기억한 앱은 설정 › 번역 › 앱별 언어에서 지울 수 있어요.
메뉴 막대 패널 아래쪽의 사진 아이콘을 누르면 이미지 번역 창이 열려요. 그림 파일을 끌어다 놓거나 ⌘V로 붙여 넣으면 렌즈와 같은 방식으로 원문을 지우고 번역을 그려 넣어요. 결과는 이미지나 텍스트로 복사하거나 저장할 수 있어요.
Apple 번역만으로 충분하면 아무것도 할 필요 없어요. 더 자연스러운 번역이 필요하면 설정 › 번역 › **다른 엔진 추가…**에서 자기가 쓰는 엔진을 붙일 수 있어요.
- 이 Mac에서: Ollama, LM Studio, 직접 띄운 LibreTranslate나 DeepLX. 키가 필요 없고 글자가 Mac 밖으로 나가지 않아요.
- 클라우드: Gemini, OpenAI, Claude, DeepL, DeepSeek, OpenRouter, Groq, Qwen 등. 키를 붙여 넣고 모델을 고르면 시험 번역으로 연결을 바로 확인해요. 키는 macOS 키체인에만 저장돼요.
- 직접 연결: OpenAI 호환 서버, 몇 줄로 적는 HTTP 템플릿, JSON을 주고받는 명령어. 엔진 구성은 구성 복사로 남에게 넘기고 구성 붙여 넣기로 받을 수 있어요. 키는 구성에 들어가지 않아요.
엔진을 붙이면 메뉴 막대 패널에 엔진 전환 버튼이 생겨요. 붙인 엔진이 응답하지 않거나 키가 틀리면 그 사이에는 Apple 번역으로 대신 번역하고 패널에 조용히 알려 줘요. 설정의 엔진 목록 아래에는 첫 결과까지 걸린 시간과 번역 메모리에서 바로 꺼낸 비율이 나와요.
클라우드 엔진을 고르면 렌즈가 읽은 글자가 그 엔진 회사의 서버로 가요. 엔진을 추가하는 화면에도 어디로 가는지 적혀 있어요. 화면 이미지는 보내지 않고 글자만 보내요.
엔진별로 간단히 재 본 결과예요(2026-10-17, M1 Pro, 세 줄 묶음 한 번 기준. 측정 방법과 전체 표는 tools/engine-bench/RESULTS.md).
| 엔진 | 모델 | 응답(중앙값) | 품질(1–5) | 비용 |
|---|---|---|---|---|
| Apple(기본) | Translation framework | 0.15초 | 3.4 | 무료 |
| DeepL | Free API | 0.88초 | 4.6 | 무료 등급 |
| Gemini | gemini-3.1-flash-lite | 1.27초 | 4.6 | 무료 등급 |
| Claude | claude-haiku-5-5 | 1.12초 | 4.6 | 유료 |
| OpenAI | gpt-5.6-luna | 1.35초 | 4.8 | 유료 |
| Ollama | translategemma:4b | 1.00초 | 3.6 | 무료, 이 Mac |
Apple 번역이 가장 빠르고, 클라우드 엔진은 1초 남짓 더 걸리는 대신 문맥을 살린 번역을 돌려줘요.
| 탭 | 바꿀 수 있는 것 |
|---|---|
| 일반 | 언어 · 표시 방식: 적응형(기본값. 움직이는 동안엔 상자로 보여 주고 멈추면 원문을 지우고 다시 씀), 빠르게(늘 상자, 배터리를 가장 적게 씀), 자연스럽게(늘 지우고 다시 씀) · 화면 확인 빈도(4, 8, 15fps) · 로그인 시 실행 · 저장: 렌즈가 읽은 원문과 번역을 Markdown·SRT 기록으로 남기기, 기록과 렌즈 이미지를 둘 폴더(기본 ~/Documents/Mwoyeo) |
| 번역 | 엔진: 자동(언어 팩이 있으면 언어 팩, 없으면 Apple Intelligence), 고품질(늘 Apple Intelligence. 가장 자연스럽지만 가장 느려요), 용어집 우선 · 언어 팩 · 번역 메모리: 한 번 번역한 문장을 몇 개까지 기억해 둘지(1,000, 5,000, 20,000개. 메모리에만 두고 Mwoyeo를 끄면 사라져요) · 이름을 정해 두는 용어집(한 줄에 원문 = 번역 하나씩) · 다른 엔진 추가 · 앱별 언어(렌즈 메뉴에서 기억한 앱이 있을 때만 보여요) |
| 표시 | 렌즈 스타일: 글로우, 은은하게(읽는 동안에만 빛나요), 모서리(네 모서리만 그려요), 최소(옅은 선만 보이고 이름표는 포인터를 올리면 나타나요) · 색상: 스펙트럼, 강조 색상, 오션, 선셋, 포레스트, 모노 · 이름표: 표시(자동, 항상, 포인터를 올렸을 때)와 위치(네 모서리) · 글꼴(기본, 둥근, 명조) · 상자 불투명도 · 사진이나 그림 위 글자는 AI로 지우기 |
모든 설정은 JSON 파일로도 있어서, 클릭하지 않고 직접(또는 Claude Code에게 시켜서) 바꿀 수 있어요. 파일 위치는 ~/Library/Application Support/Mwoyeo/settings.json이고, Mwoyeo --settings-path로 확인하거나 설정 › 일반의 열기 버튼으로 열 수 있어요.
- 파일을 저장하면 1초 안에 바로 적용돼요. 설정 창과 파일은 늘 같은 내용이에요.
- 옆에 있는
settings.schema.json에 키마다 설명과 고를 수 있는 값, 범위가 적혀 있어요. 목록 안의 항목(엔진, 앱별 설정)도 마찬가지예요. JSON Schema를 읽는 편집기라면 키를 자동 완성하고 검사해 줘요.Mwoyeo --settings-schema로 스키마를 바로 출력할 수도 있어요. Mwoyeo --check-settings [경로]는 문제가 없으면ok를 출력해요. 문제가 있으면 하나에 한 줄씩 출력하고 종료 코드 1로 끝나요. 예:settings.json:14: engines[0].thinking: "maybe" is not allowed; use one of off, provider; ignored- 한 줄은
<줄>: <경로>: <무엇이 틀렸나>; <어떻게 했나>순서예요. 목록 안의 값도 정확한 줄 번호와 경로(engines[0].thinking)로 알려 주고, 모르는 키에는 가장 비슷한 키를 알려 줘요. - 끝부분은 셋 중 하나예요.
keeping the current value는 설정 전체가 잘못돼 원래 값을 그대로 둔다는 뜻이에요.ignored는 항목 안의 선택 값 하나만 무시하고 항목은 적용한다는 뜻이고,dropped는 목록에서 그 값 하나만 빼고 나머지를 적용한다는 뜻이에요. JSON이 깨진 파일은 고칠 때까지 건드리지 않아요. - 에이전트에게 맡길 때 알아 둘 내용은 docs/settings-for-agents.md에 있어요.
- 추가한 엔진의 API 키는 파일에 들어가지 않고 키체인에만 있어요.
번역 로그. "savesTranscripts": true로 두면 렌즈마다 읽은 원문과 번역을 <exportFolder>/Transcripts에 남겨요(기본은 Markdown과 SRT). transcriptFormats에 "jsonl"을 더하면 번역된 줄마다 JSON 한 줄씩, 생기는 즉시 덧붙여요.
"savesTranscripts": true,
"transcriptFormats": ["markdown", "srt", "jsonl"]tail -f ~/Documents/Mwoyeo/Transcripts/*.jsonl
# {"time":"2026-10-18T10:52:02.030+09:00","lens":"Chat","app":"com.example.app","source":"auto","target":"ko","engine":"apple","original":"こんにちは","translation":"안녕하세요"}설정을 바꾸고 싶으면 Claude Code에게 *"렌즈 테두리를 은은하게 하고 일본어로 번역하게 해 줘"*처럼 말하면 돼요. 스키마를 읽고 키 두 개를 고친 뒤 --check-settings로 확인해요.
- "번역 중…"에서 넘어가지 않아요. 대부분 언어 팩이 없어서 그래요. 설정 › 번역에서 받아 주세요. 설치하고 처음 띄우는 렌즈는 원래 좀 오래 걸려요. macOS가 글자 인식 모델을 처음 한 번 불러오거든요.
- 이름이 엉뚱하게 번역돼요. 등장인물이나 지명, 닉네임 같은 건 용어집에 적고 용어집 우선을 고르세요.
- 업데이트했더니 아무것도 안 보여요. macOS가 화면 기록 권한을 다시 물어볼 때가 있어요. 시스템 설정에서 확인하고 Mwoyeo를 다시 켜 주세요.
- 원문이랑 비교해 보고 싶어요. ⌃⌥O를 누르면 원문이 보이고 한 번 더 누르면 번역으로 돌아와요.
- 개인정보는요? Mwoyeo는 렌즈 아래만 읽고, 기본 설정에서는 그 내용을 저장하지도 보내지도 않아요. 기록 저장을 켜면 지정한 폴더에만 쓰고, 클라우드 엔진을 붙이면 렌즈 글자가 그 엔진으로 가요. 화면을 캡처할 때 자기 오버레이는 빼고 찍어요. 그 밖에 인터넷에 묻는 건 하루 한 번 GitHub의 최신 버전 번호뿐이고 설정 › 정보에서 끌 수 있어요. 이 확인은 릴리즈에 붙은 작은 파일을 받는 방식이라 GitHub의 다운로드 수가 곧 사용 통계가 돼요. 설치는 한 번, 사용은 한 달에 한 번만 세고 기기를 알아볼 수 있는 값은 아무것도 보내지 않아요.
모든 단계를 Apple의 온디바이스 프레임워크로 처리해요.
| 단계 | 기술 |
|---|---|
| 캡처 | ScreenCaptureKit. 렌즈마다 스트림 하나, Mwoyeo 오버레이는 제외, 픽셀이 바뀔 때만 프레임을 받아요 |
| 글자 인식 | Vision VNRecognizeTextRequest(줄, 관심 영역). 줄은 위치와 간격으로 문단에 묶습니다 |
| 번역 | Translation 프레임워크. 저지연 언어 팩, 언어 팩이 없으면 Apple Intelligence 고품질 모델 |
| 용어집 반영 번역 | Foundation Models(기기 안 언어 모델), 선택 |
| 원문 지우기 | 무늬 있는 배경은 GPU에서 Core ML MI-GAN 인페인팅, 단색 배경은 빠른 확산 채우기 |
| 인터페이스 | SwiftUI와 Liquid Glass, 메뉴 막대 앱, 전역 단축키, 12개 언어 |
ScreenCaptureKit ──► change map (16 px tiles) ──► scroll? shift blocks, read only the new strip
│ │
│ └─► changed rows ──► Vision (ROI) ──► erase ──► translate (lens first) ──► overlay
│
└─► still for 0.5 s ──► whole-frame paragraph pass ──► seamless re-render, cross-faded in
캡처는 렌즈보다 넓게 해요(오버스캔). 가만히 있을 땐 렌즈 사방으로 렌즈 크기의 30%쯤 여유를 둬요. 내용이나 렌즈가 움직이면 40%쯤으로 넓혀 움직이는 방향 쪽으로 더 잡아요. 렌즈가 이 범위 안에서 움직이는 동안은 캡처 영역이 그대로 있고 가장자리에 가까워졌을 때만 다시 중심을 잡아요. 이때도 새로 드러난 띠만 읽어요. 그대로인 글자는 이전에 지운 배경을 다시 쓰고 내용이 움직이는 사이에 계산한 결과도 버리지 않고 옮겨서 써요. 번역은 늘 지금 보이는 것부터 해요.
스크롤은 두 단계로 맞춰요. 트랙패드나 휠 입력이 들어오면 다음 프레임이 오기도 전에 번역을 페이지와 함께 먼저 움직여요. 그다음 프레임이 들어올 때마다 열 단위로 1픽셀보다 잘게 재서 정확한 위치에 맞춰요. 그래서 고정된 사이드바나 입력창 때문에 채팅 번역이 엉뚱하게 끌려가지 않아요. 새로 스크롤되어 들어온 띠만 읽어요.
단색이나 그라데이션 배경은 주변 색으로 채워요. 그림이나 게임 화면처럼 무늬가 있는 배경은 기기 안의 인페인팅 모델이 배경을 다시 그리고 번역은 원래 글자와 비슷한 굵기와 크기로 써요.
위 영상은 실제 앱을 직접 만든 가짜 채팅 페이지(demo/chat.html?lang=ja)에 올려 진짜 마우스와 트랙패드
스크롤로 찍었어요. 촬영 순서는 docs/HERO.md에 있어요.
이름은 "뭐여?"라는 사투리에서 따왔어요.
빌드, 테스트, 릴리즈 방법은 영어 README에 있어요. 이슈와 PR은 언제든 환영해요. 자세한 건 CONTRIBUTING.md를 봐 주세요.
인페인팅 모델은 Picsart AI Research의 MI-GAN을 썼어요(MIT
라이선스, tools/inpaint/models/LICENSE-MI-GAN-WEIGHTS). tools/inpaint/models에 있는 Core ML 버전은
tools/inpaint/convert_migan.sh로 변환했어요.
MIT
