speech

Guided Navigation

Guided Navigation (GND) is the JSON tree this library extracts from HTML/XHTML, before turning it into utterances (see Utterance Extraction).

Building a GND document

import { makeGnd } from "@readium/speech";

const gnd = makeGnd(`
  <section epub:type="chapter">
    <h1>Chapter One</h1>
    <p>It was a dark and stormy night.</p>
  </section>
`);
// gnd.guided: GndObject[]
function makeGnd(input: string, mediaType?: GndMediaType): GndDocument;

interface GndDocument {
  links?: unknown[];
  guided: GndObject[];
}

mediaType is "text/html" | "application/xhtml+xml". Omit it to sniff from input (XML declaration, xmlns:epub, XHTML doctype → XHTML; else HTML).

Skip the GndDocument wrapper by calling parseMarkup(html): GndObject[] directly.

Parsing uses the native DOMParser — no HTML/XML library bundled or loaded at runtime.

GndObject

type GndRole = string; // open-ended, see roles.ts

interface GndText {
  language: string;
  plain?: string;
  ssml?: string;
}

interface GndObject {
  role?: GndRole[];
  text?: string | GndText;
  description?: string;
  imgref?: string;
  audioref?: string;
  videoref?: string;
  textref?: string;
  id?: string;
  children?: GndObject[];
}

Footnotes and pagebreaks

Both are read out of narrative order, so the converter handles them specially:

Roles

Three independent sources, mapped in src/gnd/roles.ts:

  1. Element type — <h1> → heading1, <nav> → navigation, <blockquote> → blockquote, etc.
  2. ARIA role — role="doc-chapter" → chapter, role="figure" → figure, etc. role="heading" reads its level from aria-level (default 2).
  3. epub:type — epub:type="chapter" → chapter, epub:type="pagebreak" → pagebreak, etc. (XHTML only, see below).

epub:type requires XHTML

epub:type only means anything in namespace-aware XHTML. Pass a complete XHTML document (xmlns:epub on the root):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
<head><meta charset="utf-8"/><title>...</title></head>
<body>
  <section epub:type="chapter">...</section>
</body>
</html>

ARIA roles and native elements work as plain HTML fragments.

Fixtures

fixtures/ is a language-agnostic conformance suite for this stage plus utterance extraction — see fixtures/README.md and Testing.