Repository: https://github.com/deepeshaiml/multilingual_speech_evaluation
This project downloads, organizes, and prepares multilingual speech data for evaluating speech-processing systems.
The dataset is prepared for the following evaluation tasks:
- Speech Language Identification, or Speech LID
- Speaker Diarization
- Speaker Embedding and Speaker Verification
- Speaker Gender Classification
- Speech-to-Text Transcription, Mode A
- Multilingual Meeting Transcription, Mode B
The original audio is downloaded from public Hugging Face datasets and then reorganized into task-specific evaluation folders.
The current source datasets are:
google/fleursfacebook/omnilingual-asr-corpus
Additional internal source dataset used for speech-tone evaluation:
synergy-ai-datasets/dataset/multilingual_emotional(MinIO/S3)- MinIO browser path:
https://s3.presight.dev/minio/ui/browser/synergy-ai-datasets/dataset%2Fmultilingual_emotional%2F
For client sharing, use the ASR-only delivery artifacts:
CLIENT_DELIVERY.mdfor the human-readable package, summary metrics, and dataset provenancedelivery_manifest.jsonfor the machine-readable package manifest
Canonical ASR runs in the current client pack:
- Mode A single utterance:
20260805T102821Z - Mode B multilingual meetings:
20260804T061343Z
Note: this repository contains broader speech-task tooling, but the current client delivery pack is intentionally scoped to ASR.
The preparation pipeline is designed to:
- Avoid downloading entire datasets unnecessarily
- Stream only a bounded number of source rows
- Select metadata-diverse samples
- Preserve source metadata
- Create reproducible evaluation sets
- Support multiple languages and regional dialects
- Generate speaker and segment ground-truth annotations
- Continue processing when an individual language or dataset configuration fails
The project uses three main scripts.
download_speech_dataset.py
Purpose:
- Connects to Hugging Face
- Streams speech datasets
- Selects bounded and metadata-diverse samples
- Downloads audio files
- Preserves transcripts and source metadata
- Creates one folder for each language track
Typical location:
download_speech_dataset.py
build_speech_evaluation_tasks.py
Purpose:
- Creates Speech LID evaluation data
- Creates speaker diarization evaluation recordings
- Creates speaker enrollment, test, and verification-trial data
- Creates speaker gender evaluation data
- Creates single-utterance transcription Mode A data
The script preserves an existing speech_transcription/mode_b_multilingual_meeting directory.
Example filename:
build_multilingual_meetings.py
Purpose:
- Creates multi-speaker recordings
- Creates multi-turn recordings
- Includes multiple languages in the same recording
- Generates meeting-style speech sequences
- Generates RTTM diarization labels
- Generates segment-level speaker, language, gender, and transcription labels
- Creates transcription Mode B evaluation data
The meeting audio is produced by concatenating downloaded speech clips with controlled silence between turns.
It does not generate new voices using text-to-speech.
The downloader currently defines the following evaluation tracks.
| Track | Source dataset | Source configuration |
|---|---|---|
| English | google/fleurs |
en_us |
| Bengali | google/fleurs |
bn_in |
| Gujarati | google/fleurs |
gu_in |
| Hindi | google/fleurs |
hi_in |
| Kannada | google/fleurs |
kn_in |
| Kashmiri | facebook/omnilingual-asr-corpus |
kas_Arab |
| Malayalam | google/fleurs |
ml_in |
| Marathi | google/fleurs |
mr_in |
| Nepali | google/fleurs |
ne_np |
| Punjabi | google/fleurs |
pa_in |
| Pakistani Punjabi | facebook/omnilingual-asr-corpus |
pnb_Arab |
| Tamil | google/fleurs |
ta_in |
| Telugu | google/fleurs |
te_in |
| Urdu | google/fleurs |
ur_pk |
| Sindhi | google/fleurs |
sd_in |
| Eastern Balochi | facebook/omnilingual-asr-corpus |
bgp_Arab |
The Pashto track may use multiple configurations.
| Variant | Source dataset | Source configuration |
|---|---|---|
| Southern Pashto | facebook/omnilingual-asr-corpus |
pbt_Arab |
| Northern Pashto | facebook/omnilingual-asr-corpus |
pbu_Arab |
| Central Pashto | facebook/omnilingual-asr-corpus |
pst_Arab |
| Pashto, Afghanistan | google/fleurs |
ps_af |
These configurations are combined under the evaluation track:
Pashto
| Track | Source dataset | Source configuration |
|---|---|---|
| Tagalog | google/fleurs |
fil_ph |
| Persian | google/fleurs |
fa_ir |
| Chinese | google/fleurs |
cmn_hans_cn |
| Hebrew | google/fleurs |
he_il |
| Track | Source dataset | Source configuration |
|---|---|---|
| Gulf-Khaleeji Arabic | facebook/omnilingual-asr-corpus |
afb_Arab |
| Saudi Najdi Arabic | facebook/omnilingual-asr-corpus |
ars_Arab |
| Saudi Hijazi Arabic | facebook/omnilingual-asr-corpus |
acw_Arab |
| Iraqi Arabic | facebook/omnilingual-asr-corpus |
acm_Arab |
| North Iraqi Arabic | facebook/omnilingual-asr-corpus |
ayp_Arab |
| Levantine Arabic | facebook/omnilingual-asr-corpus |
apc_Arab |
| Egyptian Arabic | facebook/omnilingual-asr-corpus |
arz_Arab |
| Omani Arabic | facebook/omnilingual-asr-corpus |
acx_Arab |
| Dhofari-Omani Arabic | facebook/omnilingual-asr-corpus |
adf_Arab |
| Bahrani Arabic | facebook/omnilingual-asr-corpus |
abv_Arab |
| Moroccan Arabic | facebook/omnilingual-asr-corpus |
ary_Arab |
| Algerian Arabic | facebook/omnilingual-asr-corpus |
arq_Arab |
| Tunisian Arabic | facebook/omnilingual-asr-corpus |
aeb_Arab |
| Libyan Arabic | facebook/omnilingual-asr-corpus |
ayl_Arab |
Recommended:
Python 3.10 or later
Check the installed Python version:
python3 --versionInstall the required packages:
python3 -m pip install \
datasets \
huggingface_hub \
fsspec \
httpx \
truststore \
tqdmDepending on the local environment, additional audio-related dependencies may also be needed by Hugging Face datasets.
FFmpeg is required for:
- Converting source audio to WAV
- Converting audio to mono
- Resampling audio to 16 kHz
- Trimming long utterances
- Creating diarization recordings
- Creating multilingual meeting recordings
Install FFmpeg on macOS:
brew install ffmpegConfirm installation:
ffmpeg -versionSome datasets or configurations may require authentication.
Set the Hugging Face token:
export HF_TOKEN="hf_your_token_here"The scripts read the token from:
HF_TOKEN
Do not store a private token directly inside the source code.
The downloader uses truststore so that HTTP clients can use certificates trusted by the macOS system Keychain.
This is useful on corporate systems where HTTPS traffic may pass through a company proxy or certificate authority.
Run the downloader from the project directory:
cd /Users/deepesh.agrawal/Documents/workdir/sdk_and_rayExample:
python3 download_speech_dataset.py \
--samples 100 \
--scan 500 \
--output source_speech_data \
--seed 42Parameters:
| Parameter | Description |
|---|---|
--samples |
Maximum number of saved samples per language track |
--scan |
Maximum number of source rows scanned per language track |
--output |
Output directory |
--seed |
Random seed used for reproducible selection |
--tracks |
Optional subset of language tracks |
The scan value must be greater than or equal to the sample value.
Example for selected languages:
python3 download_speech_dataset.py \
--samples 100 \
--scan 500 \
--output source_speech_data \
--tracks \
English \
Hindi \
Bengali \
"Gulf-Khaleeji Arabic"Language names containing spaces must be quoted.
The downloader uses Hugging Face streaming mode:
streaming=TrueThis prevents the script from intentionally downloading a complete dataset.
For every language track, the script:
- Resolves the configured dataset and language configuration.
- Selects a preferred dataset split.
- Streams up to the configured scan limit.
- Keeps rows that contain a usable transcript.
- Preserves the encoded audio object.
- Selects metadata-diverse samples.
- Saves selected audio files.
- Writes per-language metadata.
- Updates the global manifest and status file.
For FLEURS, the preferred split order is:
validationtesttraindev
For Omnilingual, the preferred split order is:
trainvalidationdevtest
The downloader attempts to avoid selecting highly repetitive data.
It prefers underrepresented values from available metadata fields such as:
- Speaker ID
- Speaker key
- Gender
- Age
- Age group
- Dialect
- Accent
- Region
- Locale
- Country
- Language
- Source configuration
- ISO language code
- Script code
- Glottocode
- Duration range
- Prompt ID
It also strongly prefers unique transcripts.
The available metadata differs by dataset and configuration. A missing field does not cause the downloader to fail.
Metadata diversity improves evaluation coverage, but it does not guarantee perfectly balanced representation.
After downloading, the source directory generally looks like this:
source_speech_data/
├── English/
│ ├── audio/
│ │ ├── 0000_en_us.wav
│ │ ├── 0001_en_us.wav
│ │ └── ...
│ └── metadata.jsonl
│
├── Hindi/
│ ├── audio/
│ └── metadata.jsonl
│
├── Bengali/
│ ├── audio/
│ └── metadata.jsonl
│
├── Gulf-Khaleeji_Arabic/
│ ├── audio/
│ └── metadata.jsonl
│
├── manifest.jsonl
└── status.json
The exact audio extension can differ by source dataset.
Possible extensions include:
.wav.flac.mp3.ogg- Other source-supported formats
Each language folder contains:
metadata.jsonl
JSONL means JSON Lines. Each line is one independent JSON object.
Example:
{
"track": "Hindi",
"source_dataset": "google/fleurs",
"source_config": "hi_in",
"source_split": "validation",
"source_stream_index": 12,
"speaker_id": 104,
"speaker_key": "google/fleurs/hi_in:104",
"gender": 0,
"gender_name": "male",
"transcript": "Reference transcription",
"audio": "audio/0000_hi_in.wav",
"original_audio_path": "source audio location",
"audio_file_size_bytes": 152430
}The exact fields vary by source dataset.
The root file:
manifest.jsonl
contains all successfully saved language rows in one file.
This is useful for:
- Global dataset analysis
- Building unified indexes
- Data validation
- Filtering by language
- Filtering by speaker
- Filtering by gender
- Preparing additional tasks
The root file:
status.json
contains processing information for every language track.
Example information:
- Requested samples
- Candidate count
- Successfully saved samples
- Dataset configurations used
- Missing configurations
- Source errors
- Audio-saving errors
- Completed, partial, or failed state
Example command:
python3 build_speech_evaluation_tasks.py \
--input source_speech_data \
--output evaluation_dataset \
--lid-per-language 100 \
--gender-per-class 100 \
--stt-per-language 100 \
--embedding-speakers 100 \
--embedding-enrollment 1 \
--embedding-tests 2 \
--diarization-recordings 100 \
--diarization-min-speakers 2 \
--diarization-max-speakers 4 \
--diarization-turns-min 8 \
--diarization-turns-max 16 \
--diarization-min-turns-per-speaker 2 \
--overwriteThe --overwrite option removes and rebuilds output directories for the selected tasks.
An existing speech_transcription/mode_b_multilingual_meeting directory is not removed by the remaining-task builder.
evaluation_dataset/
├── speech_language_identification/
│ ├── audio/
│ │ ├── English/
│ │ ├── Hindi/
│ │ ├── Bengali/
│ │ └── ...
│ └── metadata.jsonl
│
├── speaker_diarization/
│ ├── audio/
│ │ ├── diar_00000.wav
│ │ ├── diar_00001.wav
│ │ └── ...
│ ├── rttm/
│ │ ├── diar_00000.rttm
│ │ └── ...
│ ├── segments/
│ │ ├── diar_00000.json
│ │ └── ...
│ ├── metadata.jsonl
│ ├── all_segments.jsonl
│ └── failures.json
│
├── speaker_verification/
│ ├── enrollment/
│ │ ├── spk_0123456789abcdef/
│ │ └── ...
│ ├── test/
│ │ ├── spk_0123456789abcdef/
│ │ └── ...
│ ├── speakers.jsonl
│ ├── enrollment.jsonl
│ ├── test.jsonl
│ └── trials.jsonl
│
├── speaker_gender_classification/
│ ├── audio/
│ │ ├── male/
│ │ ├── female/
│ │ └── other/
│ └── metadata.jsonl
│
├── speech_transcription/
│ ├── mode_a_single_utterance/
│ │ ├── audio/
│ │ │ ├── English/
│ │ │ ├── Hindi/
│ │ │ └── ...
│ │ └── metadata.jsonl
│ │
│ └── mode_b_multilingual_meeting/
│ ├── audio/
│ │ ├── meeting_00000.wav
│ │ └── ...
│ ├── rttm/
│ │ ├── meeting_00000.rttm
│ │ └── ...
│ ├── segments/
│ │ ├── meeting_00000.json
│ │ └── ...
│ ├── transcripts/
│ │ ├── meeting_00000.txt
│ │ └── ...
│ ├── metadata.jsonl
│ ├── all_segments.jsonl
│ └── status.json
│
└── remaining_tasks_status.json
The Speech LID dataset evaluates whether a model can identify the language or dialect spoken in an audio file.
Each audio file contains one utterance and has one reference language label.
speech_language_identification/
├── audio/
│ ├── English/
│ ├── Hindi/
│ ├── Bengali/
│ ├── Gulf-Khaleeji_Arabic/
│ └── ...
└── metadata.jsonl
Example:
{
"sample_id": "utt_b4f8c1a62097b927a231",
"audio": "audio/Hindi/utt_b4f8c1a62097b927a231.wav",
"language": "Hindi",
"language_code": "hi_in",
"text": "Reference transcription",
"speaker_signature": "spk_9b00b36a177a117e",
"gender": "male",
"source_dataset": "google/fleurs",
"source_config": "hi_in",
"source_split": "validation",
"source_stream_index": 12
}This dataset can be used to measure:
- Language classification accuracy
- Dialect classification accuracy
- Confusion between related languages
- Confusion between Arabic dialects
- Performance by audio duration
- Performance by speaker
- Performance by gender metadata
- Performance by dataset source
Recommended metrics:
- Overall accuracy
- Macro-averaged F1 score
- Per-language precision
- Per-language recall
- Per-language F1 score
- Confusion matrix
Macro-averaged metrics are important when language counts are not perfectly balanced.
Speaker diarization answers:
Who spoke when?
The generated diarization recordings contain:
- Multiple speakers
- Multiple turns
- One language per recording
- Silence between turns
- No overlapping speech
- Ground-truth speaker timestamps
- Ground-truth speaker signatures
Keeping these recordings monolingual helps isolate diarization performance from multilingual ASR and LID performance.
Multilingual diarization is covered by transcription Mode B.
speaker_diarization/
├── audio/
├── rttm/
├── segments/
├── metadata.jsonl
├── all_segments.jsonl
└── failures.json
Generated diarization audio normally uses:
- WAV container
- PCM signed 16-bit audio
- Mono channel
- 16,000 Hz sample rate
Example:
audio/diar_00000.wav
Example:
SPEAKER diar_00000 1 0.000000 4.820000 <NA> <NA> spk_9b00b36a177a117e <NA> <NA>
SPEAKER diar_00000 1 5.310000 4.430000 <NA> <NA> spk_c2618c9007f40164 <NA> <NA>
Important RTTM fields:
| Position | Meaning |
|---|---|
SPEAKER |
RTTM record type |
diar_00000 |
Recording ID |
1 |
Channel |
0.000000 |
Segment start time |
4.820000 |
Segment duration |
spk_... |
Reference speaker signature |
Example:
{
"recording_id": "diar_00000",
"audio": "audio/diar_00000.wav",
"segments": [
{
"recording_id": "diar_00000",
"turn_index": 0,
"start_seconds": 0.0,
"end_seconds": 4.82,
"duration_seconds": 4.82,
"speaker_signature": "spk_9b00b36a177a117e",
"language": "Hindi",
"language_code": "hi_in",
"gender": "male",
"text": "Reference transcription"
}
]
}This dataset can be used to measure:
- Speaker-change detection
- Speaker segmentation
- Speaker clustering
- Speaker-count estimation
- Speaker-attributed timing
- Diarization error rate
Recommended metrics:
- Diarization Error Rate, or DER
- Jaccard Error Rate, or JER
- Missed speech
- False-alarm speech
- Speaker confusion
- Speaker-count accuracy
Because the generated data does not contain overlap, it is primarily suitable for non-overlap diarization evaluation.
It should not be treated as a complete evaluation of overlapping-speech diarization.
This dataset supports speaker embedding and speaker verification evaluation.
It is divided into:
- Enrollment audio
- Test audio
- Speaker metadata
- Positive trials
- Negative trials
A speaker signature such as:
spk_9b00b36a177a117e
is a deterministic pseudonymous identifier derived from the source speaker key.
It is used as a ground-truth identity label.
It is not:
- A neural-network embedding
- An acoustic feature vector
- A biometric template generated by the model
- A voiceprint computed from the audio
Your speaker-embedding model must process the audio and generate the actual embedding vectors.
speaker_verification/
├── enrollment/
│ ├── spk_9b00b36a177a117e/
│ └── ...
├── test/
│ ├── spk_9b00b36a177a117e/
│ └── ...
├── speakers.jsonl
├── enrollment.jsonl
├── test.jsonl
└── trials.jsonl
Example:
{
"speaker_signature": "spk_9b00b36a177a117e",
"sample_id": "utt_72ac7319ef72817380ac",
"audio": "enrollment/spk_9b00b36a177a117e/enroll_000_utt_72ac7319ef72817380ac.wav",
"language": "Hindi",
"language_code": "hi_in",
"gender": "male",
"text": "Reference transcription"
}Example:
{
"speaker_signature": "spk_9b00b36a177a117e",
"sample_id": "utt_93b64edcc6d69a36bc21",
"audio": "test/spk_9b00b36a177a117e/test_000_utt_93b64edcc6d69a36bc21.wav",
"language": "Hindi",
"language_code": "hi_in",
"gender": "male",
"text": "Reference transcription"
}Positive trial:
{
"enrollment_speaker_signature": "spk_9b00b36a177a117e",
"test_audio": "test/spk_9b00b36a177a117e/test_000_utt_93b64edcc6d69a36bc21.wav",
"test_speaker_signature": "spk_9b00b36a177a117e",
"target": 1,
"label": "target"
}Negative trial:
{
"enrollment_speaker_signature": "spk_c2618c9007f40164",
"test_audio": "test/spk_9b00b36a177a117e/test_000_utt_93b64edcc6d69a36bc21.wav",
"test_speaker_signature": "spk_9b00b36a177a117e",
"target": 0,
"label": "nontarget"
}This dataset can be used for:
- Speaker verification
- Speaker identification
- Speaker similarity scoring
- Speaker retrieval
- Speaker clustering
- Cross-language speaker comparison
Recommended metrics:
- Equal Error Rate, or EER
- Minimum Detection Cost Function
- False Accept Rate
- False Reject Rate
- Receiver Operating Characteristic
- Precision at K for speaker retrieval
- Top-1 and Top-K speaker-identification accuracy
For a stronger evaluation, enrollment and test utterances should ideally differ in text, recording conditions, and session.
The source datasets may not provide full session information, so session independence cannot always be guaranteed.
This dataset evaluates speaker gender classification when the source dataset contains a usable gender label.
speaker_gender_classification/
├── audio/
│ ├── male/
│ ├── female/
│ └── other/
└── metadata.jsonl
Example:
{
"sample_id": "utt_b4f8c1a62097b927a231",
"audio": "audio/male/utt_b4f8c1a62097b927a231.wav",
"gender": "male",
"language": "Hindi",
"language_code": "hi_in",
"speaker_signature": "spk_9b00b36a177a117e",
"text": "Reference transcription"
}The preparation script does not infer gender from the audio.
It uses only gender or sex metadata supplied by the source dataset.
Rows without a recognized textual gender label are assigned:
unknown
Unknown rows are excluded from the speaker-gender evaluation folder.
Gender labels can be incomplete, inconsistent, or based on limited source categories. They should not be interpreted as a complete representation of gender identity.
This dataset can be used to measure:
- Gender-label classification accuracy
- Per-language classification accuracy
- Performance differences across languages
- Performance differences across audio durations
- Dataset bias and imbalance
Recommended metrics:
- Accuracy
- Macro F1
- Per-class recall
- Per-class precision
- Confusion matrix
- Balanced accuracy
The dataset should also be reviewed for class imbalance before model comparison.
Mode A evaluates standard single-utterance speech-to-text.
Each audio file contains one utterance with one reference transcript.
The expected output is text only.
The model is not required to produce:
- Speaker labels
- Diarization
- Gender
- Segment-level LID
- Speaker embeddings
speech_transcription/
└── mode_a_single_utterance/
├── audio/
│ ├── English/
│ ├── Hindi/
│ ├── Bengali/
│ └── ...
└── metadata.jsonl
Example:
{
"sample_id": "utt_b4f8c1a62097b927a231",
"audio": "audio/Hindi/utt_b4f8c1a62097b927a231.wav",
"text": "Reference transcription",
"language": "Hindi",
"language_code": "hi_in",
"source_dataset": "google/fleurs",
"source_config": "hi_in",
"source_split": "validation",
"source_stream_index": 12
}Mode A can be used to evaluate:
- Monolingual ASR
- Multilingual ASR
- Language-specific transcription quality
- Script-specific transcription quality
- Performance on low-resource languages
- Performance on dialectal speech
Recommended metrics:
- Word Error Rate, or WER
- Character Error Rate, or CER
- Normalized WER
- Normalized CER
- Sentence accuracy
- Empty-output rate
- Hallucination rate
CER is especially useful for languages where tokenization and word boundaries are difficult or inconsistent.
Text normalization rules should be documented before reporting WER or CER.
Mode B evaluates a complete meeting or conversation transcription pipeline.
Each recording may contain:
- Multiple speakers
- Multiple turns
- Multiple languages
- Different speaker genders when metadata is available
- Speaker changes
- Silence between turns
The expected system output may include:
- Speech segments
- Speaker labels
- Speaker embedding signatures or speaker clusters
- Language label for each segment
- Gender label for each segment
- Transcription for each segment
speech_transcription/
└── mode_b_multilingual_meeting/
├── audio/
├── rttm/
├── segments/
├── transcripts/
├── metadata.jsonl
├── all_segments.jsonl
└── status.json
Example:
{
"meeting_id": "meeting_00000",
"turn_index": 1,
"start_seconds": 5.31,
"end_seconds": 9.74,
"duration_seconds": 4.43,
"speaker_signature": "spk_c2618c9007f40164",
"language": "English",
"language_code": "en_us",
"gender": "female",
"text": "Reference English transcription",
"source_dataset": "google/fleurs",
"source_config": "en_us",
"source_split": "validation",
"source_stream_index": 21
}Example:
[00:00:00.000 - 00:00:04.820] spk_9b00b36a177a117e | Hindi | male: Reference Hindi transcription
[00:00:05.310 - 00:00:09.740] spk_c2618c9007f40164 | English | female: Reference English transcription
Mode B can be used to evaluate an end-to-end meeting-processing system.
Possible components include:
- Voice activity detection
- Speaker diarization
- Speaker embedding extraction
- Speaker clustering
- Segment-level language identification
- Segment-level gender classification
- Speech-to-text transcription
- Speaker-attributed transcription
Recommended metrics:
- Diarization Error Rate
- Speaker-attributed WER
- cpWER
- Segment-level LID accuracy
- Segment-level gender accuracy
- Speaker-clustering quality
- Timestamp error
- Segment boundary error
- End-to-end meeting transcription accuracy
The Mode B recordings are meeting-like rather than naturally recorded meetings.
They are created by concatenating unrelated source utterances.
Therefore:
- The turn order is controlled.
- The speakers and languages are controlled.
- The timestamps are accurate.
- The speaker labels are known.
- The utterances may not be semantically related.
- The recording may not sound like a coherent real conversation.
- There is currently no overlapping speech.
- Room reverberation and shared microphone effects are not naturally represented.
- Speakers were originally recorded under potentially different acoustic conditions.
This dataset is useful for controlled system evaluation, but it should be supplemented with natural meeting recordings for production-level validation.
For single-utterance tasks, the preparation script supports:
copy
hardlink
symlink
Default:
--link-mode hardlinkAdvantages:
- Does not duplicate audio data when input and output are on the same filesystem
- Evaluation folders behave like normal files
- Saves disk space
If hard linking fails, the script falls back to copying.
--link-mode symlinkAdvantages:
- Minimal disk usage
- Easy to identify original files
Limitation:
- Moving or deleting the source dataset can break the links
--link-mode copyAdvantages:
- Evaluation data is independent from the source folder
- Easier to archive or transfer
Limitation:
- Requires more disk space
The scripts use a configurable random seed.
Example:
--seed 42Using the same:
- Input files
- Metadata
- Script version
- Parameters
- Random seed
should produce the same or substantially equivalent selection and ordering.
Reproducibility can be affected when:
- Source datasets change
- Hugging Face configurations change
- Input files are added or removed
- File ordering changes
- Metadata fields change
- FFmpeg versions behave differently
- A previous run partially consumed source pools
- Script logic changes
For formal experiments, record:
- Git commit
- Python version
- FFmpeg version
- Package versions
- Command-line arguments
- Dataset build date
- Input manifest checksum
- Random seed
For every dataset build, save a configuration record such as:
{
"build_date": "YYYY-MM-DD",
"download_script": "download_speech_dataset.py",
"evaluation_script": "build_speech_evaluation_tasks.py",
"meeting_script": "build_multilingual_meetings.py",
"input_directory": "source_speech_data",
"output_directory": "evaluation_dataset",
"seed": 42,
"samples_per_language": 100,
"scan_per_language": 500,
"lid_per_language": 100,
"gender_per_class": 100,
"stt_per_language": 100,
"embedding_speakers": 100,
"embedding_enrollment": 1,
"embedding_tests": 2,
"diarization_recordings": 100,
"meeting_recordings": 100,
"sample_rate": 16000
}Before evaluating a model, validate the prepared dataset.
Count JSONL rows:
wc -l evaluation_dataset/speech_language_identification/metadata.jsonl
wc -l evaluation_dataset/speaker_gender_classification/metadata.jsonl
wc -l evaluation_dataset/speech_transcription/mode_a_single_utterance/metadata.jsonlfind evaluation_dataset -type f \
\( -name "*.wav" -o -name "*.flac" -o -name "*.mp3" \) \
| wc -lWhen using symbolic or hard links, the find options may need adjustment depending on how files are materialized.
A simple Python check:
import json
from pathlib import Path
root = Path("evaluation_dataset/speech_lid")
manifest = root / "metadata.jsonl"
missing = []
with manifest.open("r", encoding="utf-8") as handle:
for line in handle:
row = json.loads(line)
audio_path = root / row["audio"]
if not audio_path.exists():
missing.append(str(audio_path))
print("Missing audio files:", len(missing))
for path in missing[:20]:
print(path)Example:
ffprobe \
-hide_banner \
evaluation_dataset/speaker_diarization/audio/diar_00000.wavExpected diarization and Mode B properties usually include:
Audio: pcm_s16le
16000 Hz
mono
For every RTTM segment:
start time >= 0
duration > 0
start time + duration <= recording duration
Speaker signatures in the RTTM file should also exist in the corresponding segment JSON.
The downloaded data is prepared as an evaluation collection, but a strict development/test split may need to be created separately.
For speaker-sensitive tasks, split by speaker rather than by utterance.
Recommended:
development speakers != test speakers
This avoids speaker leakage.
For language identification and transcription, consider splitting by:
- Speaker
- Source dataset
- Source configuration
- Region
- Dialect
- Recording duration
For speaker verification:
- Do not place the same audio clip in enrollment and test.
- Prefer different sessions when session metadata is available.
- Avoid evaluating only same-language trials.
- Include cross-language trials when speakers have multilingual data.
Potential leakage can occur when:
- The same audio appears in training and evaluation
- The same speaker appears in development and test unintentionally
- Duplicate transcripts appear across splits
- The evaluation source was included in the model's training data
- The same source recording is copied into more than one task
- Enrollment and test use near-duplicate audio
- File names expose the reference label
The current folder names intentionally expose labels for convenience.
For blind evaluation, create a separate package where:
- Audio files use anonymous IDs
- Reference metadata is stored separately
- The model sees only the audio and task input
- Labels are hidden until scoring
Example:
blind_eval/
├── input/
│ ├── audio/
│ │ ├── item_000001.wav
│ │ ├── item_000002.wav
│ │ └── ...
│ └── request.jsonl
│
└── reference/
└── ground_truth.jsonl
The system receives only:
blind_eval/input
The scoring process uses:
blind_eval/reference
source_speech_data/status.json
Tracks download and source errors.
evaluation_dataset/remaining_tasks_status.json
Tracks completion for:
- Speech LID
- Diarization
- Speaker embedding/signature
- Speaker gender
- Transcription Mode A
evaluation_dataset/speaker_diarization/failures.json
Contains errors such as:
- FFmpeg conversion failure
- Invalid audio file
- Audio too short after conversion
- Unexpected WAV properties
evaluation_dataset/speech_transcription/mode_b_multilingual_meeting/status.json
Contains:
- Requested meeting count
- Completed meeting count
- Input statistics
- Source language counts
- Configuration
- Failures
- Stop reason
The evaluation data is derived from external public datasets.
Dataset availability, configurations, and metadata may change.
Not every source includes:
- Speaker ID
- Gender
- Age
- Region
- Accent
- Dialect
- Session ID
Tasks that require missing metadata may contain fewer samples.
Speaker IDs are scoped using dataset and configuration identifiers.
This reduces collisions, but it does not prove that two identifiers from different source configurations represent different physical people.
Gender labels are inherited from source metadata.
They are not inferred from audio and may contain limited categories.
Diarization and Mode B recordings are produced from concatenated utterances.
They do not fully reproduce:
- Natural meeting acoustics
- Cross-talk
- Overlapping speech
- Background noise
- Shared microphones
- Room impulse responses
- Natural conversational context
- Interruptions
- Backchannels
- Speaker movement
Language and dialect labels are based on the configured dataset track.
Some closely related dialects may be difficult to separate acoustically.
Some speakers may also code-switch inside an utterance even when the dataset provides one primary language label.
Source transcripts may differ in:
- Punctuation
- Number formatting
- Casing
- Unicode normalization
- Diacritics
- Script conventions
- English loanwords
- Hesitation markers
The evaluation pipeline should define normalization rules before calculating WER or CER.
Before distributing or using the prepared dataset, review the dataset cards and licenses for:
google/fleurs
facebook/omnilingual-asr-corpus
The preparation scripts do not change the original licensing terms.
The generated folders contain reorganized or derived copies of source data and should be handled according to the original dataset terms.
Do not assume that all source configurations have identical redistribution conditions.
Recommended actions:
- Record the source dataset name for every sample.
- Preserve source metadata.
- Preserve original attribution.
- Review commercial-use restrictions.
- Review redistribution restrictions.
- Review personal-data and voice-data requirements.
- Avoid publishing private Hugging Face access tokens.
- Confirm legal and organizational approval before external release.
Speech data may be considered personal or biometric data in some jurisdictions and organizational policies.
Speaker embeddings can be used for speaker recognition and identity comparison.
Recommended safeguards:
- Use pseudonymous speaker signatures
- Do not attempt to recover personal identities
- Restrict access to speaker-verification data
- Store generated embeddings securely
- Avoid using the dataset for surveillance
- Follow applicable privacy and biometric-data policies
- Document retention and deletion procedures
- Avoid making sensitive inferences from voice recordings
cd /Users/deepesh.agrawal/Documents/workdir/sdk_and_raypython3 download_speech_dataset.py \
--samples 100 \
--scan 500 \
--output source_speech_data \
--seed 42python3 build_speech_evaluation_tasks.py \
--input source_speech_data \
--output evaluation_dataset \
--lid-per-language 100 \
--gender-per-class 100 \
--stt-per-language 100 \
--embedding-speakers 100 \
--embedding-enrollment 1 \
--embedding-tests 2 \
--diarization-recordings 100 \
--diarization-min-speakers 2 \
--diarization-max-speakers 4 \
--diarization-turns-min 8 \
--diarization-turns-max 16 \
--overwritepython3 build_multilingual_meetings.py \
--input source_speech_data \
--output evaluation_dataset \
--meetings 100 \
--min-speakers 2 \
--max-speakers 4 \
--min-languages 2 \
--max-languages 4 \
--turns-min 10 \
--turns-max 18 \
--min-turns-per-speaker 2 \
--gap-min-ms 200 \
--gap-max-ms 900 \
--overwritecat source_speech_data/status.jsoncat evaluation_dataset/remaining_tasks_status.jsoncat evaluation_dataset/speech_transcription/mode_b_multilingual_meeting/status.jsonfind evaluation_dataset -type f | sort| Task | Input | Expected output | Main reference file |
|---|---|---|---|
| Speech LID | Single audio utterance | Language or dialect label | speech_language_identification/metadata.jsonl |
| Diarization | Multi-speaker recording | Speaker timestamps and clusters | RTTM and segment JSON |
| Speaker embedding | Enrollment and test audio | Similarity score or embedding | trials.jsonl |
| Speaker gender | Single audio utterance | Gender metadata class | speaker_gender_classification/metadata.jsonl |
| Transcribe Mode A | Single audio utterance | Transcript | speech_transcription/mode_a_single_utterance/metadata.jsonl |
| Transcribe Mode B | Multilingual meeting audio | Segments, speaker, language, gender, and transcript | RTTM, segment JSON, and transcript |
This evaluation dataset is intended to provide a controlled and reproducible framework for testing multilingual speech systems.
It is especially useful for:
- Initial model benchmarking
- Regression testing
- Comparing model versions
- Measuring language-specific performance
- Testing integrated speech pipelines
- Identifying low-resource-language failures
- Evaluating speaker and language segmentation
- Creating automated quality gates
For final production validation, this dataset should be supplemented with:
- Natural meetings
- Real telephone calls
- Noisy recordings
- Far-field microphones
- Overlapping speech
- Code-switching
- Different acoustic environments
- Unseen speakers
- Unseen domains
- Human-reviewed transcripts and annotations