Skip to content

Repository files navigation

BCI Chinese Syllable-Balanced Reading Corpus — Project Files

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.


Deliverables (hand these to the reader / data-collection tool)

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.

Source / working data

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.

Scripts (pipeline order — maps to the 5 slide boxes)

# 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.)


How to reproduce / regenerate

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

Key design decisions (one line each)

  • 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 rows merge → 387 unique syllables.
  • Off-inventory scrub: nan / me / shai are 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.

Back-test snapshot

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).

About

Syllable-balanced Mandarin reading corpus for BCI speech decoding

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages