ehabnegm/100-hour-Egyptian-dataset-single-speaker
Masri 100h — Egyptian Arabic Single-Speaker Speech Corpus A 100-hour Egyptian Arabic (مصري) single-narrator speech collection — 15,653 released clips at 24 kHz mono, with aligned transcripts. Egyptian Arabic is the most widely understood Arabic dialect and one of the least served by open speech data. Almost every open Arabic corpus is Modern Standard Arabic (MSA) — a register nobody actually speaks at home. This dataset is built for the opposite: natural, spoken, conversational… See the full description on the dataset page: https://huggingface.co/datasets/ehabnegm/100-hour-Egyptian-dataset-single-speaker.
Masri 100h — Egyptian Arabic Single-Speaker Speech Corpus
A 100-hour Egyptian Arabic (مصري) single-narrator speech collection — 15,653 released clips at 24 kHz mono, with aligned transcripts.
Egyptian Arabic is the most widely understood Arabic dialect and one of the least served by open speech data. Almost every open Arabic corpus is Modern Standard Arabic (MSA) — a register nobody actually speaks at home. This dataset is built for the opposite: natural, spoken, conversational Masri, from one consistent voice, at a scale and recording quality that is enough to fine-tune a production text-to-speech model.
العربية: ده داتاسِت مصري بالعامية، ١٠٠ ساعة صوت لمتحدث واحد مع النصوص المتزامنة، جودة ٢٤ كيلوهرتز — متعمل مخصوص عشان تدريب نماذج تحويل النص لكلام (TTS) باللهجة المصرية.
At a glance
Why this dataset
- Dialect, not MSA. Every transcript is written the way Egyptians actually speak —
عايز,بقى,ازاي,مش— not classical Arabic prose. - One voice, 100 hours. Single-speaker corpora of this size barely exist for any Arabic dialect. This is enough for full TTS fine-tuning, not just few-shot voice cloning.
- Studio-consistent audio. All clips come from professionally produced narration on one microphone chain — consistent loudness, no crowd noise, no telephone codecs.
- 24 kHz native. Matches the native sample rate of most modern neural vocoders and codec-based TTS stacks (VoxCPM, XTTS, F5-TTS, Higgs, CosyVoice) — no resampling required.
- Everything is labelled. Per-clip confidence, source video, timestamps, and a
promoflag so you can filter sponsor/subscribe segments out of your training set in one line.
Dataset structure
.
├── README.md ← this dataset card
├── LICENSE
├── CITATION.cff
├── metadata.csv ← flat index for `load_dataset` / the Hub viewer
├── metadata/
│ ├── all.jsonl ← full manifest, 15,653 rows
│ ├── train.jsonl ← 14,790 rows
│ ├── dev.jsonl ← 472 rows
│ ├── test.jsonl ← 391 rows
│ ├── videos.csv ← per-source-video index (247 rows)
│ └── stats.json ← machine-readable corpus statistics
├── scripts/
│ ├── verify_dataset.py ← integrity check on a local copy
│ └── export_ljspeech.py ← convert to LJSpeech layout for TTS trainers
└── clips/
└── <youtube_video_id>/
├── <video_id>_0000.wav
├── <video_id>_0000.txt ← same text as the manifest, for wav+txt trainers
└── manifest.jsonl ← per-video slice of the manifestRecord schema
Every line of metadata/*.jsonl:
{
"id": "-56222xhhbc_0000",
"audio_path": "clips/-56222xhhbc/-56222xhhbc_0000.wav",
"text": "السلام عليكم ورحمه الله وبركاته اول ما بنسمع حاجه عن المصريين القدماء دماغنا دايما بتروح للاهرامات",
"duration": 14.27,
"start": 1.61,
"end": 15.88,
"confidence": 0.975,
"channel": "3shwa",
"video_id": "-56222xhhbc",
"promo": false,
"split": "train"
}metadata.csv carries the same columns, with audio_path renamed to file_name so that 🤗 datasets attaches the decoded audio automatically.
Splits
Splits are disjoint by source video, so no episode leaks between train and evaluation. Assignment is deterministic (stable hash of the video ID) and reproducible.
The Hub viewer exposes everything as one train split — use the split column, or the metadata/*.jsonl files, to get the official partition.
Quickstart
Load with 🤗 datasets
from datasets import load_dataset
ds = load_dataset("ehabnegm/100-hour-Egyption-dataset-single-speaker", split="train")
print(ds[0]["text"])
print(ds[0]["audio"]) # {'array': ndarray, 'sampling_rate': 24000, ...}
# official partition
train = ds.filter(lambda r: r["split"] == "train")
dev = ds.filter(lambda r: r["split"] == "dev")Stream it (no 12 GB download)
ds = load_dataset("ehabnegm/100-hour-Egyption-dataset-single-speaker", split="train", streaming=True)
for row in ds.take(5):
print(row["id"], row["duration"], row["text"][:60])Download the raw files
from huggingface_hub import snapshot_download
snapshot_download(
"ehabnegm/100-hour-Egyption-dataset-single-speaker",
repo_type="dataset",
local_dir="masri-100h",
)Metadata only — a few MB instead of 12 GB:
snapshot_download(
"ehabnegm/100-hour-Egyption-dataset-single-speaker",
repo_type="dataset",
local_dir="masri-100h",
allow_patterns=["metadata/*", "metadata.csv", "*.md"],
)A sensible training filter
The corpus ships unfiltered on purpose. This is the recipe we recommend as a starting point:
import json
rows = [json.loads(l) for l in open("metadata/train.jsonl", encoding="utf-8")]
clean = [
r for r in rows
if r["confidence"] >= 0.95 # drop shaky transcripts → ~13.5k clips
and not r["promo"] # drop sponsor / subscribe reads
and 3.0 <= r["duration"] <= 19.0 # drop fragments
and len(r["text"].split()) >= 5
]
print(len(clean), sum(r["duration"] for r in clean) / 3600, "hours")Export to LJSpeech layout
Most TTS trainers expect LJSpeech-style wavs/ + metadata.csv:
python scripts/export_ljspeech.py --root . --out ljspeech --split train --min-confidence 0.95Statistics
By source programme
Clip duration distribution
2– 4 s 168 ▌
4– 6 s 477 █▊
6– 8 s 505 █▊
8–10 s 516 █▉
10–12 s 470 █▋
12–14 s 869 ███
14–16 s 836 ███
16–18 s 682 ██▍
18–20 s 11,130 ████████████████████████████████████████The segmenter caps utterances at ~19 s, so 71% of clips sit at the ceiling. If your model has a shorter context window, split on the start/end offsets or re-segment from the source.
Transcript statistics
Provenance
Source
Audio is derived from 247 publicly available YouTube episodes across two Egyptian long-form narration programmes:
- عشوائيات (`3shwa`) — popular-science and general-knowledge explainers.
- حكاوي (`7akawi`) — history and storytelling.
Both are hosted by the same narrator, who introduces himself on-air as عمرو عابدين (Amr Abdeen) in 170 of the collected clips.
Build pipeline
- Collect — audio extracted from 247 source episodes.
- Segment — voice-activity detection into utterances of ~2.5–19 s aligned to speech boundaries;
start/endoffsets against the source episode are preserved for every clip. - Transcribe — Whisper-family Arabic ASR; per-clip confidence retained in the
confidencefield. - Normalize — numbers verbalized, punctuation and diacritics stripped, Arabic orthography unified.
- Filter — low-confidence, non-Arabic and implausible character-rate segments dropped.
- Tag — sponsor / subscribe / self-promotional reads flagged as
promorather than deleted, so downstream users decide. - Standardize — all audio encoded to 24 kHz mono 16-bit PCM WAV.
The published corpus is internally consistent and was verified before release: 15,653 WAV files = 15,653 .txt sidecars = 15,653 manifest rows, with zero orphaned files, duplicate IDs or empty transcripts.
Speaker
The corpus was collected in single-speaker mode and all clips are believed to come from the same narrator across both programmes.
⚠️ This has not been verified acoustically (e.g. with speaker embeddings). Guest voices, interview inserts or archival clips may survive in a small number of segments. The channel, video_id and start/end fields are provided so you can audit, filter, or re-verify any subset. If you need a guaranteed-uniform voice, run a speaker-embedding pass and drop the outliers.
Limitations & known issues
- Transcripts are machine-generated. They have not been human-corrected. Expect errors in proper nouns, foreign loanwords, numbers and rapid speech. Filter on
confidencefor stricter subsets. - No diacritics (تشكيل). Text is undiacritized, which is normal for written Egyptian Arabic but means a TTS model must learn vowelization implicitly. Pair with an automatic diacritizer (e.g. CATT) if your architecture needs it.
- No punctuation. Prosody cues from commas and full stops are absent.
- Duration is bunched at the ceiling. 71% of clips are 18–20 s — this favours long-form prosody and under-represents short utterances and one-word responses.
- Read/narration register. This is scripted narration, not spontaneous conversation. It will not teach a model disfluencies, overlapping speech, backchannels or call-centre acoustics.
- Single domain, single voice. Popular-science and history explainers. Not a general-purpose ASR training set, and not suitable on its own for multi-speaker or multi-dialect work.
- Content is not moderated. Transcripts have not been screened for sensitive or controversial statements made in the source episodes.
Intended uses
Well suited to
- Fine-tuning Egyptian Arabic text-to-speech and voice-cloning models.
- Building an Egyptian Arabic voice for conversational agents, IVR and audiobooks.
- ASR adaptation from MSA to Egyptian dialect.
- Dialectal Arabic language modelling, lexicon building, and grapheme-to-phoneme research.
- Prosody, speaking-rate and dialect-phonology research.
Not suited to
- Speaker-verification or anti-spoofing benchmarks (one speaker, no impostor trials).
- Far-field, noisy or telephony ASR (this is clean studio narration).
- Multi-dialect or multi-speaker Arabic modelling without additional data.
- Cloning this narrator's voice for commercial use, impersonation, or any purpose he has not agreed to. See below.
Ethics & responsible use
The audio is derived from third-party YouTube content. It is released for research and non-commercial use under CC BY-NC 4.0, and this release does not transfer any rights in the original recordings, nor any right to the narrator's voice or likeness.
Before you use this dataset, please understand:
- The voice belongs to a real, identifiable person. Synthesizing a recognizable clone of a living person's voice can cause real harm — fraud, defamation, fabricated endorsements.
- Get permission for anything beyond research. Any commercial product, published voice, or public demo built on this voice needs the consent of the original creator.
- Credit the source. Attribute the original channels in any work derived from this data.
- Disclose synthetic audio. If you publish generated speech from a model trained on this corpus, label it as synthetic.
Takedown: if you are the rights holder of any source material here and would like it removed, open a discussion on this repository or contact the maintainer, and it will be taken down promptly.
License
Released under [Creative Commons Attribution-NonCommercial 4.0 International](https://creativecommons.org/licenses/by-nc/4.0/) (CC BY-NC 4.0), covering the transcripts, manifests, segmentation and packaging produced for this release. Rights in the underlying source recordings remain with their original owners. See `LICENSE`.
Citation
@misc{negm_masri100h_2026,
title = {Masri 100h: An Egyptian Arabic Single-Speaker Speech Corpus},
author = {Negm, Ehab},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/datasets/ehabnegm/100-hour-Egyption-dataset-single-speaker}},
note = {100 hours, 15,653 clips, 24 kHz mono, Egyptian Arabic (arz)}
}Changelog
Acknowledgements
Thanks to the creators of عشوائيات and حكاوي for the source material, and to the open-source speech community — Whisper, silero-VAD and 🤗 datasets — whose tooling made this corpus practical to build.
Maintained by [Ehab Negm](https://huggingface.co/ehabnegm). Issues, corrections and pull requests welcome in the Community tab.
