권희철

프로젝트 목록

iOS

KanjiMate

일본어 ebook·뉴스 스크린샷에서 한자 단어를 OCR·형태소로 뽑아 Live Activity로 보여 주는 학습 보조 앱

기간:
2026.07.03 ~ 진행 중
역할:
개인 개발
SwiftSwiftUISwiftDataVisionWidgetKitAppIntentsActivityKit
24% → 50%
세로 전자책 문맥 인식률

교정 전 기준

78% → 88%
세로 전자책 다른 페이지 문맥 인식률

교정 전 기준

97%
가로 뉴스 문맥 인식률

교정 전 기준

iOS 18+
지원 버전

배경과 성공 기준

히라가나와 가타카나는 읽을 수 있어도 일본어 원서나 뉴스에서 모르는 한자를 만나면 읽기의 흐름이 끊겼습니다. 사전 앱을 열고, 획을 세거나 문장을 복사하는 사이에 원래 읽던 맥락을 잃기 쉬웠습니다.

KanjiMate는 스크린샷 한 장에서 한자 단어를 찾아 읽는 법과 한국어 뜻을 보여 주고, 마음에 드는 단어는 바로 저장하는 학습 보조 앱입니다. 완벽한 문서 OCR보다 지금 보고 있는 한자 주변의 짧은 문맥을 얼마나 놓치지 않는가를 더 중요한 제품 지표로 정했습니다.

OCR 파이프라인과 기술 선택

AppIntent만으로는 다른 앱의 화면을 캡처할 수 없으므로 사용자가 단축어에서 스크린샷을 넘기도록 했습니다. 받은 이미지는 메모리 사용량을 줄이기 위해 먼저 작게 줄인 뒤, 가로 뉴스와 세로 전자책에 서로 다른 전처리를 적용합니다.

  1. 01단축어현재 화면을 캡처해 AppIntent에 전달
  2. 02레이아웃 판단가로글·세로글 두 가지로 읽을 준비
  3. 03Vision OCR세로글은 돌리고 열을 묶어 이어 붙인 뒤 인식
  4. 04형태소 분석한자 단어의 사전 기본형과 품사 정리
  5. 05Translation기기 안에서 일본어→한국어 번역
  6. 06SwiftData뽑은 단어와 저장한 단어를 App Group에 보관
  7. 07Live Activity잠금 화면에서 카드를 넘기고 저장
스크린샷에서 Live Activity 단어 카드까지

Vision은 일본어 글자 인식에, Natural Language는 단어를 사전에 실린 기본형으로 바꾸고 품사를 나누는 데 사용했습니다. iOS 18의 Translation으로 기기 안에서 번역하며, 앱·AppIntent·Live Activity는 App Group의 같은 SwiftData 저장소를 봅니다. 뽑아낸 단어는 Dynamic Island와 잠금 화면에서 넘겨 보고 저장할 수 있고, Anki에서 불러올 수 있는 CSV로도 내보낼 수 있습니다.

  • 스크린샷에서 자동으로 뽑힌 一致, 見事, 利害 같은 단어가 임시 표시와 함께 쌓인 최근 분석 목록
    최근 분석
  • 저장한 全く, 海上, 観測 같은 단어와 본 횟수가 보이는 내 단어장, 위에 단축어·액션 버튼 안내
    내 단어장
  • NHK 뉴스를 읽는 중 위쪽에 펼쳐진 Dynamic Island 카드에 台風(たいふう, 태풍)이 표시된 화면
    Dynamic Island 카드
  • 잠금 화면 카드에 目線(めせん, 눈선)과 이전·다음·단어장에 저장 버튼이 표시된 화면
    잠금 화면 카드
스크린샷에서 뽑힌 단어는 최근 분석에 임시로 쌓이고, 저장하면 내 단어장으로 옮겨집니다. 읽는 중에는 Dynamic Island와 잠금 화면 카드에서 바로 넘겨 보고 저장합니다.

Vision의 일본어 인식은 가로글에서 가장 안정적이라, 세로글은 가로글처럼 바꿔서 넣습니다. 이미지를 90도 돌리고, 글자를 열 단위로 묶습니다. 본문 옆의 작은 읽는 법 표기(후리가나)는 빼고, 한 글자가 여러 조각으로 쪼개졌다면 글자 간격을 기준으로 다시 합칩니다. 그다음 열들을 한 줄로 이어 붙여 가로 OCR에 넣습니다. 마지막으로 직접 만든 채점 기준으로 가로·세로 두 결과를 비교해 더 온전하게 읽힌 쪽을 고릅니다.

  1. 01세로 원문오른쪽 열부터 위에서 아래로 읽는 전자책 페이지
  2. 02돌리고 열 묶기90도 돌린 뒤 글자를 열 단위로 묶고, 쪼개진 조각은 한 글자로 합침
  3. 03한 줄로 이어 붙이기열을 순서대로 이어 붙여 가로 OCR에 넣음
세로글을 가로 OCR이 읽을 수 있는 한 줄로 바꾸는 과정 (예시 글자)

검증 방식과 성과

OCR 품질은 시뮬레이터에서 몇 장만 보고 판단하지 않고, 실제 기기에서 찍은 테스트용 화면을 매번 다시 돌려 이전보다 나빠지지 않았는지 확인했습니다.

테스트 화면 교정 전 교정 후 최소 기준선
세로 전자책 기준 페이지 50% 59% 50% 이상
세로 전자책 다른 페이지 88% 88% 80% 이상
가로 뉴스 97% 99% 90% 이상
만화 말풍선(확인용) 4% 4% 1% 이상

