sapinsapin/filipinospeechcorpus
Filipino Speech Corpus (FSC) Studio-recorded Filipino read, spontaneous, and word-level speech — 125 speakers, packaged as ready-to-stream Parquet. 313,322 transcribed segments · 65.1 hours · 125 speakers · 16kHz mono This is the Filipino Speech Corpus (Sagum), recorded in a controlled setting and hand/machine transcribed with Transcriber. This repo repackages the original .wav + .trs volumes as segment-level Parquet with inline audio, so you can stream it without… See the full description on the dataset page: https://huggingface.co/datasets/sapinsapin/filipinospeechcorpus.
Filipino Speech Corpus (FSC)
Studio-recorded Filipino read, spontaneous, and word-level speech — 125 speakers, packaged as ready-to-stream Parquet.
<div align="center">
313,322 transcribed segments · 65.1 hours · 125 speakers · 16kHz mono
  
</div>
This is the Filipino Speech Corpus (Sagum), recorded in a controlled setting and hand/machine transcribed with Transcriber. This repo repackages the original .wav + .trs volumes as segment-level Parquet with inline audio, so you can stream it without downloading and parsing XML.
New here? Start with the [30-second quickstart](#30-second-quickstart), then read [Before you train](#-before-you-train) — the segment length distribution will surprise you.
30-second quickstart
from datasets import load_dataset
ds = load_dataset("sapinsapin/filipinospeechcorpus", split="train", streaming=True)
row = next(iter(ds))
print(row["sentence"], row["duration"], row["speech_type"])
# audio arrives decoded as a numpy array at 16kHzFull download (6.9 GB):
ds = load_dataset("sapinsapin/filipinospeechcorpus") # train + test⚠️ Before you train
This corpus is mostly single words, not sentences. The median segment is 0.62 seconds and 95% of segments are under 1.3 s, because 56% of the corpus is machine-pre-segmented word tokens intended for unit-selection synthesis and keyword work. If you load it and train directly, you will train on isolated words.
For sentence-level ASR or TTS you want the read/spontaneous portion with a length filter — which leaves roughly 8,500 utterances (~7 hours):
ds = ds.filter(lambda x:
x["speech_type"] in ("read", "spontaneous")
and 1.5 <= x["duration"] <= 30.0
and x["num_words"] >= 3
)Three more things worth knowing before you spend GPU hours:
What's inside
All statistics on this card are computed from the source corpus transcriptions (313,322 segments); 305,246 of those survive into the published Parquet — the rest are empty turns, control markers, or turns whose audio is missing.
Splits (published rows)
Speech types — the three source volumes, and the reason the length distribution is bimodal:
Duration
Speakers — 125, near-balanced by gender (51.8% male / 48.2% female of segments). Age skews hard young: 97.5% in 20-27, 1.6% in 28-35, 0.9% in 36-43.
Schema
Speaker metadata is decoded from the corpus filename convention (09_xx00xxxx_15A → speaker 09, male, age band 20–27, session 1, set 5A).
Models trained on this data
Reference finetunes, trained by the same pipeline, so you can hear/measure what the corpus supports before committing to your own run:
Both are demonstration baselines on a single 8 GB GPU, not state-of-the-art — they exist to prove the data path end to end and to give you a known-good starting configuration.
Reproduce either in one command:
python finetune_tts.py --dataset fsc --push
python finetune_asr.py --dataset fsc --pushHow it was built
- Parse Transcriber
.trsXML from Volume 6 (Transcriptions) — three directories, one perspeech_type. - Slice each turn out of the corresponding
.wavat its annotatedstart/end, resample to 16 kHz mono. - Drop empty turns and Transcriber control markers (
..,{...}events). - Decode speaker/gender/age from the filename convention.
- Shard to Parquet with audio inline, 90/10 random split.
Of 313,322 transcribed segments in the source, 305,246 survive; the remainder are empty turns, control markers, or turns whose audio is missing.
Pipeline source: `process_fsc_parquet.py`
Limitations
- Not a sentence corpus. See Before you train.
- Read speech is scripted. Prosody reflects reading, not conversation.
- Age and register are narrow — young adults, mostly in one setting.
- Transcription conventions vary between the hand-transcribed and machine-pre-segmented volumes; the machine volume is word-aligned output, not editorial transcription.
- No dialect labels. The corpus is Filipino/Tagalog; regional variation is not annotated.
- Original recording notes flag per-speaker irregularities (e.g. a wrong prompt set given to speaker 66, and several speakers withdrawn from the corpus).
Related datasets
Part of the halohalo Philippine-language speech family:
License, source and citation
The recordings originate from the Filipino Speech Corpus developed by Ramil Sagum. This repackaging is distributed for research use — cite the original corpus, not this repo:
@article{sagumdevelopment,
title={DEVELOPMENT OF A FILIPINO SPEECH CORPUS},
author={Sagum, Ramil}
}Paper: Development of a Filipino Speech Corpus
If you represent the corpus authors and want the terms or attribution changed, please open a discussion on this repo.
Contributing
Philippine languages are under-served in speech ML, and this family is built in the open so others can pick it up. Useful contributions:
- Report bad segments via the Community tab (include
source_file) - Share finetunes trained on it — tag
sapinsapin/filipinospeechcorpusin your model card and it will appear in this repo's "used by" list - Improve the pipeline: github.com/sapinsapin/halohalo
