A reading script for BCI syllable-level decoding: 195 natural sentences covering all 387 toneless Mandarin syllables in the target inventory, each read 30× (25 speaking + 5 back-testing), for a total of 59,970 syllable samples (< 60k budget). All 387 syllables meet their target; 0 missing, 0 off-inventory.
| File | What it is |
|---|---|
朗读句子稿_reading_script.txt |
The reading script. 195 numbered sentences + header instructions. Print this for the patient. |
corpus_sentences.csv |
Machine-readable corpus: 编号, 句子, 无调拼音, 音节数, 朗读次数(30), 该句音节样本数. Import into the collection software. |
coverage_report.csv |
Per-syllable audit: 音节, 模型分配目标, 基础目标(round(目标/30)), 实际出现次数, 朗读30遍样本数, 样本-目标. |
Algorithm_Speaker_Notes.md |
English speaker notes for the group-meeting algorithm section. |
| File | What it is |
|---|---|
bci_balanced_syllables.csv (your upload) |
Input: 389 rows of 音节, 自然频率, 模型分配次数. |
sentences_short.txt |
Master sentence source (one line per original sentence; 。 marks internal splits). Edit here, then regenerate. |
helper.json |
Auto-built lookup: for each syllable, its base target + a natural word + candidate common characters. Used to author/backfill rare syllables. |
| # | Script | Slide box | Role |
|---|---|---|---|
| 0 | pyutil.py |
Box 3 | Shared toneless-pinyin normalizer: ü→v, lüe/nüe→lue/nue, tone-digit strip, heteronym overrides (佛→fo, 崖→yai, 谁→shei). Every other script imports this. |
| 1 | build_targets.py |
Box 3 | Parse CSV → merge duplicates → base_target = round(count/30); build the helper.json syllable→char/word map. |
| 2 | build_corpus.py |
Box 4 | Greedy multiset-cover over a natural word/phrase pool (the word-bank variant); minimizes overshoot. |
| 3 | verify_sentences.py |
Box 2/4 | Coverage checker for a sentences file: totals, missing, below-target, off-inventory flags, budget. Run after any edit. |
| 4 | minimize.py |
Box 4 | Keep the smallest covering subset that still meets every base target (drops redundant sentences to stay under budget). |
| 5 | gen_final.py |
Box 2 | Split lines into individual sentences and emit the three deliverables. |
| 6 | backtest.py |
Box 4 | Final validation off the delivered CSV + reading-time estimate. |
(An earlier word-bank variant is in corpus.csv / corpus_raw.json / build_corpus.py — kept for comparison; the shipped product is the sentence version.)
Requires Python with pypinyin and jieba (pip install pypinyin jieba).
python3 build_targets.py # -> helper.json, base targets
# (author / edit sentences in sentences_short.txt)
python3 verify_sentences.py sentences_short.txt # coverage + off-inventory audit
python3 gen_final.py # -> reading_script.txt, corpus_sentences.csv, coverage_report.csv
python3 backtest.py # final numbers + time estimate- base_target = round(target / 30): read-count is fixed at 30, so per-syllable totals are multiples of 30; round() lands each closest to its model target.
- Toneless, tone-independent decoder: the two
lürows merge → 387 unique syllables. - Off-inventory scrub:
nan / me / shaiare NOT in the 387-set, so characters voicing them are removed (the decoder has no label for them). - Sentences over word-list: more natural to read; cost is over-sampling of function syllables (de/le/yi/shi), accepted and within the 60k budget.
195 sentences · 1,999 base syllables · 59,970 samples · 387/387 covered · 0 missing · 0 off-inventory · 328/387 ≥ model target (rest short only by 30-quantization) · est. reading time ~4.5 h (continuous) to ~8 h (normal pace).