원문 캡처 · github.com
원문 캡처 · github.com

Narro는 웹페이지의 문장을 읽어 주면서 현재 읽는 문장을 강조 표시하는 크롬 확장 프로그램이다. 브라우저 안에서 작동하는 음성 모델이나 사용자의 API 키를 사용하는 클라우드 음성을 선택할 수 있으며, Kindle Online Reader도 지원한다.

음성과 기기 요구사항

클라우드 음성은 OpenAI의 gpt-4o-mini-tts(스타일 지침 지원), tts-1, tts-1-hd, 사용자의 키로 목록을 불러오는 ElevenLabs 음성, Google Gemini TTS 음성을 지원한다. OpenRouter를 이용하면 여러 업체의 음성 모델을 하나의 키로 사용할 수 있다.

브라우저에서 실행하는 음성 모델로는 Kokoro-82M(영어 음성 8개), Supertonic 2(영어·스페인어·프랑스어·포르투갈어·한국어 음성 10개), 여러 언어의 piper-voices를 지원하는 Piper, 영어 음성 8개를 제공하며 다운로드 용량이 가장 작은 Kitten TTS Nano가 있다. Kitten TTS Nano의 음성은 Jasper, Bella, Luna, Bruno, Rosie, Hugo, Kiki, Leo다. 이 밖에 OpenAI 호환 /v1/audio/speech 서버를 연결할 수 있으며, 예로 Kokoro-FastAPI가 제시돼 있다. 컴퓨터에 내장된 시스템 음성도 쓸 수 있다.

각 브라우저 음성 모델은 한 번 다운로드한 뒤 오프라인에서 작동한다. 아래 다운로드 용량은 Hugging Face의 모델 파일 기준이다. 메모리는 모델을 이미 내려받은 상태에서 M1 Pro의 Chromium으로 12개 문단짜리 기사를 읽을 때 Chrome 작업 관리자에서 측정한 최대 사용량이며, 50MB 단위로 반올림했다. 기기마다 차이가 날 수 있다. 메모리 대부분은 세 엔진이 공유하는 음성 실행 환경이 차지하므로, 용량이 작은 Piper 음성도 Kokoro와 비슷한 메모리를 사용할 수 있다. 기기가 지원하고 Device가 Auto로 설정된 경우 Kokoro와 Supertonic은 WebGPU를 사용한다. 팝업에는 현재 기기의 수치가 표시된다.

모델다운로드 용량읽는 중 메모리
Kokoro-82M, CPU92.4 MB약 700 MB
Kokoro-82M, WebGPU325.5 MB약 1050 MB
Supertonic 2, CPU262.9 MB약 950 MB
Supertonic 2, WebGPU262.9 MB약 800 MB
Piper, 중간 품질 음성63.2–63.5 MB약 800 MB
Piper, 고품질 음성113.9–120.8 MB약 800 MB
Kitten TTS Nano 0.8, CPU27.7 MB, 음성 8개 전체약 500 MB

읽기와 Kindle 지원

Narro는 페이지를 바꾸지 않고 문장을 강조 표시하며, 읽는 위치에 맞춰 페이지를 스크롤한다. 연속된 문장은 한 번의 요청으로 보내 음성의 억양이 이어지도록 하고, 첫 문장은 따로 보내 재생을 빠르게 시작한다. 재생·일시 정지, 이전·다음 문장 이동을 지원하며, 음높이를 유지한 채 속도를 0.5배에서 3배까지 조절할 수 있다. 페이지에서 텍스트를 선택한 뒤 마우스 오른쪽 버튼 메뉴의 ‘Read aloud from here’를 선택하면 원하는 지점부터 읽는다. 각 페이지에서 마지막으로 읽던 위치를 이어서 재생할 수 있다.

어느 탭에서든 팝업을 열어 현재 읽는 내용을 확인하고 일시 정지하거나 중지할 수 있다. 재생 중에는 도구 모음 아이콘에 빨간색 ▶︎가 표시된다.

Kindle Cloud Reader의 책 페이지는 텍스트가 아니라 이미지로 표시된다. 따라서 Narro는 read.amazon.com, .co.uk, .in, .de 등의 사이트에서 Tesseract를 사용해 화면의 글자를 기기 안에서만 인식한 뒤, 선택한 음성으로 읽는다. 페이지 끝에 도달하면 Kindle의 다음 페이지 버튼을 누르고 계속 읽는다. 페이지의 마지막 문장을 재생하는 동안 조금 일찍 다음 페이지로 넘겨 멈춤을 줄이는 기능도 있으며, 두 동작은 설정에서 끌 수 있다. 페이지 넘김이나 단 나눔으로 문장이 끊겨도 문장 전체를 한 번만 읽는다.

Kindle 탭이 다른 창 뒤에 있어도 읽기를 계속한다. 탭이 숨겨진 동안 Kindle이 다음 페이지를 그리지 않으면 탭이 다시 보일 때까지 기다린다. OCR은 현재 영어만 지원하며, 장식이 많은 글꼴이나 매우 작은 글자, 삽화는 인식 정확도를 낮출 수 있다.

Narro는 독립 프로젝트이며 Amazon과 제휴하거나 Amazon의 보증을 받은 제품이 아니다. Kindle은 Amazon.com, Inc.의 상표다. Narro는 사용자가 직접 열어 둔 페이지만 읽지만, Kindle Cloud Reader의 자동화된 사용은 Amazon 약관에 제한될 수 있으므로 이용 조건을 확인해야 한다.

