CoolFace
Datasetpublic

AfriSpeech/multivoice-synthetic-speech

Synthetic Voice Samples · Africa Synthetic speech. No human speaker was recorded for any clip in this dataset. Generated with afrispeech-synth: text from africa-corpus, normalised to a universal orthography with africa-g2p, spoken by Google Gemini's Live API. 17,010 clips · 38.8 hours · 566 languages · 30 voices Every clip is a distinct sentence — no sentence is repeated Each language is read by up to 30 different voices, one sentence per voice ~1.29 hours per voice… See the full description on the dataset page: https://huggingface.co/datasets/AfriSpeech/multivoice-synthetic-speech.

sourceHugging Facemitupdated 7d agoView on Hugging Face
1likes309downloads
Dataset Card

Synthetic Voice Samples · Africa

Synthetic speech. No human speaker was recorded for any clip in this dataset.

Generated with afrispeech-synth: text from africa-corpus, normalised to a universal orthography with africa-g2p, spoken by Google Gemini's Live API.

  • —17,010 clips · 38.8 hours · 566 languages · 30 voices
  • —Every clip is a distinct sentence — no sentence is repeated
  • —Each language is read by up to 30 different voices, one sentence per voice
  • —~1.29 hours per voice

Audio

Exactly as the model produced it — no resampling, no re-encoding, no conversion.

FormatWAV, 16-bit signed PCM
Sample rate24,000 Hz
Channels1 (mono)
Clip length8.2s mean, 1.4-27.1s

Two ways in

data/*.parquet carries the audio inline for training. audio/ holds the same clips as individual WAV files, which is what the browsable gallery streams and what you want if you need one clip rather than the set. The clips are identical; only the packaging differs.

Loading

python
from datasets import load_dataset

ds = load_dataset("AfriSpeech/multivoice-synthetic-speech", split="train")

twi = ds.filter(lambda r: r["language"] == "twi")     # one language
zephyr = ds.filter(lambda r: r["voice"] == "Zephyr")  # one voice

Rows are shuffled, so language and voice are spread across every shard: streaming the first shard gives a cross-section rather than one language in one voice.

Columns

Column
audiothe clip (24 kHz mono WAV)
textthe sentence as it appears in the corpus
normalised_textwhat the model was actually asked to read (universal orthography)
voicewhich Gemini voice spoke it
languageISO 639-3 code
language_namee.g. Dagbani
familye.g. Niger-Congo
regione.g. West Africa

text and normalised_text differ because universal orthography maps a language's own letters onto the shared set most African languages use — ɔ to o, ɛ to e, gy to j. The model read normalised_text.

What this is not

Recorded speech, a pronunciation reference, or evidence that a language sounds like this. A synthetic clip is a model's guess at an orthography, and quality varies enormously by language — these voices were built for widely-spoken languages and are being asked to read hundreds of others. Treat it as a starting point for bootstrapping, never as ground truth.