CoolFace
Datasetpublic

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.

sourceHugging Facecc-by-nc-4.0updated 2mo agoView on Hugging Face
11likes4.9kdownloads
Dataset Card

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

Total audio100 hours
Clips15,653
Source videos247
Speaker1 narrator (see Speaker)
LanguageEgyptian Arabic — arz / ar-EG
Audio formatWAV · PCM signed 16-bit LE · 24 kHz · mono
Clip length2.5 – 19.0 s (median 18.5 s)
TranscriptsMachine-generated, normalized, undiacritized
Words / vocabulary612,708 tokens · 62,641 unique
Speaking rate~142 words / minute
Total size12.41 GB
LicenseCC BY-NC 4.0

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 promo flag 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 manifest

Record schema

Every line of metadata/*.jsonl:

json
{
  "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"
}
FieldTypeDescription
idstringUnique clip ID, <video_id>_<4-digit index>
audio_pathstringPath to the WAV, relative to the repo root
textstringTranscript — Egyptian Arabic, normalized, no diacritics, no punctuation
durationfloatClip length in seconds
start / endfloatOffset of the clip inside the source video, in seconds
confidencefloatASR confidence for the clip, 0–1 (median 0.975)
channelstringSource programme — 3shwa or 7akawi
video_idstring11-character source video ID
promobooltrue for sponsor / subscribe / self-promo segments (604 clips)
splitstringtrain, dev or test

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.

SplitClipsVideosClip hours
train14,79023867.82
dev47242.20
test39151.79
Total15,65324771.81

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

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

python
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

python
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:

python
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:

python
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:

bash
python scripts/export_ljspeech.py --root . --out ljspeech --split train --min-confidence 0.95

Statistics

By source programme

ChannelVideosClipsClip hoursMedian clipMedian conf.
3shwa — عشوائيات19110,28247.5818.47 s0.975
7akawi — حكاوي565,37124.2318.45 s0.974

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

MetricValue
Total words612,708
Unique word forms62,641
Total characters3,336,977
Characters per clip (min / median / max)12 / 231 / 323
Speaking rate142.2 wpm
Clips flagged promo604 (3.9%)
ASR confidence (min / p05 / median)0.557 / 0.939 / 0.975

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

  1. 1.Collect — audio extracted from 247 source episodes.
  2. 2.Segment — voice-activity detection into utterances of ~2.5–19 s aligned to speech boundaries; start / end offsets against the source episode are preserved for every clip.
  3. 3.Transcribe — Whisper-family Arabic ASR; per-clip confidence retained in the confidence field.
  4. 4.Normalize — numbers verbalized, punctuation and diacritics stripped, Arabic orthography unified.
  5. 5.Filter — low-confidence, non-Arabic and implausible character-rate segments dropped.
  6. 6.Tag — sponsor / subscribe / self-promotional reads flagged as promo rather than deleted, so downstream users decide.
  7. 7.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 confidence for 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

bibtex
@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

VersionDateNotes
1.0.02026-08-08First public release of the 100-hour collection. Unified manifests, video-disjoint splits, corpus statistics, verification and export scripts. Audio and transcripts unchanged from the internal build.

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.

ehabnegm/100-hour-Egyptian-dataset-single-speaker · CoolFace