최소 기준선은 이 아래로 떨어지면 변경을 되돌리는 선입니다. 세로 전자책 기준 페이지는 1차 목표로 삼은 화면이고, 다른 페이지는 같은 방법이 처음 보는 페이지에서도 통하는지 확인하는 용도입니다. 가로 뉴스는 세로글 실험이 이미 잘 되던 가로글 인식을 망가뜨리지 않았는지 봅니다. 만화 말풍선은 아직 전용 처리를 만들지 않아서 점수 목표가 없고, 완전히 망가지지 않는지만 확인합니다.

문제 해결 경험

높은 점수가 실제 OCR 실력이 아니었던 문제
문제
처음에는 교정 후 점수가 거의 100%처럼 보였지만, 교정을 끄자 점수가 크게 떨어졌습니다.
원인
긴 문장이나 고유명사를 통째로 바꿔 주는 교정 목록이 OCR이 잘못 읽은 부분을 가리고 있었습니다.
해결
점수를 교정 전과 교정 후로 나누고, 교정은 자주 틀리는 짧은 표현만 남겼습니다. 최소 기준선에 못 미치면 교정 목록을 늘려 메우지 않고, 변경을 되돌리거나 전처리를 다시 조정했습니다.
결과
OCR이 좋아진 만큼과 교정이 도와준 만큼을 따로 설명할 수 있게 되었고, 점수가 실제 품질을 그대로 보여 주게 됐습니다.
세로글의 한자 한 글자가 여러 조각으로 쪼개지던 문제
문제
가운데가 비어 있는 前이나 왼쪽·오른쪽으로 나뉜 強 같은 글자를 Vision이 여러 개의 글자로 잘라서 찾았습니다.
원인
잘린 조각을 각각 한 글자로 보고 이어 붙이다 보니, 부수 조각이나 읽는 법 표기가 본문에 섞여 전혀 다른 한자로 읽혔습니다.
해결
글자 간격과 방향을 기준으로 쪼개진 조각을 한 글자로 합치고, 바로 앞 히라가나가 옆 글자에 섞이지 않도록 막았습니다. 본문 옆의 읽는 법 표기만 골라서 이어 붙이기에서 뺐습니다.
결과
세로 전자책 기준 페이지는 24%에서 50%로, 다른 페이지는 78%에서 88%로 올랐습니다(교정 전 기준). 본문 줄까지 넓게 지워 기준 페이지가 47%로 떨어진 변경은 되돌렸습니다.
가로글과 세로글 처리가 서로 방해하던 문제
문제
가로 뉴스에 세로글 처리가 끼어들거나, 전자책 페이지가 큰 가로 한 줄로 잘못 판단되는 경우가 있었습니다.
원인
이미지 방향 하나만으로 가로·세로를 나누면, 글자가 실제로 어떻게 놓여 있는지와 읽힌 결과가 얼마나 온전한지를 반영하지 못했습니다.
해결
글자 덩어리의 모양과 줄 수를 보고 가로·세로 두 가지로 모두 읽은 뒤, 직접 만든 채점 기준으로 더 온전하게 읽힌 쪽을 골랐습니다.
결과
가로 뉴스를 약 97%로 유지하면서 세로글 처리를 따로 개선할 수 있게 됐습니다.
단축어와 백그라운드 메모리 제약
문제
AppIntent만으로는 화면을 캡처할 수 없었고, 큰 스크린샷을 백그라운드에서 처리하면 메모리 한도를 넘을 수 있었습니다.
원인
iOS가 앱마다 허용하는 범위와 AppIntent가 실행되는 환경을 앱 안의 기능과 같다고 생각했습니다.
해결
단축어가 스크린샷을 앱에 넘겨주게 하고, 받은 이미지는 처리 전에 먼저 작게 줄였습니다.
결과
iOS의 제한을 억지로 피하지 않고, 시스템이 허용하는 흐름 안에서 OCR과 잠금 화면 카드를 연결했습니다.
만화용 OCR 모델을 넣어도 품질이 오르지 않았던 실험
문제
만화 전용 OCR 모델(MangaOCR)을 iOS에서 돌릴 수 있게 고친 뒤에도, 세로 전자책 기준 페이지 점수가 Vision만 쓸 때보다 낮았습니다.
원인
모델이 문제없이 돌아가는 것과, 지금 테스트용 화면에서 점수가 오르는 것은 서로 다른 문제였습니다.
해결
MangaOCR를 기본 처리에서 빼고 실험용 스위치로만 남겼습니다. 앱은 테스트에서 더 안정적이었던 Vision만 사용합니다.
결과
새 기술을 넣었다는 사실보다 측정 결과를 기준으로 실제 앱에 쓸 방법을 골랐습니다.

한계와 다음 단계

세로 전자책의 「呆れた」 부분처럼, Vision이 글자가 있다는 것조차 찾지 못하는 곳이 아직 남아 있습니다. 빈칸처럼 보이는 곳을 무작정 다시 읽게 하면 진짜 빈칸과 놓친 글자를 구분하지 못하고 글자를 반으로 자르게 되어, 그 자리에 실제 글자가 있는지 먼저 확인한 곳만 다시 읽도록 했습니다.

다음에 할 일은 아래와 같습니다.

  • 「呆れた」처럼 놓치는 부분만 따로 테스트 화면으로 만들어 확인하기
  • 만화 말풍선 전용 인식과 정답 데이터 만들기
  • 처음 쓰는 사람도 단축어를 쉽게 설정할 수 있도록 안내 화면 다듬기
  • 사용자가 직접 고친 내용을 쌓아 다음 인식에 반영하는 기능 검토하기
뉴스를 읽는 중 Dynamic Island에 한자 단어 카드가 펼쳐진 KanjiMate 화면