Suniye: let my parents hear the message themselves
Suniye: 부모님이 메시지를 직접 들을 수 있도록
Suniye는 작은 글씨를 읽기 힘든 부모님을 위해 사진과 PDF, 공유된 메시지를 힌디어 음성으로 읽는 Android 앱입니다. OCR부터 음성 합성, 중단·재생 제어까지 구현했으며 에뮬레이터와 백엔드 검증 결과를 공개했습니다. 부모님의 Redmi A4 실사용은 아직 확인하지 않았습니다.
- 주제
AI 요약
Suniye(सुनिए)는 시력이 약한 부모님이 WhatsApp 메시지나 종이 문서의 작은 글씨를 직접 듣도록 만든 Android 읽기 보조 앱입니다. 개발자는 다른 도시에 있어 매번 메시지를 읽어주기 어렵다는 문제에서 출발했습니다. 앱 화면에는 रोकिए(중지), फिर सुनिए(다시 듣기), धीरे सुनिए(천천히 듣기) 같은 큰 힌디어 버튼을 배치했습니다. Android 11 이상을 대상으로 하며, 부모님이 쓰는 Redmi A4에서 실제 사용을 관찰하지는 못했습니다.
입력부터 음성 재생까지
카메라 촬영, 사진 선택, PDF 열기, Android Share를 입력 경로로 제공합니다. WhatsApp 메시지는 돌봄 제공자가 먼저 설정한 뒤 화면의 सुनिए 버튼을 누르는 흐름을 의도했습니다. 사진과 PDF에는 기기에 포함된 OCR을 적용해 데바나가리 문자와 라틴 문자를 읽습니다. 인식한 텍스트는 화면에 남기고, 온라인 음성 요청 때 백엔드를 거쳐 ElevenLabs의 Raju 음성으로 보냅니다. 새 음성은 Raju만 사용하며, 성공한 읽기는 캐시해 오프라인에서 다시 듣거나 속도를 낮춰 재생합니다. OCR이 텍스트를 찾지 못하면 온라인 이미지 설명 경로를 사용합니다. 음성 파일이 없으면 원문을 유지하고 연결 상태를 확인하도록 안내합니다. Android나 브라우저의 TTS로 자동 전환하지 않습니다.
금액은 음성 합성에 바로 보내지 않고 읽기 좋은 힌디어 표현으로 바꿉니다. 예를 들어 ₹1,250은 “एक हज़ार दो सौ पचास रुपये”로 변환합니다. 원래 표기는 그대로 표시하고 금액 힌트를 따로 둡니다. 날짜는 적힌 필드 순서를 유지합니다. 중지 버튼은 문서가 길거나 글자 크기를 키워도 화면에서 밀려나지 않도록 스크롤 영역 아래에 고정했습니다.
워크플로와 중지 처리
온라인 읽기 흐름은 Mastra가 맡습니다. 요청마다 취소 신호를 두고 입력 검증, 원문 읽기 또는 설명 생성, 음성 요청을 단계별로 처리합니다. 사용자가 중지를 누르면 앱이 현재 작업을 무효화하고 요청을 취소하며 뒤늦게 도착한 응답도 버립니다. 지연 응답을 일부러 만든 테스트에서는 중지 뒤 읽기가 다시 시작되지 않았습니다.
Gemma 3 4B는 Ollama를 통해 개발자의 노트북에서 실행합니다. 읽을 텍스트가 없는 사진을 설명하거나 힌디어 문장을 쉽게 풀어 쓰는 용도입니다. 다만 설명 과정에서 날짜를 바꾸거나 원문에 없는 행사 내용을 덧붙인 사례가 나왔습니다. 수량·부정 표현을 확인하는 검사도 일부 오류만 잡았습니다. 따라서 원문 읽기와 설명을 분리하고 설명 기능은 실험 단계로 둡니다. 여섯 건의 합성 힌디어 입력을 Gemma 3 4B와 Qwen 2.5 72B에 각각 시험했을 때 금액·날짜의 문자 그대로의 검사는 통과했지만, Gemma는 원문에 없는 회의나 행사를 추가한 사례가 있었습니다. 이 소규모 비교로 모델 전반의 우열을 판단하지는 않습니다.
검증 결과와 남은 한계
개발자는 Android 11과 15 에뮬레이터에서 이미지·PDF 입력, 큰 글자, 중지와 재생을 점검하고 실제 힌디어 음성을 사용했습니다. 간단한 합성 이미지와 두 페이지 PDF에서는 이미지의 नमस्ते, PDF 첫 페이지의 बिल, 둘째 페이지의 धन्यवाद를 읽었습니다. 이 사례는 테스트한 경로를 보여줄 뿐 복잡한 문서의 정확성을 보장하지 않습니다. 빽빽한 청구서에서는 OCR이 실패해 신뢰도 0.85 미만일 때 재촬영을 권하는 처리를 추가했습니다. 금액, 날짜, 약품 표시는 가족이 다시 확인해야 합니다.
백엔드는 Render에 배포했으며 인증된 청구서 요청에서 Raju 음성을 받았고 인증이 없는 요청은 401로 거부했습니다. 다만 무료 인스턴스는 잠들 수 있고, 호스팅된 Gemma와 Atlas 연결은 아직 구성하지 않았습니다. Sentry 추적에서는 한 차례 Gemma 요청 32.64초 중 24.96초가 모델 로딩에 걸렸습니다. 이를 통해 음성 생성이 아니라 모델 초기화가 지연의 주된 원인이었던 사례를 확인했습니다. Android 에뮬레이터의 음성 캡처가 꺼져 있었던 재생 상태 검사는 실제 청취 품질 검증과는 구분해야 합니다.
별도 돌봄 도구에서는 Temporal로 PDF 페이지 작업의 재시도와 취소를 시험했습니다. 첫 페이지 처리 뒤 작업자를 종료하고 재시작한 테스트에서 첫 페이지를 반복하지 않았고, 취소 뒤에는 암호화된 입력을 지우고 늦은 쓰기를 거부했습니다. 문서 텍스트는 Temporal 기록에 남기지 않습니다. PostgreSQL과 pgvector를 이용한 설정 안내 검색은 공식 Android 자료 세 건을 대상으로 시험했습니다. 예상한 질문은 출처를 찾았고 무관한 케이크 질문에는 결과를 내지 않았습니다. 이러한 도구는 부모님이 매일 쓰는 화면이 아니라 개발·설정·진단에 사용합니다.
코드는 MIT 라이선스로 공개했으며, 디버그 APK에는 합성 테스트 자료가 포함됩니다. ElevenLabs 키와 가족 메시지는 저장소에 넣지 않았습니다. 작성자는 에뮬레이터와 백엔드 테스트로 동작을 확인했지만, 부모님이 Redmi A4에서 WhatsApp 메시지와 종이 라벨을 읽고 도움 없이 중지·재생할 수 있는지는 아직 확인하지 않았다고 밝힙니다.
원문: dev.to / 번역·요약: Trawling