Veydrin Language Data Standard
An open, offline-first data format for a single language-learning lesson. Language-agnostic and audio-first: a set of items, each a source-language cue and one target-language variant per declared dialect, with a register, a pronunciation aid, and open-licensed audio that carries its attribution, a text alternative, and its provenance.
VLDS specifies one lesson: the smallest unit a learner practises. A lesson is an ordered set of items. Each item pairs a cue in the language the learner already reads with the phrase to produce in the language being learned, given once per dialect the lesson teaches, plus an optional pronunciation aid and optional audio. VLDS is the content layer only. How lessons are packaged, distributed, discovered, or scheduled for review is out of scope and belongs to other layers.
Four principles decide every field:
vlds-v1.0.schema.json (JSON Schema 2020-12).
1.x line, but the standard is honestly labelled a draft until a second independent implementation exists.
VLDS covers the content of one lesson: its identity, the language and dialects it teaches, its items, and the text, pronunciation, and audio of each item. It is intended for beginner-to-advanced spoken-language curricula, community-authored courses, and offline apps.
VLDS does not try to be:
cymanfa.pack extension, not VLDS. A lesson references no pack; a pack references lessons.VLDS is a content standard whose nearest neighbours are complementary, not competitive. A lesson can be packaged for a learning-management system as Common Cartridge and integrated over LTI 1.3; practice events can be emitted as xAPI 2.0 (IEEE 9274.1.1-2023); catalogue records can be expressed in LOM or Dublin Core; scored variants can be authored in QTI 3.0. VLDS deliberately does not absorb any of these. It is the small, portable, offline unit they can each wrap.
A VLDS document is one lesson object.
| Field | Type | Req? | Description |
|---|---|---|---|
vlds_version | string | req | Specification version, a "1.x" string. Consumers MUST accept any lesson whose major number they recognise. |
id | string | req | Stable lesson identifier, unique within its pack. |
language | string | req | BCP 47 tag of the target language taught, e.g. "cy". A language with no ISO code uses a private-use tag such as "qaa". |
title | lang_map | req | Lesson title, one entry per source language (§7). |
dialects | dialect[] | req | Ordered, non-empty list of the dialects this lesson provides (§4). A language with no dialect axis declares a single dialect, recommended id "std". |
voices | voice[] | opt | Declared voices (§4). When present, every audio map key MUST be one of these ids. |
items | item[] | req | The lesson's items, in order (§5). At least one. |
_* | any | opt | Private annotation keys, prefixed with an underscore (§8). |
No other top-level keys are permitted, except underscore-prefixed annotations.
A dialect is one variety of the target language the lesson teaches. The set is declared once at the top of the lesson and referenced by id in each item.
| Field | Type | Req? | Description |
|---|---|---|---|
id | string | req | Pack-chosen token, e.g. "north". Unique within the lesson. Use "std" for a language with no dialect axis. |
tag | string | opt | A single BCP 47 tag for the dialect. Private-use subtags (e.g. "cy-x-north") are permitted but not interoperable. |
label | lang_map | req | Display label, one entry per source language. |
A voice is a named speaker or synthetic voice. Declaring voices lets a lesson offer the same phrase in more than one voice and lets a consumer let the learner choose.
| Field | Type | Req? | Description |
|---|---|---|---|
id | string | req | Voice identifier, e.g. "female". Audio maps key on this id. |
label | lang_map | opt | Display label per source language. |
gender | enum | opt | female · male · neutral. |
An item is one thing to practise: a cue, and the target-language variant for each declared dialect.
| Field | Type | Req? | Description |
|---|---|---|---|
id | string | req | Item identifier, unique within the lesson. |
cue | lang_map | req | The prompt, in one or more source languages. A learner whose source language is Welsh can be given a Welsh cue rather than an English one. |
register | string | req | The register of this item. An open string so any language can name its own registers; "formal" and "colloquial" are the recommended defaults, mapped to LexInfo register individuals. See the limitation in §11. |
cue_audio | audio_clip | opt | Audio for the cue itself (§6). |
targets | map | opt | Map of dialect id to that dialect's variant. Keys MUST be declared dialect ids. |
shared | variant | opt | A single variant used for any declared dialect that has no targets entry. Use it for phrases that do not vary by dialect, so identical variants are not duplicated. |
targets, or the item MUST provide a shared variant to stand in for it. A lesson that declares a dialect it never teaches is invalid. This rule spans two fields and cannot be expressed in JSON Schema alone; it is a conformance criterion (P4) a validator MUST enforce.
A variant is the phrase to say in one dialect, with its pronunciation and audio.
| Field | Type | Req? | Description |
|---|---|---|---|
text | string | req | The phrase to say, in Unicode NFC. |
pronunciation | object | opt | ipa (IPA, BCP 47 fonipa) and/or respell, a respelling aid. See §11. |
license | enum | opt | SPDX id of the text's licence when it differs from the pack's content licence, e.g. a sentence ingested from an upstream corpus. |
attribution | object | opt | Credit for the text. REQUIRED when license is any CC-BY variant. |
source | string | opt | URI of an upstream record this text comes from, e.g. a Wikidata Lexeme sense or a community-corpus sentence. |
audio | map | opt | Map of declared voice id to an audio clip (§6). At least one entry when present. |
An audio clip is a single recording or synthesis of a phrase, carrying everything a lawful, accessible, honest reuse needs: the source, the licence, the attribution, a text alternative, and whether a human or a machine produced it.
| Field | Type | Req? | Description |
|---|---|---|---|
src | string | req | App-relative path or URL to the audio. Omitting the whole clip degrades to text and is not a violation; a present clip MUST name its source. |
license | enum | req | SPDX id from the open allow-list (§7). |
source_type | enum | req | human (IPTC digitalCapture) or synthetic (IPTC trainedAlgorithmicMedia). Machine-detectable provenance, required so a consumer or regulator can tell recorded speech from generated speech. |
attribution | object | opt | Credit. REQUIRED when license is any CC-BY variant; optional for CC0. |
transcript | string | opt | Text alternative for the audio (WCAG 2.2 SC 1.2.1). A consumer that finds no transcript MUST use the variant text as the transcript. |
generated_by | string | opt | For synthetic audio: engine, voice, and version. |
provisional | boolean | opt | SHOULD be true while audio is synthetic and not yet human-reviewed. |
modified | boolean | opt | Whether the clip was edited after capture or synthesis. |
modification_note | string | opt | What was changed. REQUIRED when modified is true. |
The attribution object (used by clips and by ingested text) is name (required), and optional url and title. name credits a person, pseudonym, or organization; see the privacy note in §10.
A one-item Welsh lesson teaching North and South, in a female voice, with synthetic audio marked provisional. It validates against the VLDS v1.0 schema. lang_map values are maps of BCP 47 tag to an NFC string; the open-licence enum is the SPDX allow-list (CC0 and the CC-BY / CC-BY-SA versions only, never NonCommercial or NoDerivatives).
{
"vlds_version": "1.0",
"id": "seed-01",
"language": "cy",
"title": { "en": "Greetings and small talk", "cy": "Cyfarch a sgwrsio" },
"dialects": [
{ "id": "north", "tag": "cy-x-north", "label": { "en": "North", "cy": "Gogledd" } },
{ "id": "south", "tag": "cy-x-south", "label": { "en": "South", "cy": "De" } }
],
"voices": [ { "id": "female", "gender": "female" } ],
"items": [
{
"id": "bore-da",
"cue": { "en": "good morning" },
"register": "colloquial",
"shared": {
"text": "bore da",
"pronunciation": { "respell": "BOR-eh dah", "ipa": "/ˈbɔrɛ daː/" },
"audio": {
"female": {
"src": "lessons/audio/seed-01/bore-da-female.mp3",
"license": "CC0-1.0",
"source_type": "synthetic",
"generated_by": "piper cy_north 1.0",
"provisional": true
}
}
}
}
]
}
Here bore da is identical in both dialects, so a single shared variant covers north and south rather than repeating them under targets. An item whose wording differs by dialect gives one entry per dialect id under targets instead.
VLDS is deliberately closed: no undeclared keys are allowed anywhere, so a typo is an error rather than silently ignored data. The one escape is annotation. Any object MAY carry keys whose names begin with an underscore (_). These are private annotations, not part of the wire format.
_note for different purposes; a consumer MUST NOT rely on an annotation authored by a different producer.extensions namespace with ownership and collision rules. VLDS expects a single, curated authoring path rather than arbitrary third-party payloads inside a lesson, so it offers only private annotations and pushes anything interoperable into a versioned field. This is a deliberate limitation, recorded in §11.
The version is vlds_version, a MAJOR.MINOR string. v1.0 is the first release.
$id; it does not retroactively invalidate v1 documents.1.x line. New capability arrives as new optional keys, never by repurposing or renaming an existing one.A lesson is data from a potentially untrusted author, especially a community-contributed or downloaded one. A consumer MUST treat every string (text, cue, transcript, labels, notes) as untrusted input and MUST NOT render it as markup or evaluate it. src and source are author-supplied URIs: a consumer SHOULD constrain src to expected schemes and origins before fetching, and MUST fail safe (degrade to text) on a clip that does not load, rather than blocking the lesson.
The attribution.name field, and a personal generated_by or url, can carry a real person's name and a link to them. This is the only personal data VLDS defines, and it is present by design, because open-licence attribution legally requires it. Authors SHOULD prefer a pseudonym or an organization where a contributor wishes it, and consumers republishing lessons MUST preserve attribution rather than stripping or altering it. VLDS carries no learner data of any kind: it is content, not a record of anyone's activity.
A consumer SHOULD bound the size and item count of a lesson it will load, so a hostile document cannot exhaust memory.
pronunciation.respell is a "sounds-like" aid written for one source language (in the reference pack, English), and it is not keyed by source language the way cue is. ipa is the language-neutral field; a future MINOR may key respell by source language.register is a free string rather than a closed enum, with formal and colloquial as recommended, LexInfo-mapped defaults. The cost is that two packs can spell the same register differently; interoperability relies on the recommended values.source_type and generated_by, not cryptographically signed. A future MINOR may add an optional C2PA content-credentials reference for tamper-evident provenance; v1.0 does not carry one.An implementation claims VLDS v1.0 conformance as a Producer, a Consumer, or both. The machine-readable schema at vlds-v1.0.schema.json checks structure; the criteria below add the cross-field and normalization rules a schema cannot express. Each criterion has a stable identifier.
Producer, a tool that emits VLDS
vlds_version to a "1.x" string.id, a BCP 47 language, title, a non-empty dialects array, and a non-empty items array, and MUST NOT include an undeclared key except an underscore annotation.targets entry or by the item's shared variant.voices is declared, every key of every audio map MUST be one of the declared voice ids.license is a CC-BY variant MUST carry attribution with a non-empty name.source_type; synthetic clips SHOULD set provisional true until human-reviewed, and a modified clip MUST carry a modification_note.license MUST be an SPDX id on the allow-list (CC0, or a CC-BY / CC-BY-SA version). NonCommercial and NoDerivatives licences MUST NOT appear.Consumer, a tool that reads VLDS
vlds_version major it recognises, ignoring unknown fields from a later MINOR and all underscore annotations.transcript, the consumer MUST use the variant text as the clip's text alternative.targets[dialect] or, failing that, the item's shared variant.Conformance vectors accompany this specification in the examples/ directory beside the schema: a set of valid lessons that every consumer MUST accept, and invalid lessons (a missing required field, an uncovered dialect, an undeclared voice key, a CC-BY clip with no attribution, a non-NFC string, a NonCommercial licence) that every conforming validator MUST reject, one per criterion above. The reference implementation exercises these vectors in its VLDS conformance suite.
| Item | One thing a learner practises: a cue and its target-language variant per dialect. |
| Cue | The prompt shown or spoken in a language the learner already reads, keyed by source language. |
| Variant | The phrase to produce in the target language for one dialect, with its pronunciation and audio. |
| Dialect | A declared variety of the target language. Named as data by the pack, not fixed by the format. |
| Register | The social level of a phrase, e.g. formal or colloquial. |
| lang_map | A map of BCP 47 language tag to a non-empty NFC string, used wherever text is language-keyed. |
| Provenance | Whether audio was captured from a human or generated by a machine, and by what, per source_type. |
| NFC | Unicode Normalization Form C, the canonical composed form required for all text (UAX #15). |
| Reference | Role |
|---|---|
| JSON Schema 2020-12 | The authoritative schema dialect for vlds-v1.0.schema.json. |
| RFC 2119 / RFC 8174 | Requirement keywords (BCP 14). |
| BCP 47 / RFC 5646 | Language and dialect tags, and the fonipa subtag for IPA. |
| Unicode UAX #15 | Normalization Form C, required for all text. |
| SPDX License List | The identifiers used by every license field. |
| Creative Commons 4.0 (and ported versions) | The legal terms behind the CC0 / CC-BY / CC-BY-SA allow-list. |
| WCAG 2.2 SC 1.2.1 | Audio-only text alternative, the basis for transcript and its fallback. |
| IPTC digitalSourceType | The controlled vocabulary behind source_type (digitalCapture / trainedAlgorithmicMedia). |
| Reference | Relationship |
|---|---|
| VODS v1.0 | The Veydrin envelope that packages lessons into a distributable pack; the layer above VLDS. |
| 1EdTech QTI 3.0 | Assessment authoring; the scored-question domain VLDS is not. |
| xAPI 2.0 (IEEE 9274.1.1-2023) / cmi5 | Learning-activity records a consumer can emit; VLDS carries none. |
| IEEE 1484.12.1 LOM / Dublin Core | Catalogue metadata for discovery; complementary, not carried here. |
| Common Cartridge / LTI 1.3 | Packaging and LMS integration a lesson can be wrapped for. |
| IPA / OntoLex-Lemon & LexInfo | Pronunciation and register vocabularies VLDS points at. |
| EU AI Act Art. 50 / EN 301 549 / Section 508 | Why machine-detectable AI-audio labelling and a text alternative are required, not optional, for a public-sector-facing standard. |
| C2PA Content Credentials | Candidate for a future signed-provenance field (§11). |
| Version | Date | Changes |
|---|---|---|
1.0 | 2026-08-29 | Initial release. Language-agnostic lesson object: declared dialects and voices; items with a language-keyed cue, an open-string register, per-dialect and shared variants; per-clip open licence, attribution, transcript, and source_type provenance; Producer criteria P1 through P8 and Consumer criteria C1 through C5; JSON Schema 2020-12. |