본문으로 건너뛰기
Unveilydocs

접근성

접근성 기능 및 TalkBack / VoiceOver 지원

개요

접근성 Bridge는 TTS(텍스트 음성 변환), STT(음성 인식), 햅틱 피드백, 접근성 패널을 웹 페이지에서 JavaScript로 제어할 수 있게 합니다. Android(TalkBack)와 iOS(VoiceOver) 모두 동일한 Bridge API를 지원합니다.

주입되는 전역 객체는 window.unveilyBridge(소문자) 하나뿐이며, 접근성 관련 기능은 tts, stt, haptic, accessibilityPanel 네임스페이스로 제공됩니다.

기능네임스페이스AndroidiOS
TTSunveilyBridge.tts
STTunveilyBridge.stt
HapticunveilyBridge.haptic
접근성 패널unveilyBridge.accessibilityPanel

브릿지 준비 시점

window.unveilyBridge는 페이지 로드 전에 등록되지만, 네임스페이스는 글루 스크립트 주입 이후에 생성됩니다. React·Vue 등 SPA의 마운트 시점(useEffect/onMounted)에서 접근성 API를 호출한다면 먼저 unveilyGlueReady 이벤트를 기다리세요. 버튼 클릭 등 사용자 동작으로 호출할 때는 필요 없습니다.

window.addEventListener('unveilyGlueReady', () => {
  window.unveilyBridge.tts.speak("Hello, world", "en-US");
}, { once: true });

모듈 활성화

assets/config.json에서 접근성 모듈을 활성화해야 합니다.

assets/config.json
{
  "modules": {
    "accessibility": {
      "enabled": true,
      "topDownPanel": true
    }
  }
}

TTS (텍스트 음성 변환)

unveilyBridge.tts의 메서드는 **위치 인자(positional)**를 사용합니다. 옵션 객체를 전달하지 않습니다.

speak

텍스트를 음성으로 읽어줍니다. 첫 번째 인자는 읽을 텍스트, 두 번째 인자는 언어 코드입니다.

window.unveilyBridge.tts.speak("Hello, world", "en-US");

stop

현재 재생 중인 TTS를 중지합니다.

window.unveilyBridge.tts.stop();

pause / resume

TTS를 일시정지하거나 재개합니다.

window.unveilyBridge.tts.pause();
window.unveilyBridge.tts.resume();

setSpeed

TTS 재생 속도를 설정합니다. 1.0이 기본 속도이며 0.1~4.0 범위로 자동 제한됩니다.

window.unveilyBridge.tts.setSpeed(1.0);   // 1.0 = normal, clamped to 0.1–4.0

재생 상태 이벤트

TTS 재생 상태 변화는 전역 함수 window.onTTSStateChanged로 전달됩니다.

window.onTTSStateChanged = function (result) {
  // result.state: 'started' | 'completed' | 'paused' | 'error'
  console.log(result.state);
};

지원 언어

TTS는 ko-KR, ja-JP, zh-CN을 인식하며, 그 외 값은 영어(en-US)로 처리됩니다.

코드언어
"ko-KR"한국어
"ja-JP"일본어
"zh-CN"중국어(간체)
"en-US"영어(기본값)

TTS 재생 완료 후 즉시 getUserMedia({ audio: true })를 호출해도 정상 동작합니다. SDK가 TTS 재생 전후로 오디오 포커스를 자동 관리하므로 별도 딜레이 없이 마이크를 바로 사용할 수 있습니다.


STT (음성 인식)

unveilyBridge.stt는 위치 인자로 언어 코드만 받습니다. 결과와 에러는 전역 함수(window.onSTTResult, window.onSTTError)로 전달되며, 콜백 파라미터로 넘기지 않습니다.

start

음성 인식을 시작합니다.

window.unveilyBridge.stt.start("en-US");

window.onSTTResult = function (result) {
  // result.isFinal === false means a partial (real-time) result
  console.log(result.text, result.isFinal);
};

window.onSTTError = function (error) {
  console.error(error.code, error.message);
};

전달되는 객체 구조

// window.onSTTResult(result) — isFinal: false means a partial result
{ "text": "recognized text", "isFinal": true }

// window.onSTTError(error)
{ "code": "PERMISSION_DENIED", "message": "..." }

stop

음성 인식을 중지합니다.

window.unveilyBridge.stt.stop();

필요한 권한 — 마이크

STT는 마이크 권한이 필요합니다.

플랫폼권한
AndroidRECORD_AUDIO — 매니페스트에서 주석 해제하여 활성화
iOSInfo.plistNSMicrophoneUsageDescriptionNSSpeechRecognitionUsageDescription 선언

iOS에서는 첫 STT 호출 시 시스템 마이크 권한 팝업이 자동으로 표시됩니다.


Haptic (햅틱 피드백)

unveilyBridge.hapticsettings.haptic이 활성화되어 있어야 동작합니다.

vibrate

지정한 시간(ms)만큼 진동합니다. 위치 인자로 밀리초 값을 전달합니다.

window.unveilyBridge.haptic.vibrate(200);

pattern

패턴 진동을 실행합니다. JSON 문자열[대기, 진동, 대기, 진동, ...] 배열을 전달합니다.

// JSON string: [wait, vibrate, wait, vibrate, ...]
window.unveilyBridge.haptic.pattern("[0, 100, 50, 200]");

impact

미리 정의된 세기의 임팩트 진동을 실행합니다. iOS에서는 UIImpactFeedbackGenerator, Android에서는 VibrationEffect를 사용합니다.

window.unveilyBridge.haptic.impact("medium");   // "light" | "medium" | "heavy"

접근성 패널

사용자가 직접 접근성 옵션을 조절할 수 있는 패널 UI로, unveilyBridge.accessibilityPanel 네임스페이스로 제어합니다(unveilyBridge.accessibility 별칭도 사용 가능). config.jsonmodules.accessibility.enabled로 활성화됩니다. 패널이 열릴 때 Android는 TYPE_WINDOW_STATE_CHANGED, iOS는 UIAccessibility.screenChanged를 자동 발송하여 스크린 리더(TalkBack/VoiceOver)가 즉시 인식합니다.

Unveily 앱에서 열린 접근성 패널 (Android) — 고대비, 글꼴 크기, 읽어주기, 쉬운 설명, 진동, 탭 고정, 왼손 모드, 한손 모드 컨트롤 그리드
Android
Unveily 앱에서 열린 접근성 패널 (iOS) — 고대비, 글꼴 크기, 읽어주기, 쉬운 설명, 진동, 탭 고정, 왼손 모드, 한손 모드 컨트롤 그리드
iOS

open / close / toggle

window.unveilyBridge.accessibilityPanel.open();
window.unveilyBridge.accessibilityPanel.close();
window.unveilyBridge.accessibilityPanel.toggle();

getSettings

현재 접근성 설정을 읽어옵니다. 콜백 함수명을 문자열로 전달하며, 생략 시 기본값은 onAccessibilitySettingsLoaded입니다.

window.unveilyBridge.accessibilityPanel.getSettings("onAccessibilitySettingsLoaded");

window.onAccessibilitySettingsLoaded = function (settings) {
  console.log(settings.fontSize);      // "normal" | "large" | "extraLarge"
  console.log(settings.highContrast);  // boolean
};

applySettings

설정을 프로그램적으로 적용합니다. getSettings와 동일한 필드를 가진 JSON 문자열을 전달합니다.

window.unveilyBridge.accessibilityPanel.applySettings(JSON.stringify({
  highContrast: true,
  fontSize: "large",
  tts: true,
  easyRead: false,
  haptic: true,
  tabAlwaysShow: false,
  leftHanded: false,
  oneHanded: false
}));

설정 객체

패널에서 사용자가 조절할 수 있는 항목이며, getSettings / applySettings가 공유하는 필드입니다.

설정 키타입설명
highContrastboolean고대비 모드
fontSize"normal" | "large" | "extraLarge"글자 크기
ttsbooleanTTS 활성화 여부
easyReadboolean쉬운 읽기 (단순한 레이아웃으로 전환)
hapticboolean햅틱 피드백 활성화 여부
tabAlwaysShowboolean탭 바 항상 표시 (자동 숨김 비활성화)
leftHandedboolean왼손잡이 모드
oneHandedboolean한손 모드

config.jsonmodules.accessibility.topDownPanel: true로 설정하면 화면 상단에서 내려오는 패널 형태로 표시됩니다.

On this page