Field pipeline for a native-speaker Sango pronunciation corpus: record -> split -> normalize -> validate -> manifest. Python stdlib + ffmpeg.
# sango-audio-pipeline
Field toolchain for building a native-speaker pronunciation corpus for
**Sango** (ISO 639-3: `sag`) — the national language of the Central African
Republic — from nothing more than a phone, a quiet room, and `ffmpeg`.
This is the pipeline behind the audio work for
`MEYNG/sango-vocabulary`
(open trilingual Sango–French–English vocabulary, CC-BY-SA-4.0). It is
deliberately low-tech: no studio, no proprietary tools, no cloud dependency —
so that it can be replicated for any language in a similar zero-resource
situation (Gbaya, Banda, Yakoma, other creoles and lingua francas).
## Pipeline
```
word-list selection gen-top-50-from-jsonl.py vocabulary JSONL → recording queue CSV
│
phone recording session one continuous take, ~2 s silence between words
│
split + normalize splitter.py ffmpeg silencedetect → one MP3 per word,
│ 96 kbps mono, −16 LUFS (EBU R128)
per-file conversion convert-individual-recordings.py for retakes / individual files
│
validation validate-recordings.sh/.ps1 duration, clipping, voice presence
│
manifest gen-manifest.py audio-manifest.json for consuming apps
```
## Requirements
- Python 3.11+ (standard library only)
- `ffmpeg` on `PATH` — check with `ffmpeg -version`
## Quickstart
```bash
# 1. Build the recording queue from the open dataset
# (download vocabulary.jsonl from the MEYNG/sango-vocabulary dataset)
python gen-top-50-from-jsonl.py # → top-50.csv (a ready-made copy is included)
# 2. Record: say each word in queue order, once, naturally,
# with ~2 seconds of silence between words. One continuous take.
# Phone voice-recorder quality (M4A) is sufficient.
# 3. Split the session into per-word MP3s (normalized to −16 LUFS)
python splitter.py recording-2026-04-20.m4a top-50.csv out/audio
# 4. Validate every clip (duration, clipping, voice presen …