설치와 사용

Chrome 웹 스토어에서 Narro를 설치한 다음 웹페이지에서 Narro 아이콘을 누르고 음성 엔진을 선택한 뒤 ‘Read this page’를 누르면 된다. 키보드 단축키는 팝업에서 확인할 수 있으며, chrome://extensions/shortcuts에서 변경할 수 있다.

스토어에 반영되기 전 최신 변경사항을 시험하려면 다음 명령을 실행한다.

sh
git clone https://github.com/swrdfish/Narro.git
cd Narro
npm install
npm run build

그다음 chrome://extensions에서 개발자 모드를 켜고 ‘Load unpacked’를 선택해 dist/ 폴더를 불러온다. Narro 아이콘을 누르고 음성 엔진을 선택한 뒤 ‘Read this page’를 누른다.

개인정보 처리

클라우드 음성을 선택하면 읽는 텍스트가 사용자의 계정과 해당 업체의 약관에 따라 OpenAI, ElevenLabs 또는 Google로 전송된다. OpenRouter를 쓰면 텍스트는 OpenRouter와 해당 모델 제공업체로 전송된다. Kokoro, Supertonic, Piper, Kitten TTS 같은 로컬 모델이나 시스템 음성을 사용하면 텍스트가 컴퓨터 밖으로 나가지 않는다. 로컬 서버를 선택한 경우에는 설정한 주소의 서버가 텍스트를 받는다.

API 키는 사용자의 컴퓨터에 있는 chrome.storage.local에 저장되며 동기화되지 않는다. 키는 해당 키가 속한 제공업체 외의 다른 곳으로 전송되지 않는다. 브라우저 음성 모델 파일은 최초 사용 시 Hugging Face에서 내려받아 브라우저에 캐시한다.

Narro는 각 페이지에서 마지막으로 들은 문장의 짧은 지문과 위치를 최대 200페이지까지 저장한다. 이 정보는 컴퓨터에만 보관되며 문장 자체는 포함하지 않는다. Narro 자체에는 분석 도구, 계정 또는 서버가 없다.

모델 목록과 개발

OpenAI, ElevenLabs, Gemini의 모델 목록과 Piper 음성 목록은 src/models.json에서 관리한다. 각 목록은 ID와 드롭다운에 표시할 이름을 연결한다.

json
{ "openai": { "tts-1": "tts-1 · fastest" }, "piper": { "en_US-lessac-medium": "Lessac · US English, female" } }

local 항목에는 팝업에 표시할 브라우저 모델별 다운로드 용량과 메모리가 들어간다. Kokoro와 Supertonic은 기기별로(wasm은 CPU, webgpu는 WebGPU), Piper는 음성별로 값을 둔다. Piper 음성을 목록에 추가할 때는 이 항목에도 값을 추가해야 한다.

json
{ "local": { "piper": { "en_US-lessac-medium": { "downloadMB": 63.2, "memoryMB": 800 } } } }

영구적으로 바꾸려면 src/models.json을 수정한 뒤 npm run build를 실행한다. 다시 빌드하지 않고 빠르게 바꾸려면 dist/models.json을 수정하고 확장 프로그램을 새로고침한다. 다음 빌드 때 이 사본은 덮어써진다. 저장된 모델이 목록에서 빠져도 선택할 수 있다. 로컬 서버의 모델 목록은 해당 서버의 /v1/models 엔드포인트에서 가져온다.

개발 중에는 다음 명령을 사용할 수 있다.

sh
npm run watch # rebuild the extension on changes
npm test # test suite (Node's test runner + jsdom)
npm run site:preview # preview the landing page (site/) at http://localhost:8000

다시 빌드한 뒤에는 chrome://extensions에서 Narro를 새로고침하고, 시험 중인 탭도 새로고침한다. 기여 지침은 CONTRIBUTING.md에 있다. 버그나 아이디어는 이슈로 등록할 수 있으며, 팝업 아래쪽의 ‘Send feedback or report an issue’ 링크도 이용할 수 있다.

Narro는 Manifest V3 확장 프로그램이다. 프레임워크와 빌드 시점의 코드 생성 없이 일반 ES 모듈을 esbuild로 묶는다. 오디오는 오프스크린 문서에서 재생되므로 페이지의 보안 정책이 재생을 막지 않으며, 클라우드 API도 확장 프로그램 자체 출처에서 호출한다. 각 음성 요청에는 순번이 붙어 페이지가 이미 교체된 요청의 이벤트를 무시한다. 읽는 동안 페이지는 백그라운드와 연결을 유지하며, 페이지를 새로고침하거나 닫으면 재생이 중지된다.

다이어그램 로딩 중...

소스 코드는 MIT License로 공개돼 있다. 빌드된 확장 프로그램에는 각자 별도 라이선스를 따르는 제3자 구성요소도 들어간다. 여기에는 Kokoro가 사용하는 음소 변환기를 통해 포함된 eSpeak NG(GPL-3.0-or-later)가 포함된다. 실행 중 내려받는 모델의 라이선스를 비롯한 세부 내용은 THIRD_PARTY_NOTICES.md에서 확인할 수 있다.