codingstairs
노트에듀라이프연락
⌕검색⌘K
koen

Navigation

  • Intro
  • Blog
  • Life

연락하기

로그인 없이도 보낼 수 있어요. 답변이 필요하면 이메일을 함께 적어 주세요.

  • 익명 폼으로 의견 남기기 →
  • ✉ warragon112@gmail.com
  • 카카오톡 오픈채팅 ↗

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
에듀›Tauri 2 — 데스크탑 · 모바일 한 코드베이스›6단계

6단계

OCR / STT / TTS

0회 조회

OCR / STT / TTS

앱에 "이미지 → 텍스트" · "음성 → 텍스트" · "텍스트 → 음성" 세 가지 기능을 붙이는 실용 묶음.

1. OCR — Tesseract wasm

pnpm add tesseract.js
import Tesseract from "tesseract.js";

const { data: { text } } = await Tesseract.recognize(imageFile, "kor+eng", {
  logger: (m) => console.log(m.status, m.progress),
});
  • kor+eng — 한국어 + 영어 동시
  • wasm 번들 크기 ~10MB (lazy load 추천)
  • 첫 호출 시 traineddata 다운로드

2. 전처리 — 정확도 향상

function preprocessImage(canvas: HTMLCanvasElement) {
  const ctx = canvas.getContext("2d")!;
  const img = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const d = img.data;
  for (let i = 0; i < d.length; i += 4) {
    const gray = 0.299 * d[i] + 0.587 * d[i+1] + 0.114 * d[i+2];
    const bw = gray > 128 ? 255 : 0;
    d[i] = d[i+1] = d[i+2] = bw;
  }
  ctx.putImageData(img, 0, 0);
}

그레이스케일 + 이진화만으로도 정확도 +10 ~ 20%p.

3. STT — Web Speech API

브라우저 · WebView 내장 기능. 별도 설치 불필요.

const rec = new (window.webkitSpeechRecognition || window.SpeechRecognition)();
rec.lang = "ko-KR";
rec.continuous = false;
rec.interimResults = true;

rec.onresult = (e) => {
  const text = Array.from(e.results).map(r => r[0].transcript).join("");
  console.log(text);
};

rec.start();
  • 무료 · 온라인 (OS 서버 경유)
  • Chromium 계열에서만 (Safari 일부 제한)
  • Tauri WebView 는 플랫폼 엔진 기반이라 작동 여부 상이

오프라인 필요 → Vosk · Whisper.cpp (Rust binding).

4. TTS — Web Speech API

function speak(text: string, lang = "ko-KR") {
  const u = new SpeechSynthesisUtterance(text);
  u.lang = lang;
  u.rate = 1.0;
  u.pitch = 1.0;
  window.speechSynthesis.speak(u);
}

function cancel() {
  window.speechSynthesis.cancel();
}
  • 브라우저 · OS 가 기본 제공
  • 한국어 음성 품질은 OS 별 차이
  • speaking ? cancel() : speak() 토글이 UX 자연스러움

5. 권한 (모바일)

Android 는 마이크 사용 시 RECORD_AUDIO 권한 런타임 요청.

// Tauri 2 플러그인 또는 네이티브 플러그인 경유

OCR 은 권한 불필요 (이미지 선택만).

6. 언어 패키지 관리

Tesseract traineddata 는 언어별 ~10MB. 번들에 포함 vs 런타임 다운로드 선택.

  • 번들 포함 → 오프라인 안전, 초기 앱 크기 ↑
  • 런타임 다운로드 → 초기 경량, 첫 OCR 시 지연

모바일은 데이터 요금을 고려해 번들 포함 권장.

7. 자주 걸리는 자리

  • Tesseract 첫 호출 긴 지연 — traineddata 다운로드 중. progress UI 필수
  • ko 언어 음성 없음 — OS 음성 팩 설치 안 됨 (iOS · Android 설정)
  • continuous STT 배터리 — onresult · onend 로 적시 cancel
  • OCR 결과 줄바꿈 지저분 — regex /\s+/g, " " 로 정규화 권장

하고픈 말

OCR · STT · TTS 셋은 "한국어 학습 앱" · "맛기로그" · "접근성" 같은 실제 제품에서 자주 조합됩니다. Web API 만으로 대부분 가능하다는 게 Tauri 의 장점.

Next

  • 07-admob-shipping

← 5단계

Android 빌드

7단계 →

AdMob + 배포