abedbanna commited on
Commit
0f2efa2
·
verified ·
1 Parent(s): df47039

Paper release v1: benchmark/deployment modes, use_filter, pinned revisions, analysis package, predictions and 8-best lists (no reference transcripts)

Browse files
Files changed (36) hide show
  1. .gitattributes +3 -0
  2. README.md +17 -2
  3. analysis/README.md +36 -0
  4. analysis/attach_references.py +109 -0
  5. analysis/build_release.py +51 -0
  6. analysis/cpu_timing.py +57 -0
  7. analysis/results.json +1786 -0
  8. analysis/reviewer_analyses.py +388 -0
  9. paper_artifacts/README.md +17 -0
  10. paper_artifacts/audar/audar_casablanca_test.jsonl +0 -0
  11. paper_artifacts/audar/audar_commonvoice_test.jsonl +0 -0
  12. paper_artifacts/audar/audar_masc_test_clean.jsonl +0 -0
  13. paper_artifacts/audar/audar_masc_test_noisy.jsonl +0 -0
  14. paper_artifacts/audar/audar_mgb2_test.jsonl +0 -0
  15. paper_artifacts/audar/audar_sada_test.jsonl +0 -0
  16. paper_artifacts/audar/audarfix_casablanca_test.jsonl +0 -0
  17. paper_artifacts/audar/audarfix_commonvoice_test.jsonl +0 -0
  18. paper_artifacts/audar/audarfix_masc_test_clean.jsonl +0 -0
  19. paper_artifacts/audar/audarfix_masc_test_noisy.jsonl +0 -0
  20. paper_artifacts/audar/audarfix_mgb2_test.jsonl +0 -0
  21. paper_artifacts/audar/audarfix_sada_test.jsonl +0 -0
  22. paper_artifacts/base/base_casablanca_test.jsonl +0 -0
  23. paper_artifacts/base/base_cv_commonvoice_test.jsonl +0 -0
  24. paper_artifacts/base/base_masc_test_clean.jsonl +0 -0
  25. paper_artifacts/base/base_masc_test_noisy.jsonl +0 -0
  26. paper_artifacts/base/base_mgb2_test.jsonl +0 -0
  27. paper_artifacts/base/base_sada_test.jsonl +0 -0
  28. paper_artifacts/nbest/casablanca_test.jsonl +0 -0
  29. paper_artifacts/nbest/commonvoice_test.jsonl +3 -0
  30. paper_artifacts/nbest/dev_saudi_podcasts.jsonl +8 -0
  31. paper_artifacts/nbest/dev_youtube_najdi.jsonl +0 -0
  32. paper_artifacts/nbest/masc_test_clean.jsonl +3 -0
  33. paper_artifacts/nbest/masc_test_noisy.jsonl +3 -0
  34. paper_artifacts/nbest/mgb2_test.jsonl +0 -0
  35. paper_artifacts/nbest/sada_test.jsonl +0 -0
  36. sygma_asr.py +53 -6
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ paper_artifacts/nbest/commonvoice_test.jsonl filter=lfs diff=lfs merge=lfs -text
37
+ paper_artifacts/nbest/masc_test_clean.jsonl filter=lfs diff=lfs merge=lfs -text
38
+ paper_artifacts/nbest/masc_test_noisy.jsonl filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -66,11 +66,26 @@ Sygma improves the base model in every group. With equal loop protection, Audar
66
  # pip install "transformers==4.57.6" torch soundfile librosa huggingface_hub sentencepiece
67
  from sygma_asr import SygmaASR
68
 
69
- asr = SygmaASR(device="cuda") # downloads the Cohere base model
70
  print(asr.transcribe(["clip.wav"]))
71
  ```
72
 
73
- `SygmaASR(..., repair=True)` adds a fallback re-decode when all 8 hypotheses are degenerate. It is **not** part of the benchmarked configuration above.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
 
75
  ## Limitations
76
 
 
66
  # pip install "transformers==4.57.6" torch soundfile librosa huggingface_hub sentencepiece
67
  from sygma_asr import SygmaASR
68
 
69
+ asr = SygmaASR(device="cuda") # mode="benchmark" (default); downloads the pinned Cohere revision
70
  print(asr.transcribe(["clip.wav"]))
71
  ```
72
 
73
+ ### Modes
74
+
75
+ | Mode | Word count for the bonus | All 8 hypotheses degenerate | Six-set average WER |
76
+ |---|---|---|---|
77
+ | `mode="benchmark"` (default) | words after the leaderboard normalization | re-rank all 8 | **23.04** (the paper's numbers) |
78
+ | `mode="deployment"` | words on punctuation-stripped raw text | keep the top beam hypothesis (or repair) | 23.06 |
79
+
80
+ `SygmaASR(..., mode="deployment", repair=True)` adds a fallback re-decode when all 8 hypotheses are degenerate. It is **not** part of the benchmarked configuration.
81
+
82
+ ### Reproducing the paper
83
+
84
+ - Base model: `CohereLabs/cohere-transcribe-arabic-07-2026` at revision `c3e911b42149bf7a1e53d5cef9878aee87515a23` (pinned as `BASE_REVISION`); vendored model code in `cohere_asr/`.
85
+ - Environment: transformers 4.57.6; beam 8, length penalty 0, β = 1.0, at most 12 tokens per second + 20; bf16 autocast on GPU.
86
+ - Other pinned revisions used in the paper: `audarai/Audar-ASR-V1-Turbo` (remote code) `371428bea487c7aec82b27dc21f8d4324002e98e`; `Qwen/Qwen3-1.7B-Base` `ea980cb0a6c2ae4b936e82123acc929f1cec04c1`.
87
+ - Two levels of reproduction: the released 8-best lists reproduce every table exactly (analysis reproduction); re-running inference on rebuilt audio can differ slightly with GPU type, batching and precision (end-to-end reproduction).
88
+ - Exact selection rules (given the released 8-best lists they reproduce all per-set WERs): reward only (the paper's primary result, 23.05) `select_hypothesis(hyps, 1.0, "benchmark", use_filter=False)`; Sygma, reward + filter (23.04) `select_hypothesis(hyps, 1.0, "benchmark", use_filter=True)`; Beam-8 top (24.21) `select_hypothesis(hyps, 0.0, "benchmark", use_filter=False)`. `SygmaASR(..., use_filter=False)` decodes audio in the reward-only configuration.
89
 
90
  ## Limitations
91
 
analysis/README.md ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Reproducing the paper's tables
2
+
3
+ The analysis environment is:
4
+
5
+ - Python 3.12.8
6
+ - jiwer 4.0.0
7
+ - NumPy 1.26.4
8
+ - PyTorch 2.2.2
9
+ - transformers 4.57.6
10
+ - huggingface_hub 0.36.2
11
+ - pyarrow 15.0.2
12
+
13
+ ```bash
14
+ pip install "jiwer==4.0.0" "numpy==1.26.4" "torch==2.2.2" "transformers==4.57.6" "huggingface_hub==0.36.2" \
15
+ sentencepiece soundfile librosa "pyarrow==15.0.2"
16
+
17
+ # 1. re-attach reference transcripts from their public sources (leaderboard manifests, dev datasets)
18
+ python analysis/attach_references.py --release paper_artifacts --out art
19
+
20
+ # 2. all tables, bootstrap intervals (10,000 replicates, seed 0), sensitivity analysis, detector checks
21
+ python analysis/reviewer_analyses.py --art art --out my_results.json
22
+ ```
23
+
24
+ `my_results.json` should equal `analysis/results.json`. We verified this in a newly created environment with the versions above. Run both commands from the repository root: the analysis imports `sygma_asr.py` and `cohere_asr/` from there.
25
+
26
+ ## Configurations
27
+
28
+ | Paper name | Selection rule |
29
+ |---|---|
30
+ | Beam-8 top | `select_hypothesis(hyps, beta=0.0, mode="benchmark", use_filter=False)` |
31
+ | **Sygma-reward** (primary) | `select_hypothesis(hyps, beta=1.0, mode="benchmark", use_filter=False)` |
32
+ | Sygma-filtered | `select_hypothesis(hyps, beta=1.0, mode="benchmark", use_filter=True)` |
33
+ | LN re-ranking (± filter) | `pick(hyps, lambda h: h["am"] / ntok(h["text"]) ** 2.5, filt)` in `reviewer_analyses.py` (Cohere tokens + EOS) |
34
+ | Neural LM | `pick(hyps, lambda h: h["am"] + 0.01 * h["qwen"] + 1.5 * words(h), True)` |
35
+
36
+ Words are counted after the leaderboard normalization. Search spaces are given in the paper's appendix. `cpu_timing.py` reproduces the CPU timing, which needs audio clips.
analysis/attach_references.py ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Re-attach reference transcripts to the released predictions, producing the input directory that
2
+ reviewer_analyses.py expects. The release contains no reference text; references come from:
3
+
4
+ test sets the Open Universal Arabic ASR Leaderboard manifests (GitHub, pinned commit)
5
+ dev sets the Hugging Face datasets ahmedsamirtarjama/youtube_najdi and
6
+ HuggingPanda/Saudi_Podcasts_ASR (pinned revisions), by row index: a dev clip named
7
+ <set>_<i:06d> is row i of the listed files read in sorted path order (finetune/dev_prep.py)
8
+
9
+ python paper/analysis/attach_references.py --release RELEASE_DIR --out ART_DIR
10
+ python paper/analysis/reviewer_analyses.py --art ART_DIR --out results.json
11
+ """
12
+
13
+ import argparse
14
+ import json
15
+ import shutil
16
+ import urllib.request
17
+ from pathlib import Path
18
+
19
+ import pyarrow as pa
20
+ import pyarrow.parquet as pq
21
+
22
+ LB_REPO = "Natural-Language-Processing-Elm/open_universal_arabic_asr_leaderboard"
23
+ LB_COMMIT = "8fce8595b49057c98bafc2ba41b69c331cb5176e"
24
+ TEST = ["sada_test", "commonvoice_test", "masc_test_clean", "masc_test_noisy", "mgb2_test", "casablanca_test"]
25
+ BASE = {"sada_test": "base_sada_test", "commonvoice_test": "base_cv_commonvoice_test",
26
+ "masc_test_clean": "base_masc_test_clean", "masc_test_noisy": "base_masc_test_noisy",
27
+ "mgb2_test": "base_mgb2_test", "casablanca_test": "base_casablanca_test"}
28
+ # (repo, revision, files read by dev_prep.py): the youtube_najdi tuning set was built from the
29
+ # dataset's save_to_disk .arrow files only (its data/ parquet copy holds the same rows in another order)
30
+ DEV = {"dev_youtube_najdi": ("ahmedsamirtarjama/youtube_najdi", "d308545faa94f0f11bfa4d3b180ed661373f4a69", "data-*.arrow"),
31
+ "dev_saudi_podcasts": ("HuggingPanda/Saudi_Podcasts_ASR", "0f9b9b26ced10e26b4883948c517f70e14b01ab4", "data/*.parquet")}
32
+ TEXT_COLS = ("text", "transcription", "transcript", "sentence")
33
+
34
+
35
+ def stem(p):
36
+ return Path(p).name.rsplit(".wav", 1)[0]
37
+
38
+
39
+ def rows(src, pattern):
40
+ """Same row order as finetune/dev_prep.py: the dataset's files in sorted path order."""
41
+ for p in sorted(Path(src).glob(pattern)):
42
+ if p.suffix == ".parquet":
43
+ pf = pq.ParquetFile(p)
44
+ for i in range(pf.num_row_groups):
45
+ yield from pf.read_row_group(i, columns=[c for c in pf.schema_arrow.names if c in TEXT_COLS]).to_pylist()
46
+ elif p.suffix == ".arrow":
47
+ with pa.memory_map(str(p)) as f:
48
+ try:
49
+ reader = pa.ipc.open_stream(f)
50
+ except pa.ArrowInvalid:
51
+ reader = pa.ipc.open_file(f)
52
+ for batch in reader:
53
+ yield from batch.select([c for c in batch.schema.names if c in TEXT_COLS]).to_pylist()
54
+
55
+
56
+ def load(p):
57
+ return [json.loads(l) for l in open(p, encoding="utf-8")]
58
+
59
+
60
+ def dump(rows_, p):
61
+ p.parent.mkdir(parents=True, exist_ok=True)
62
+ with open(p, "w", encoding="utf-8") as f:
63
+ for r in rows_:
64
+ f.write(json.dumps(r, ensure_ascii=False) + "\n")
65
+
66
+
67
+ def main():
68
+ ap = argparse.ArgumentParser()
69
+ ap.add_argument("--release", required=True)
70
+ ap.add_argument("--out", required=True)
71
+ a = ap.parse_args()
72
+ rel, out = Path(a.release), Path(a.out)
73
+ if out.exists():
74
+ shutil.rmtree(out)
75
+
76
+ for s in TEST:
77
+ url = f"https://raw.githubusercontent.com/{LB_REPO}/{LB_COMMIT}/datasets/{s}.json"
78
+ raw = urllib.request.urlopen(url).read().decode("utf-8")
79
+ (out / "lb").mkdir(parents=True, exist_ok=True)
80
+ (out / f"lb/{s}.json").write_text(raw, encoding="utf-8")
81
+ ref = {stem(r["audio_filepath"]): r["text"] for r in map(json.loads, raw.splitlines())}
82
+ nb = load(rel / f"nbest/{s}.jsonl")
83
+ for r in nb:
84
+ r["ref"] = ref[stem(r["file"])]
85
+ dump(nb, out / f"nbest/{s}.jsonl")
86
+ for sub, name in [("base", BASE[s]), ("audar", f"audar_{s}"), ("audar", f"audarfix_{s}")]:
87
+ rs = load(rel / f"{sub}/{name}.jsonl")
88
+ for r in rs:
89
+ r["text"] = ref[stem(r["audio_filepath"])]
90
+ dump(rs, out / f"{sub}/{name}.jsonl")
91
+ print(f"[test] {s}: {len(nb)} clips", flush=True)
92
+
93
+ from huggingface_hub import snapshot_download
94
+ for s, (repo, rev, pattern) in DEV.items():
95
+ local = snapshot_download(repo, repo_type="dataset", revision=rev)
96
+ texts = {}
97
+ for i, r in enumerate(rows(local, pattern)):
98
+ col = next((c for c in TEXT_COLS if r.get(c)), None)
99
+ if col:
100
+ texts[i] = r[col].strip()
101
+ nb = load(rel / f"nbest/{s}.jsonl")
102
+ for r in nb:
103
+ r["ref"] = texts[int(stem(r["file"]).rsplit("_", 1)[1])]
104
+ dump(nb, out / f"nbest/{s}.jsonl")
105
+ print(f"[dev] {s}: {len(nb)} clips", flush=True)
106
+
107
+
108
+ if __name__ == "__main__":
109
+ main()
analysis/build_release.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build the public artifact release from the private analysis inputs: identical files with every
2
+ reference transcript removed (test and development references are re-attached from their public
3
+ sources by attach_references.py).
4
+
5
+ python paper/analysis/build_release.py --art ART_DIR --out RELEASE_DIR
6
+ """
7
+
8
+ import argparse
9
+ import json
10
+ import shutil
11
+ from pathlib import Path
12
+
13
+ TEST = ["sada_test", "commonvoice_test", "masc_test_clean", "masc_test_noisy", "mgb2_test", "casablanca_test"]
14
+ DEV = ["dev_youtube_najdi", "dev_saudi_podcasts"]
15
+ BASE = {"sada_test": "base_sada_test", "commonvoice_test": "base_cv_commonvoice_test",
16
+ "masc_test_clean": "base_masc_test_clean", "masc_test_noisy": "base_masc_test_noisy",
17
+ "mgb2_test": "base_mgb2_test", "casablanca_test": "base_casablanca_test"}
18
+
19
+
20
+ def rewrite(src, dst, drop):
21
+ dst.parent.mkdir(parents=True, exist_ok=True)
22
+ with open(src, encoding="utf-8") as f, open(dst, "w", encoding="utf-8") as g:
23
+ for line in f:
24
+ r = json.loads(line)
25
+ for k in drop:
26
+ r.pop(k, None)
27
+ g.write(json.dumps(r, ensure_ascii=False) + "\n")
28
+
29
+
30
+ def main():
31
+ ap = argparse.ArgumentParser()
32
+ ap.add_argument("--art", required=True)
33
+ ap.add_argument("--out", required=True)
34
+ a = ap.parse_args()
35
+ art, out = Path(a.art), Path(a.out)
36
+ if out.exists():
37
+ shutil.rmtree(out)
38
+ for s in TEST + DEV:
39
+ rewrite(art / f"nbest/{s}.jsonl", out / f"nbest/{s}.jsonl", ["ref"])
40
+ for s in TEST:
41
+ rewrite(art / f"base/{BASE[s]}.jsonl", out / f"base/{BASE[s]}.jsonl", ["text"])
42
+ for tag in ("audar", "audarfix"):
43
+ rewrite(art / f"audar/{tag}_{s}.jsonl", out / f"audar/{tag}_{s}.jsonl", ["text"])
44
+ leaks = [p for p in out.rglob("*.jsonl") for l in open(p, encoding="utf-8")
45
+ if '"ref"' in l or '"text": ' in l.split('"hyps"')[0]]
46
+ assert not leaks, f"reference text left in {sorted({str(p) for p in leaks})[:3]}"
47
+ print(f"wrote {sum(1 for _ in out.rglob('*.jsonl'))} files to {out}")
48
+
49
+
50
+ if __name__ == "__main__":
51
+ main()
analysis/cpu_timing.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """CPU cost of greedy vs. Sygma decoding (fp32, batch 1, one clip at a time) on 30 random Arabic clips.
2
+
3
+ Timing boundary: wall-clock (time.perf_counter) around one call of the decoder on an in-memory float32
4
+ array, i.e. feature extraction + encoder + search + detokenization; model loading and audio reading
5
+ excluded. Greedy = model.transcribe(...) (the model's own routine); Sygma = SygmaASR.transcribe(...).
6
+ With --mode greedy|sygma only that decoder runs, so the process's peak RSS is attributable to it.
7
+
8
+ .venv/bin/python paper/analysis/cpu_timing.py --clips kaggle_ser/output/test --out paper/analysis/cpu_timing.json
9
+ .venv/bin/python paper/analysis/cpu_timing.py --clips kaggle_ser/output/test --mode greedy --out .../cpu_greedy.json
10
+ """
11
+ import argparse, json, random, resource, sys, time
12
+ from pathlib import Path
13
+
14
+ import soundfile as sf
15
+ import torch
16
+
17
+ ROOT = Path(__file__).resolve().parents[2]
18
+ sys.path.insert(0, str(ROOT / "hf_release" / "Sygma-ASR-Arabic"))
19
+ from sygma_asr import SygmaASR # noqa: E402
20
+
21
+ ap = argparse.ArgumentParser()
22
+ ap.add_argument("--clips", required=True)
23
+ ap.add_argument("--n", type=int, default=30)
24
+ ap.add_argument("--out", required=True)
25
+ ap.add_argument("--mode", choices=["both", "greedy", "sygma"], default="both")
26
+ a = ap.parse_args()
27
+ files = sorted(Path(a.clips).glob("*.wav"))
28
+ random.Random(0).shuffle(files)
29
+ files = files[: a.n]
30
+ asr = SygmaASR(device="cpu")
31
+ rows = []
32
+ for f in files:
33
+ x, sr = sf.read(f, dtype="float32")
34
+ x = x.mean(axis=1) if x.ndim > 1 else x
35
+ dur = len(x) / sr
36
+ tg = ts = float("nan")
37
+ if a.mode in ("both", "greedy"):
38
+ t0 = time.perf_counter()
39
+ with torch.inference_mode():
40
+ asr.model.transcribe(asr.processor, language="ar", audio_arrays=[x], sample_rates=[sr])
41
+ tg = time.perf_counter() - t0
42
+ if a.mode in ("both", "sygma"):
43
+ t0 = time.perf_counter()
44
+ asr.transcribe(audio_arrays=[x], sample_rates=[sr])
45
+ ts = time.perf_counter() - t0
46
+ rows.append({"file": f.name, "dur": dur, "greedy_s": tg, "sygma_s": ts})
47
+ print(f"{f.name} {dur:.1f}s greedy {tg:.1f}s sygma {ts:.1f}s", flush=True)
48
+ tot = sum(r["dur"] for r in rows)
49
+ res = {"clips": len(rows), "audio_s": round(tot, 1), "threads": torch.get_num_threads(),
50
+ "rtf_greedy": round(sum(r["greedy_s"] for r in rows) / tot, 3),
51
+ "rtf_sygma": round(sum(r["sygma_s"] for r in rows) / tot, 3),
52
+ "peak_rss_gb": round(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1e9, 2), # bytes on macOS
53
+ "rows": rows}
54
+ res["mode"] = a.mode
55
+ res["torch"] = torch.__version__
56
+ Path(a.out).write_text(json.dumps(res, indent=1))
57
+ print({k: v for k, v in res.items() if k != "rows"})
analysis/results.json ADDED
@@ -0,0 +1,1786 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "dev_lennorm": {
3
+ "nofilter_lambda0.0": 33.71,
4
+ "nofilter_lambda0.25": 32.5,
5
+ "nofilter_lambda0.5": 31.52,
6
+ "nofilter_lambda0.75": 30.95,
7
+ "nofilter_lambda1.0": 30.54,
8
+ "nofilter_lambda1.25": 30.34,
9
+ "nofilter_lambda1.5": 30.33,
10
+ "nofilter_lambda2.0": 30.13,
11
+ "nofilter_lambda2.5": 30.06,
12
+ "nofilter_lambda3.0": 30.08,
13
+ "nofilter_lambda4.0": 30.2,
14
+ "nofilter_lambda6.0": 30.39,
15
+ "filter_lambda0.0": 33.71,
16
+ "filter_lambda0.25": 32.5,
17
+ "filter_lambda0.5": 31.52,
18
+ "filter_lambda0.75": 30.95,
19
+ "filter_lambda1.0": 30.54,
20
+ "filter_lambda1.25": 30.34,
21
+ "filter_lambda1.5": 30.33,
22
+ "filter_lambda2.0": 30.13,
23
+ "filter_lambda2.5": 30.06,
24
+ "filter_lambda3.0": 30.08,
25
+ "filter_lambda4.0": 30.2,
26
+ "filter_lambda6.0": 30.39
27
+ },
28
+ "dev_lennorm_best": {
29
+ "nofilter": 2.5,
30
+ "filter": 2.5
31
+ },
32
+ "dev": {
33
+ "beam_top": 33.71,
34
+ "beam_filter": 33.71,
35
+ "beam_bonus": 29.18,
36
+ "sygma": 29.18
37
+ },
38
+ "dev_beta_curve": {
39
+ "nofilter": {
40
+ "0.0": 33.71,
41
+ "0.25": 31.28,
42
+ "0.5": 29.92,
43
+ "0.75": 29.37,
44
+ "1.0": 29.18,
45
+ "1.25": 29.18,
46
+ "1.5": 29.19,
47
+ "2.0": 29.32,
48
+ "2.5": 29.48,
49
+ "3.0": 29.51
50
+ },
51
+ "filter": {
52
+ "0.0": 33.71,
53
+ "0.25": 31.28,
54
+ "0.5": 29.92,
55
+ "0.75": 29.37,
56
+ "1.0": 29.18,
57
+ "1.25": 29.18,
58
+ "1.5": 29.19,
59
+ "2.0": 29.32,
60
+ "2.5": 29.48,
61
+ "3.0": 29.51
62
+ }
63
+ },
64
+ "dev_youtube_only_beam_top": 33.57,
65
+ "test": {
66
+ "sada_test": {
67
+ "greedy": {
68
+ "wer": 36.57,
69
+ "S": 17082,
70
+ "D": 8777,
71
+ "I": 4168,
72
+ "N": 82107,
73
+ "degenerate": 110
74
+ },
75
+ "beam_top": {
76
+ "wer": 37.85,
77
+ "S": 15268,
78
+ "D": 13228,
79
+ "I": 2580,
80
+ "N": 82107,
81
+ "degenerate": 25
82
+ },
83
+ "beam_filter": {
84
+ "wer": 37.84,
85
+ "S": 15268,
86
+ "D": 13216,
87
+ "I": 2584,
88
+ "N": 82107,
89
+ "degenerate": 16
90
+ },
91
+ "beam_bonus": {
92
+ "wer": 33.68,
93
+ "S": 16708,
94
+ "D": 7224,
95
+ "I": 3721,
96
+ "N": 82107,
97
+ "degenerate": 32
98
+ },
99
+ "sygma": {
100
+ "wer": 33.6,
101
+ "S": 16687,
102
+ "D": 7248,
103
+ "I": 3653,
104
+ "N": 82107,
105
+ "degenerate": 16
106
+ },
107
+ "sygma_release": {
108
+ "wer": 33.58,
109
+ "S": 16688,
110
+ "D": 7255,
111
+ "I": 3626,
112
+ "N": 82107,
113
+ "degenerate": 16
114
+ },
115
+ "lennorm": {
116
+ "wer": 34.11,
117
+ "S": 16989,
118
+ "D": 7415,
119
+ "I": 3603,
120
+ "N": 82107,
121
+ "degenerate": 61
122
+ },
123
+ "lennorm_filter": {
124
+ "wer": 33.95,
125
+ "S": 17021,
126
+ "D": 7326,
127
+ "I": 3530,
128
+ "N": 82107,
129
+ "degenerate": 16
130
+ },
131
+ "qwen": {
132
+ "wer": 33.65,
133
+ "S": 16861,
134
+ "D": 6851,
135
+ "I": 3915,
136
+ "N": 82107,
137
+ "degenerate": 16
138
+ },
139
+ "nolm_b15": {
140
+ "wer": 33.71,
141
+ "S": 16933,
142
+ "D": 6810,
143
+ "I": 3938,
144
+ "N": 82107,
145
+ "degenerate": 16
146
+ },
147
+ "audar_raw": {
148
+ "wer": 35.52,
149
+ "S": 16866,
150
+ "D": 2964,
151
+ "I": 9335,
152
+ "N": 82107,
153
+ "degenerate": 40
154
+ },
155
+ "audar_fix": {
156
+ "wer": 28.24,
157
+ "S": 16486,
158
+ "D": 3062,
159
+ "I": 3641,
160
+ "N": 82107,
161
+ "degenerate": 0
162
+ },
163
+ "clips": 6087
164
+ },
165
+ "commonvoice_test": {
166
+ "greedy": {
167
+ "wer": 5.41,
168
+ "S": 2557,
169
+ "D": 172,
170
+ "I": 144,
171
+ "N": 53104,
172
+ "degenerate": 0
173
+ },
174
+ "beam_top": {
175
+ "wer": 5.23,
176
+ "S": 2473,
177
+ "D": 174,
178
+ "I": 130,
179
+ "N": 53104,
180
+ "degenerate": 0
181
+ },
182
+ "beam_filter": {
183
+ "wer": 5.23,
184
+ "S": 2473,
185
+ "D": 174,
186
+ "I": 130,
187
+ "N": 53104,
188
+ "degenerate": 0
189
+ },
190
+ "beam_bonus": {
191
+ "wer": 5.26,
192
+ "S": 2493,
193
+ "D": 117,
194
+ "I": 184,
195
+ "N": 53104,
196
+ "degenerate": 0
197
+ },
198
+ "sygma": {
199
+ "wer": 5.26,
200
+ "S": 2493,
201
+ "D": 117,
202
+ "I": 184,
203
+ "N": 53104,
204
+ "degenerate": 0
205
+ },
206
+ "sygma_release": {
207
+ "wer": 5.28,
208
+ "S": 2501,
209
+ "D": 120,
210
+ "I": 184,
211
+ "N": 53104,
212
+ "degenerate": 0
213
+ },
214
+ "lennorm": {
215
+ "wer": 5.49,
216
+ "S": 2615,
217
+ "D": 158,
218
+ "I": 141,
219
+ "N": 53104,
220
+ "degenerate": 3
221
+ },
222
+ "lennorm_filter": {
223
+ "wer": 5.47,
224
+ "S": 2612,
225
+ "D": 152,
226
+ "I": 141,
227
+ "N": 53104,
228
+ "degenerate": 0
229
+ },
230
+ "qwen": {
231
+ "wer": 5.31,
232
+ "S": 2501,
233
+ "D": 108,
234
+ "I": 213,
235
+ "N": 53104,
236
+ "degenerate": 0
237
+ },
238
+ "nolm_b15": {
239
+ "wer": 5.33,
240
+ "S": 2508,
241
+ "D": 108,
242
+ "I": 212,
243
+ "N": 53104,
244
+ "degenerate": 0
245
+ },
246
+ "audar_raw": {
247
+ "wer": 8.13,
248
+ "S": 3836,
249
+ "D": 236,
250
+ "I": 247,
251
+ "N": 53104,
252
+ "degenerate": 0
253
+ },
254
+ "audar_fix": {
255
+ "wer": 8.13,
256
+ "S": 3836,
257
+ "D": 236,
258
+ "I": 247,
259
+ "N": 53104,
260
+ "degenerate": 0
261
+ },
262
+ "clips": 10471
263
+ },
264
+ "masc_test_clean": {
265
+ "greedy": {
266
+ "wer": 16.33,
267
+ "S": 9199,
268
+ "D": 1313,
269
+ "I": 471,
270
+ "N": 67274,
271
+ "degenerate": 4
272
+ },
273
+ "beam_top": {
274
+ "wer": 16.07,
275
+ "S": 9150,
276
+ "D": 1394,
277
+ "I": 266,
278
+ "N": 67274,
279
+ "degenerate": 1
280
+ },
281
+ "beam_filter": {
282
+ "wer": 16.07,
283
+ "S": 9150,
284
+ "D": 1394,
285
+ "I": 266,
286
+ "N": 67274,
287
+ "degenerate": 0
288
+ },
289
+ "beam_bonus": {
290
+ "wer": 15.95,
291
+ "S": 9213,
292
+ "D": 1098,
293
+ "I": 422,
294
+ "N": 67274,
295
+ "degenerate": 0
296
+ },
297
+ "sygma": {
298
+ "wer": 15.95,
299
+ "S": 9213,
300
+ "D": 1098,
301
+ "I": 422,
302
+ "N": 67274,
303
+ "degenerate": 0
304
+ },
305
+ "sygma_release": {
306
+ "wer": 15.97,
307
+ "S": 9216,
308
+ "D": 1108,
309
+ "I": 421,
310
+ "N": 67274,
311
+ "degenerate": 0
312
+ },
313
+ "lennorm": {
314
+ "wer": 16.01,
315
+ "S": 9238,
316
+ "D": 1182,
317
+ "I": 349,
318
+ "N": 67274,
319
+ "degenerate": 2
320
+ },
321
+ "lennorm_filter": {
322
+ "wer": 16.0,
323
+ "S": 9236,
324
+ "D": 1180,
325
+ "I": 349,
326
+ "N": 67274,
327
+ "degenerate": 0
328
+ },
329
+ "qwen": {
330
+ "wer": 16.1,
331
+ "S": 9243,
332
+ "D": 1060,
333
+ "I": 525,
334
+ "N": 67274,
335
+ "degenerate": 0
336
+ },
337
+ "nolm_b15": {
338
+ "wer": 16.09,
339
+ "S": 9235,
340
+ "D": 1055,
341
+ "I": 532,
342
+ "N": 67274,
343
+ "degenerate": 0
344
+ },
345
+ "audar_raw": {
346
+ "wer": 17.2,
347
+ "S": 9789,
348
+ "D": 1384,
349
+ "I": 396,
350
+ "N": 67274,
351
+ "degenerate": 0
352
+ },
353
+ "audar_fix": {
354
+ "wer": 17.2,
355
+ "S": 9789,
356
+ "D": 1384,
357
+ "I": 396,
358
+ "N": 67274,
359
+ "degenerate": 0
360
+ },
361
+ "clips": 8612
362
+ },
363
+ "masc_test_noisy": {
364
+ "greedy": {
365
+ "wer": 25.78,
366
+ "S": 13738,
367
+ "D": 2340,
368
+ "I": 1053,
369
+ "N": 66438,
370
+ "degenerate": 2
371
+ },
372
+ "beam_top": {
373
+ "wer": 25.62,
374
+ "S": 13383,
375
+ "D": 2754,
376
+ "I": 883,
377
+ "N": 66438,
378
+ "degenerate": 0
379
+ },
380
+ "beam_filter": {
381
+ "wer": 25.62,
382
+ "S": 13383,
383
+ "D": 2754,
384
+ "I": 883,
385
+ "N": 66438,
386
+ "degenerate": 0
387
+ },
388
+ "beam_bonus": {
389
+ "wer": 25.13,
390
+ "S": 13662,
391
+ "D": 1663,
392
+ "I": 1369,
393
+ "N": 66438,
394
+ "degenerate": 0
395
+ },
396
+ "sygma": {
397
+ "wer": 25.13,
398
+ "S": 13662,
399
+ "D": 1663,
400
+ "I": 1369,
401
+ "N": 66438,
402
+ "degenerate": 0
403
+ },
404
+ "sygma_release": {
405
+ "wer": 25.2,
406
+ "S": 13687,
407
+ "D": 1697,
408
+ "I": 1358,
409
+ "N": 66438,
410
+ "degenerate": 0
411
+ },
412
+ "lennorm": {
413
+ "wer": 25.42,
414
+ "S": 13840,
415
+ "D": 1878,
416
+ "I": 1173,
417
+ "N": 66438,
418
+ "degenerate": 3
419
+ },
420
+ "lennorm_filter": {
421
+ "wer": 25.41,
422
+ "S": 13841,
423
+ "D": 1867,
424
+ "I": 1173,
425
+ "N": 66438,
426
+ "degenerate": 0
427
+ },
428
+ "qwen": {
429
+ "wer": 25.25,
430
+ "S": 13744,
431
+ "D": 1527,
432
+ "I": 1506,
433
+ "N": 66438,
434
+ "degenerate": 0
435
+ },
436
+ "nolm_b15": {
437
+ "wer": 25.23,
438
+ "S": 13731,
439
+ "D": 1514,
440
+ "I": 1516,
441
+ "N": 66438,
442
+ "degenerate": 0
443
+ },
444
+ "audar_raw": {
445
+ "wer": 28.85,
446
+ "S": 15303,
447
+ "D": 2424,
448
+ "I": 1439,
449
+ "N": 66438,
450
+ "degenerate": 7
451
+ },
452
+ "audar_fix": {
453
+ "wer": 28.49,
454
+ "S": 15304,
455
+ "D": 2403,
456
+ "I": 1222,
457
+ "N": 66438,
458
+ "degenerate": 0
459
+ },
460
+ "clips": 9393
461
+ },
462
+ "mgb2_test": {
463
+ "greedy": {
464
+ "wer": 15.19,
465
+ "S": 5826,
466
+ "D": 3198,
467
+ "I": 756,
468
+ "N": 64381,
469
+ "degenerate": 10
470
+ },
471
+ "beam_top": {
472
+ "wer": 15.86,
473
+ "S": 5403,
474
+ "D": 4367,
475
+ "I": 440,
476
+ "N": 64381,
477
+ "degenerate": 1
478
+ },
479
+ "beam_filter": {
480
+ "wer": 15.86,
481
+ "S": 5403,
482
+ "D": 4367,
483
+ "I": 440,
484
+ "N": 64381,
485
+ "degenerate": 1
486
+ },
487
+ "beam_bonus": {
488
+ "wer": 13.56,
489
+ "S": 5704,
490
+ "D": 2188,
491
+ "I": 835,
492
+ "N": 64381,
493
+ "degenerate": 1
494
+ },
495
+ "sygma": {
496
+ "wer": 13.56,
497
+ "S": 5704,
498
+ "D": 2188,
499
+ "I": 835,
500
+ "N": 64381,
501
+ "degenerate": 1
502
+ },
503
+ "sygma_release": {
504
+ "wer": 13.57,
505
+ "S": 5708,
506
+ "D": 2196,
507
+ "I": 834,
508
+ "N": 64381,
509
+ "degenerate": 1
510
+ },
511
+ "lennorm": {
512
+ "wer": 13.76,
513
+ "S": 5676,
514
+ "D": 2461,
515
+ "I": 724,
516
+ "N": 64381,
517
+ "degenerate": 1
518
+ },
519
+ "lennorm_filter": {
520
+ "wer": 13.76,
521
+ "S": 5676,
522
+ "D": 2461,
523
+ "I": 724,
524
+ "N": 64381,
525
+ "degenerate": 1
526
+ },
527
+ "qwen": {
528
+ "wer": 13.48,
529
+ "S": 5697,
530
+ "D": 2017,
531
+ "I": 963,
532
+ "N": 64381,
533
+ "degenerate": 1
534
+ },
535
+ "nolm_b15": {
536
+ "wer": 13.57,
537
+ "S": 5753,
538
+ "D": 1999,
539
+ "I": 986,
540
+ "N": 64381,
541
+ "degenerate": 1
542
+ },
543
+ "audar_raw": {
544
+ "wer": 12.49,
545
+ "S": 4924,
546
+ "D": 2068,
547
+ "I": 1051,
548
+ "N": 64381,
549
+ "degenerate": 2
550
+ },
551
+ "audar_fix": {
552
+ "wer": 12.03,
553
+ "S": 4914,
554
+ "D": 2072,
555
+ "I": 757,
556
+ "N": 64381,
557
+ "degenerate": 0
558
+ },
559
+ "clips": 5365
560
+ },
561
+ "casablanca_test": {
562
+ "greedy": {
563
+ "wer": 45.7,
564
+ "S": 24226,
565
+ "D": 5085,
566
+ "I": 3204,
567
+ "N": 71145,
568
+ "degenerate": 29
569
+ },
570
+ "beam_top": {
571
+ "wer": 44.63,
572
+ "S": 22733,
573
+ "D": 6416,
574
+ "I": 2602,
575
+ "N": 71145,
576
+ "degenerate": 4
577
+ },
578
+ "beam_filter": {
579
+ "wer": 44.59,
580
+ "S": 22739,
581
+ "D": 6382,
582
+ "I": 2604,
583
+ "N": 71145,
584
+ "degenerate": 1
585
+ },
586
+ "beam_bonus": {
587
+ "wer": 44.75,
588
+ "S": 24011,
589
+ "D": 4000,
590
+ "I": 3827,
591
+ "N": 71145,
592
+ "degenerate": 6
593
+ },
594
+ "sygma": {
595
+ "wer": 44.75,
596
+ "S": 24010,
597
+ "D": 4002,
598
+ "I": 3824,
599
+ "N": 71145,
600
+ "degenerate": 1
601
+ },
602
+ "sygma_release": {
603
+ "wer": 44.77,
604
+ "S": 24010,
605
+ "D": 4019,
606
+ "I": 3820,
607
+ "N": 71145,
608
+ "degenerate": 1
609
+ },
610
+ "lennorm": {
611
+ "wer": 44.8,
612
+ "S": 24278,
613
+ "D": 4208,
614
+ "I": 3387,
615
+ "N": 71145,
616
+ "degenerate": 16
617
+ },
618
+ "lennorm_filter": {
619
+ "wer": 44.74,
620
+ "S": 24292,
621
+ "D": 4151,
622
+ "I": 3387,
623
+ "N": 71145,
624
+ "degenerate": 1
625
+ },
626
+ "qwen": {
627
+ "wer": 45.04,
628
+ "S": 24331,
629
+ "D": 3604,
630
+ "I": 4109,
631
+ "N": 71145,
632
+ "degenerate": 1
633
+ },
634
+ "nolm_b15": {
635
+ "wer": 45.08,
636
+ "S": 24369,
637
+ "D": 3566,
638
+ "I": 4135,
639
+ "N": 71145,
640
+ "degenerate": 1
641
+ },
642
+ "audar_raw": {
643
+ "wer": 56.05,
644
+ "S": 28385,
645
+ "D": 3834,
646
+ "I": 7659,
647
+ "N": 71145,
648
+ "degenerate": 41
649
+ },
650
+ "audar_fix": {
651
+ "wer": 50.18,
652
+ "S": 28302,
653
+ "D": 3817,
654
+ "I": 3584,
655
+ "N": 71145,
656
+ "degenerate": 0
657
+ },
658
+ "clips": 6726
659
+ },
660
+ "average": {
661
+ "greedy": 24.16,
662
+ "beam_top": 24.21,
663
+ "beam_filter": 24.2,
664
+ "beam_bonus": 23.05,
665
+ "sygma": 23.04,
666
+ "sygma_release": 23.06,
667
+ "lennorm": 23.27,
668
+ "lennorm_filter": 23.22,
669
+ "qwen": 23.14,
670
+ "nolm_b15": 23.17,
671
+ "audar_raw": 26.37,
672
+ "audar_fix": 24.05
673
+ }
674
+ },
675
+ "n_clusters": {
676
+ "sada_test": 44,
677
+ "commonvoice_test": 10471,
678
+ "masc_test_clean": 108,
679
+ "masc_test_noisy": 101,
680
+ "mgb2_test": 17,
681
+ "casablanca_test": 6010
682
+ },
683
+ "bootstrap": {
684
+ "sygma-greedy": {
685
+ "sada_test": {
686
+ "diff": -2.97,
687
+ "ci95": [
688
+ -4.03,
689
+ -2.07
690
+ ]
691
+ },
692
+ "commonvoice_test": {
693
+ "diff": -0.15,
694
+ "ci95": [
695
+ -0.23,
696
+ -0.07
697
+ ]
698
+ },
699
+ "masc_test_clean": {
700
+ "diff": -0.37,
701
+ "ci95": [
702
+ -0.63,
703
+ -0.15
704
+ ]
705
+ },
706
+ "masc_test_noisy": {
707
+ "diff": -0.66,
708
+ "ci95": [
709
+ -0.94,
710
+ -0.38
711
+ ]
712
+ },
713
+ "mgb2_test": {
714
+ "diff": -1.64,
715
+ "ci95": [
716
+ -2.31,
717
+ -1.04
718
+ ]
719
+ },
720
+ "casablanca_test": {
721
+ "diff": -0.95,
722
+ "ci95": [
723
+ -1.45,
724
+ -0.52
725
+ ]
726
+ },
727
+ "average": {
728
+ "diff": -1.12,
729
+ "ci95": [
730
+ -1.35,
731
+ -0.91
732
+ ]
733
+ }
734
+ },
735
+ "beam_bonus-greedy": {
736
+ "sada_test": {
737
+ "diff": -2.89,
738
+ "ci95": [
739
+ -3.96,
740
+ -1.98
741
+ ]
742
+ },
743
+ "commonvoice_test": {
744
+ "diff": -0.15,
745
+ "ci95": [
746
+ -0.23,
747
+ -0.07
748
+ ]
749
+ },
750
+ "masc_test_clean": {
751
+ "diff": -0.37,
752
+ "ci95": [
753
+ -0.63,
754
+ -0.15
755
+ ]
756
+ },
757
+ "masc_test_noisy": {
758
+ "diff": -0.66,
759
+ "ci95": [
760
+ -0.94,
761
+ -0.38
762
+ ]
763
+ },
764
+ "mgb2_test": {
765
+ "diff": -1.64,
766
+ "ci95": [
767
+ -2.31,
768
+ -1.04
769
+ ]
770
+ },
771
+ "casablanca_test": {
772
+ "diff": -0.95,
773
+ "ci95": [
774
+ -1.45,
775
+ -0.52
776
+ ]
777
+ },
778
+ "average": {
779
+ "diff": -1.11,
780
+ "ci95": [
781
+ -1.34,
782
+ -0.9
783
+ ]
784
+ }
785
+ },
786
+ "beam_filter-greedy": {
787
+ "sada_test": {
788
+ "diff": 1.27,
789
+ "ci95": [
790
+ 0.05,
791
+ 2.33
792
+ ]
793
+ },
794
+ "commonvoice_test": {
795
+ "diff": -0.18,
796
+ "ci95": [
797
+ -0.25,
798
+ -0.12
799
+ ]
800
+ },
801
+ "masc_test_clean": {
802
+ "diff": -0.26,
803
+ "ci95": [
804
+ -0.53,
805
+ -0.04
806
+ ]
807
+ },
808
+ "masc_test_noisy": {
809
+ "diff": -0.17,
810
+ "ci95": [
811
+ -0.4,
812
+ 0.06
813
+ ]
814
+ },
815
+ "mgb2_test": {
816
+ "diff": 0.67,
817
+ "ci95": [
818
+ -0.07,
819
+ 1.32
820
+ ]
821
+ },
822
+ "casablanca_test": {
823
+ "diff": -1.11,
824
+ "ci95": [
825
+ -1.61,
826
+ -0.68
827
+ ]
828
+ },
829
+ "average": {
830
+ "diff": 0.04,
831
+ "ci95": [
832
+ -0.21,
833
+ 0.26
834
+ ]
835
+ }
836
+ },
837
+ "beam_top-greedy": {
838
+ "sada_test": {
839
+ "diff": 1.28,
840
+ "ci95": [
841
+ 0.06,
842
+ 2.34
843
+ ]
844
+ },
845
+ "commonvoice_test": {
846
+ "diff": -0.18,
847
+ "ci95": [
848
+ -0.25,
849
+ -0.12
850
+ ]
851
+ },
852
+ "masc_test_clean": {
853
+ "diff": -0.26,
854
+ "ci95": [
855
+ -0.53,
856
+ -0.04
857
+ ]
858
+ },
859
+ "masc_test_noisy": {
860
+ "diff": -0.17,
861
+ "ci95": [
862
+ -0.4,
863
+ 0.06
864
+ ]
865
+ },
866
+ "mgb2_test": {
867
+ "diff": 0.67,
868
+ "ci95": [
869
+ -0.07,
870
+ 1.32
871
+ ]
872
+ },
873
+ "casablanca_test": {
874
+ "diff": -1.07,
875
+ "ci95": [
876
+ -1.56,
877
+ -0.66
878
+ ]
879
+ },
880
+ "average": {
881
+ "diff": 0.04,
882
+ "ci95": [
883
+ -0.21,
884
+ 0.27
885
+ ]
886
+ }
887
+ },
888
+ "sygma-beam_bonus": {
889
+ "sada_test": {
890
+ "diff": -0.08,
891
+ "ci95": [
892
+ -0.23,
893
+ -0.01
894
+ ]
895
+ },
896
+ "commonvoice_test": {
897
+ "diff": 0.0,
898
+ "ci95": [
899
+ 0.0,
900
+ 0.0
901
+ ]
902
+ },
903
+ "masc_test_clean": {
904
+ "diff": 0.0,
905
+ "ci95": [
906
+ 0.0,
907
+ 0.0
908
+ ]
909
+ },
910
+ "masc_test_noisy": {
911
+ "diff": 0.0,
912
+ "ci95": [
913
+ 0.0,
914
+ 0.0
915
+ ]
916
+ },
917
+ "mgb2_test": {
918
+ "diff": 0.0,
919
+ "ci95": [
920
+ 0.0,
921
+ 0.0
922
+ ]
923
+ },
924
+ "casablanca_test": {
925
+ "diff": -0.0,
926
+ "ci95": [
927
+ -0.01,
928
+ 0.0
929
+ ]
930
+ },
931
+ "average": {
932
+ "diff": -0.01,
933
+ "ci95": [
934
+ -0.04,
935
+ -0.0
936
+ ]
937
+ }
938
+ },
939
+ "sygma-beam_filter": {
940
+ "sada_test": {
941
+ "diff": -4.24,
942
+ "ci95": [
943
+ -5.43,
944
+ -3.15
945
+ ]
946
+ },
947
+ "commonvoice_test": {
948
+ "diff": 0.03,
949
+ "ci95": [
950
+ -0.04,
951
+ 0.1
952
+ ]
953
+ },
954
+ "masc_test_clean": {
955
+ "diff": -0.11,
956
+ "ci95": [
957
+ -0.21,
958
+ -0.01
959
+ ]
960
+ },
961
+ "masc_test_noisy": {
962
+ "diff": -0.49,
963
+ "ci95": [
964
+ -0.82,
965
+ -0.12
966
+ ]
967
+ },
968
+ "mgb2_test": {
969
+ "diff": -2.3,
970
+ "ci95": [
971
+ -3.26,
972
+ -1.33
973
+ ]
974
+ },
975
+ "casablanca_test": {
976
+ "diff": 0.16,
977
+ "ci95": [
978
+ -0.1,
979
+ 0.4
980
+ ]
981
+ },
982
+ "average": {
983
+ "diff": -1.16,
984
+ "ci95": [
985
+ -1.42,
986
+ -0.9
987
+ ]
988
+ }
989
+ },
990
+ "sygma-lennorm_filter": {
991
+ "sada_test": {
992
+ "diff": -0.35,
993
+ "ci95": [
994
+ -0.68,
995
+ -0.06
996
+ ]
997
+ },
998
+ "commonvoice_test": {
999
+ "diff": -0.21,
1000
+ "ci95": [
1001
+ -0.31,
1002
+ -0.11
1003
+ ]
1004
+ },
1005
+ "masc_test_clean": {
1006
+ "diff": -0.05,
1007
+ "ci95": [
1008
+ -0.15,
1009
+ 0.06
1010
+ ]
1011
+ },
1012
+ "masc_test_noisy": {
1013
+ "diff": -0.28,
1014
+ "ci95": [
1015
+ -0.44,
1016
+ -0.14
1017
+ ]
1018
+ },
1019
+ "mgb2_test": {
1020
+ "diff": -0.21,
1021
+ "ci95": [
1022
+ -0.43,
1023
+ 0.03
1024
+ ]
1025
+ },
1026
+ "casablanca_test": {
1027
+ "diff": 0.01,
1028
+ "ci95": [
1029
+ -0.18,
1030
+ 0.19
1031
+ ]
1032
+ },
1033
+ "average": {
1034
+ "diff": -0.18,
1035
+ "ci95": [
1036
+ -0.26,
1037
+ -0.1
1038
+ ]
1039
+ }
1040
+ },
1041
+ "lennorm_filter-greedy": {
1042
+ "sada_test": {
1043
+ "diff": -2.62,
1044
+ "ci95": [
1045
+ -3.63,
1046
+ -1.76
1047
+ ]
1048
+ },
1049
+ "commonvoice_test": {
1050
+ "diff": 0.06,
1051
+ "ci95": [
1052
+ -0.03,
1053
+ 0.16
1054
+ ]
1055
+ },
1056
+ "masc_test_clean": {
1057
+ "diff": -0.32,
1058
+ "ci95": [
1059
+ -0.62,
1060
+ -0.09
1061
+ ]
1062
+ },
1063
+ "masc_test_noisy": {
1064
+ "diff": -0.38,
1065
+ "ci95": [
1066
+ -0.61,
1067
+ -0.12
1068
+ ]
1069
+ },
1070
+ "mgb2_test": {
1071
+ "diff": -1.43,
1072
+ "ci95": [
1073
+ -1.95,
1074
+ -0.98
1075
+ ]
1076
+ },
1077
+ "casablanca_test": {
1078
+ "diff": -0.96,
1079
+ "ci95": [
1080
+ -1.46,
1081
+ -0.55
1082
+ ]
1083
+ },
1084
+ "average": {
1085
+ "diff": -0.94,
1086
+ "ci95": [
1087
+ -1.16,
1088
+ -0.75
1089
+ ]
1090
+ }
1091
+ },
1092
+ "qwen-sygma": {
1093
+ "sada_test": {
1094
+ "diff": 0.05,
1095
+ "ci95": [
1096
+ -0.06,
1097
+ 0.18
1098
+ ]
1099
+ },
1100
+ "commonvoice_test": {
1101
+ "diff": 0.05,
1102
+ "ci95": [
1103
+ 0.01,
1104
+ 0.1
1105
+ ]
1106
+ },
1107
+ "masc_test_clean": {
1108
+ "diff": 0.14,
1109
+ "ci95": [
1110
+ 0.06,
1111
+ 0.23
1112
+ ]
1113
+ },
1114
+ "masc_test_noisy": {
1115
+ "diff": 0.12,
1116
+ "ci95": [
1117
+ 0.05,
1118
+ 0.21
1119
+ ]
1120
+ },
1121
+ "mgb2_test": {
1122
+ "diff": -0.08,
1123
+ "ci95": [
1124
+ -0.16,
1125
+ 0.02
1126
+ ]
1127
+ },
1128
+ "casablanca_test": {
1129
+ "diff": 0.29,
1130
+ "ci95": [
1131
+ 0.19,
1132
+ 0.39
1133
+ ]
1134
+ },
1135
+ "average": {
1136
+ "diff": 0.1,
1137
+ "ci95": [
1138
+ 0.06,
1139
+ 0.14
1140
+ ]
1141
+ }
1142
+ },
1143
+ "qwen-nolm_b15": {
1144
+ "sada_test": {
1145
+ "diff": -0.07,
1146
+ "ci95": [
1147
+ -0.11,
1148
+ -0.02
1149
+ ]
1150
+ },
1151
+ "commonvoice_test": {
1152
+ "diff": -0.01,
1153
+ "ci95": [
1154
+ -0.03,
1155
+ 0.01
1156
+ ]
1157
+ },
1158
+ "masc_test_clean": {
1159
+ "diff": 0.01,
1160
+ "ci95": [
1161
+ -0.02,
1162
+ 0.03
1163
+ ]
1164
+ },
1165
+ "masc_test_noisy": {
1166
+ "diff": 0.02,
1167
+ "ci95": [
1168
+ -0.02,
1169
+ 0.06
1170
+ ]
1171
+ },
1172
+ "mgb2_test": {
1173
+ "diff": -0.09,
1174
+ "ci95": [
1175
+ -0.12,
1176
+ -0.07
1177
+ ]
1178
+ },
1179
+ "casablanca_test": {
1180
+ "diff": -0.04,
1181
+ "ci95": [
1182
+ -0.09,
1183
+ 0.01
1184
+ ]
1185
+ },
1186
+ "average": {
1187
+ "diff": -0.03,
1188
+ "ci95": [
1189
+ -0.04,
1190
+ -0.01
1191
+ ]
1192
+ }
1193
+ },
1194
+ "sygma-audar_fix": {
1195
+ "sada_test": {
1196
+ "diff": 5.36,
1197
+ "ci95": [
1198
+ 4.26,
1199
+ 6.45
1200
+ ]
1201
+ },
1202
+ "commonvoice_test": {
1203
+ "diff": -2.87,
1204
+ "ci95": [
1205
+ -3.13,
1206
+ -2.62
1207
+ ]
1208
+ },
1209
+ "masc_test_clean": {
1210
+ "diff": -1.24,
1211
+ "ci95": [
1212
+ -1.57,
1213
+ -0.91
1214
+ ]
1215
+ },
1216
+ "masc_test_noisy": {
1217
+ "diff": -3.36,
1218
+ "ci95": [
1219
+ -4.17,
1220
+ -2.56
1221
+ ]
1222
+ },
1223
+ "mgb2_test": {
1224
+ "diff": 1.53,
1225
+ "ci95": [
1226
+ 0.36,
1227
+ 2.46
1228
+ ]
1229
+ },
1230
+ "casablanca_test": {
1231
+ "diff": -5.44,
1232
+ "ci95": [
1233
+ -5.94,
1234
+ -4.93
1235
+ ]
1236
+ },
1237
+ "average": {
1238
+ "diff": -1.0,
1239
+ "ci95": [
1240
+ -1.32,
1241
+ -0.71
1242
+ ]
1243
+ }
1244
+ },
1245
+ "beam_bonus-audar_fix": {
1246
+ "sada_test": {
1247
+ "diff": 5.44,
1248
+ "ci95": [
1249
+ 4.35,
1250
+ 6.51
1251
+ ]
1252
+ },
1253
+ "commonvoice_test": {
1254
+ "diff": -2.87,
1255
+ "ci95": [
1256
+ -3.13,
1257
+ -2.62
1258
+ ]
1259
+ },
1260
+ "masc_test_clean": {
1261
+ "diff": -1.24,
1262
+ "ci95": [
1263
+ -1.57,
1264
+ -0.91
1265
+ ]
1266
+ },
1267
+ "masc_test_noisy": {
1268
+ "diff": -3.36,
1269
+ "ci95": [
1270
+ -4.17,
1271
+ -2.56
1272
+ ]
1273
+ },
1274
+ "mgb2_test": {
1275
+ "diff": 1.53,
1276
+ "ci95": [
1277
+ 0.36,
1278
+ 2.46
1279
+ ]
1280
+ },
1281
+ "casablanca_test": {
1282
+ "diff": -5.43,
1283
+ "ci95": [
1284
+ -5.94,
1285
+ -4.92
1286
+ ]
1287
+ },
1288
+ "average": {
1289
+ "diff": -0.99,
1290
+ "ci95": [
1291
+ -1.31,
1292
+ -0.7
1293
+ ]
1294
+ }
1295
+ },
1296
+ "beam_bonus-lennorm": {
1297
+ "sada_test": {
1298
+ "diff": -0.43,
1299
+ "ci95": [
1300
+ -0.77,
1301
+ -0.13
1302
+ ]
1303
+ },
1304
+ "commonvoice_test": {
1305
+ "diff": -0.23,
1306
+ "ci95": [
1307
+ -0.33,
1308
+ -0.13
1309
+ ]
1310
+ },
1311
+ "masc_test_clean": {
1312
+ "diff": -0.05,
1313
+ "ci95": [
1314
+ -0.16,
1315
+ 0.05
1316
+ ]
1317
+ },
1318
+ "masc_test_noisy": {
1319
+ "diff": -0.3,
1320
+ "ci95": [
1321
+ -0.45,
1322
+ -0.15
1323
+ ]
1324
+ },
1325
+ "mgb2_test": {
1326
+ "diff": -0.21,
1327
+ "ci95": [
1328
+ -0.43,
1329
+ 0.03
1330
+ ]
1331
+ },
1332
+ "casablanca_test": {
1333
+ "diff": -0.05,
1334
+ "ci95": [
1335
+ -0.25,
1336
+ 0.15
1337
+ ]
1338
+ },
1339
+ "average": {
1340
+ "diff": -0.21,
1341
+ "ci95": [
1342
+ -0.29,
1343
+ -0.13
1344
+ ]
1345
+ }
1346
+ }
1347
+ },
1348
+ "nondegenerate_intersection": {
1349
+ "sada_test": {
1350
+ "clips": 5948,
1351
+ "greedy": 33.92,
1352
+ "sygma": 32.45,
1353
+ "audar_raw": 27.52,
1354
+ "audar_fix": 27.52
1355
+ },
1356
+ "commonvoice_test": {
1357
+ "clips": 10471,
1358
+ "greedy": 5.41,
1359
+ "sygma": 5.26,
1360
+ "audar_raw": 8.13,
1361
+ "audar_fix": 8.13
1362
+ },
1363
+ "masc_test_clean": {
1364
+ "clips": 8608,
1365
+ "greedy": 16.24,
1366
+ "sygma": 15.95,
1367
+ "audar_raw": 17.19,
1368
+ "audar_fix": 17.19
1369
+ },
1370
+ "masc_test_noisy": {
1371
+ "clips": 9384,
1372
+ "greedy": 25.75,
1373
+ "sygma": 25.11,
1374
+ "audar_raw": 28.48,
1375
+ "audar_fix": 28.48
1376
+ },
1377
+ "mgb2_test": {
1378
+ "clips": 5353,
1379
+ "greedy": 14.99,
1380
+ "sygma": 13.54,
1381
+ "audar_raw": 11.99,
1382
+ "audar_fix": 11.99
1383
+ },
1384
+ "casablanca_test": {
1385
+ "clips": 6660,
1386
+ "greedy": 44.86,
1387
+ "sygma": 44.37,
1388
+ "audar_raw": 49.83,
1389
+ "audar_fix": 49.83
1390
+ }
1391
+ },
1392
+ "sada_by_duration": {
1393
+ "0-5s": {
1394
+ "clips": 3960,
1395
+ "greedy": 42.07,
1396
+ "beam_top": 40.62,
1397
+ "beam_bonus": 39.99,
1398
+ "sygma": 39.71,
1399
+ "audar_fix": 33.65
1400
+ },
1401
+ "5-10s": {
1402
+ "clips": 1036,
1403
+ "greedy": 35.86,
1404
+ "beam_top": 37.62,
1405
+ "beam_bonus": 31.47,
1406
+ "sygma": 31.43,
1407
+ "audar_fix": 27.48
1408
+ },
1409
+ "10-20s": {
1410
+ "clips": 641,
1411
+ "greedy": 40.65,
1412
+ "beam_top": 45.76,
1413
+ "beam_bonus": 33.87,
1414
+ "sygma": 33.86,
1415
+ "audar_fix": 26.04
1416
+ },
1417
+ "20-31s": {
1418
+ "clips": 409,
1419
+ "greedy": 30.07,
1420
+ "beam_top": 30.36,
1421
+ "beam_bonus": 30.31,
1422
+ "sygma": 30.31,
1423
+ "audar_fix": 26.33
1424
+ }
1425
+ },
1426
+ "detector_audit": {
1427
+ "sada_test": {
1428
+ "references_flagged": 8,
1429
+ "references": 6087,
1430
+ "greedy_flagged": 110,
1431
+ "greedy_flagged_with_wer_le_50": 17,
1432
+ "examples_flagged_refs": [
1433
+ "لا لا لا لا لا لا مو معقول يا شباب",
1434
+ "هلا هلا هلا ضحية ضحية جديد يا هلا هلا هلا هه",
1435
+ "دوم دوم دوم تتاكدون دوم دوم تك اها دوم دوم تك",
1436
+ "حياكم الله تموا بسم الله الله يحييك الله يحييكم الله يحييك الله بسم الله",
1437
+ "بشويش بشويش بشويش بشويش بشويش بشويش بشويش بشويش بشويش بسم الله عليك يا فهد سمي يوبا يا سعد يا ولدي روح نام"
1438
+ ],
1439
+ "filter_changed_choice": 16,
1440
+ "filter_changed_wer_bonus_only": 100.0,
1441
+ "filter_changed_wer_sygma": 61.99
1442
+ },
1443
+ "commonvoice_test": {
1444
+ "references_flagged": 1,
1445
+ "references": 10471,
1446
+ "greedy_flagged": 0,
1447
+ "greedy_flagged_with_wer_le_50": 0,
1448
+ "examples_flagged_refs": [
1449
+ "بالعــــــــــــــــزّ والأمــــــــــــــــان"
1450
+ ],
1451
+ "filter_changed_choice": 0,
1452
+ "filter_changed_wer_bonus_only": null,
1453
+ "filter_changed_wer_sygma": null
1454
+ },
1455
+ "masc_test_clean": {
1456
+ "references_flagged": 1,
1457
+ "references": 8612,
1458
+ "greedy_flagged": 4,
1459
+ "greedy_flagged_with_wer_le_50": 2,
1460
+ "examples_flagged_refs": [
1461
+ "و راحه و طمانينه و سعاده و قرب و امل و تفاؤل"
1462
+ ],
1463
+ "filter_changed_choice": 0,
1464
+ "filter_changed_wer_bonus_only": null,
1465
+ "filter_changed_wer_sygma": null
1466
+ },
1467
+ "masc_test_noisy": {
1468
+ "references_flagged": 1,
1469
+ "references": 9393,
1470
+ "greedy_flagged": 2,
1471
+ "greedy_flagged_with_wer_le_50": 0,
1472
+ "examples_flagged_refs": [
1473
+ "هيا هيا السندوتشات جاهزه هيا بنا هيا هيا هيا"
1474
+ ],
1475
+ "filter_changed_choice": 0,
1476
+ "filter_changed_wer_bonus_only": null,
1477
+ "filter_changed_wer_sygma": null
1478
+ },
1479
+ "mgb2_test": {
1480
+ "references_flagged": 0,
1481
+ "references": 5365,
1482
+ "greedy_flagged": 10,
1483
+ "greedy_flagged_with_wer_le_50": 3,
1484
+ "examples_flagged_refs": [],
1485
+ "filter_changed_choice": 0,
1486
+ "filter_changed_wer_bonus_only": null,
1487
+ "filter_changed_wer_sygma": null
1488
+ },
1489
+ "casablanca_test": {
1490
+ "references_flagged": 4,
1491
+ "references": 6726,
1492
+ "greedy_flagged": 29,
1493
+ "greedy_flagged_with_wer_le_50": 3,
1494
+ "examples_flagged_refs": [
1495
+ "ههههههههههههههه",
1496
+ " لا لا لا لا لا لا قلت لك ماينفعش ",
1497
+ "يلا أبوي، يلا يلا يلا يلا يلا، جان ما تطير عنا الطيارة يلا أبوي",
1498
+ "تتصرف بنفس التصرف بالكف بالكف بالكف بالكف بالكف بالكف"
1499
+ ],
1500
+ "filter_changed_choice": 5,
1501
+ "filter_changed_wer_bonus_only": 80.0,
1502
+ "filter_changed_wer_sygma": 75.0
1503
+ }
1504
+ },
1505
+ "reconstruction": {
1506
+ "sada_test": {
1507
+ "manifest_rows": 6189,
1508
+ "matched": 6087,
1509
+ "missing": 102,
1510
+ "rows_with_shared_text": 305,
1511
+ "rows_with_shared_text_and_duration_within_0.1s": 177,
1512
+ "missing_mean_duration": 17.55,
1513
+ "all_mean_duration": 6.25,
1514
+ "missing_mean_words": 35.63,
1515
+ "all_mean_words": 13.92
1516
+ },
1517
+ "casablanca_test": {
1518
+ "manifest_rows": 6726,
1519
+ "matched": 6726,
1520
+ "missing": 0,
1521
+ "rows_with_shared_text": 52,
1522
+ "rows_with_shared_text_and_duration_within_0.1s": 12,
1523
+ "missing_mean_duration": null,
1524
+ "all_mean_duration": 4.12,
1525
+ "missing_mean_words": null,
1526
+ "all_mean_words": 11.16
1527
+ }
1528
+ },
1529
+ "sensitivity_no_ambiguous": {
1530
+ "sada_test": {
1531
+ "clips": 5911,
1532
+ "greedy": 36.52,
1533
+ "beam_bonus": 33.63,
1534
+ "sygma": 33.55,
1535
+ "lennorm_filter": 33.87,
1536
+ "audar_fix": 28.25
1537
+ },
1538
+ "commonvoice_test": {
1539
+ "clips": 10471,
1540
+ "greedy": 5.41,
1541
+ "beam_bonus": 5.26,
1542
+ "sygma": 5.26,
1543
+ "lennorm_filter": 5.47,
1544
+ "audar_fix": 8.13
1545
+ },
1546
+ "masc_test_clean": {
1547
+ "clips": 8612,
1548
+ "greedy": 16.33,
1549
+ "beam_bonus": 15.95,
1550
+ "sygma": 15.95,
1551
+ "lennorm_filter": 16.0,
1552
+ "audar_fix": 17.2
1553
+ },
1554
+ "masc_test_noisy": {
1555
+ "clips": 9393,
1556
+ "greedy": 25.78,
1557
+ "beam_bonus": 25.13,
1558
+ "sygma": 25.13,
1559
+ "lennorm_filter": 25.41,
1560
+ "audar_fix": 28.49
1561
+ },
1562
+ "mgb2_test": {
1563
+ "clips": 5365,
1564
+ "greedy": 15.19,
1565
+ "beam_bonus": 13.56,
1566
+ "sygma": 13.56,
1567
+ "lennorm_filter": 13.76,
1568
+ "audar_fix": 12.03
1569
+ },
1570
+ "casablanca_test": {
1571
+ "clips": 6714,
1572
+ "greedy": 45.61,
1573
+ "beam_bonus": 44.67,
1574
+ "sygma": 44.66,
1575
+ "lennorm_filter": 44.65,
1576
+ "audar_fix": 50.12
1577
+ },
1578
+ "average": {
1579
+ "greedy": 24.14,
1580
+ "beam_bonus": 23.03,
1581
+ "sygma": 23.02,
1582
+ "lennorm_filter": 23.19,
1583
+ "audar_fix": 24.04
1584
+ },
1585
+ "removed": {
1586
+ "sada_test": 177,
1587
+ "casablanca_test": 12
1588
+ },
1589
+ "bootstrap": {
1590
+ "beam_bonus-greedy": {
1591
+ "sada_test": {
1592
+ "diff": -2.89,
1593
+ "ci95": [
1594
+ -3.97,
1595
+ -1.97
1596
+ ]
1597
+ },
1598
+ "commonvoice_test": {
1599
+ "diff": -0.15,
1600
+ "ci95": [
1601
+ -0.23,
1602
+ -0.07
1603
+ ]
1604
+ },
1605
+ "masc_test_clean": {
1606
+ "diff": -0.37,
1607
+ "ci95": [
1608
+ -0.63,
1609
+ -0.15
1610
+ ]
1611
+ },
1612
+ "masc_test_noisy": {
1613
+ "diff": -0.66,
1614
+ "ci95": [
1615
+ -0.94,
1616
+ -0.38
1617
+ ]
1618
+ },
1619
+ "mgb2_test": {
1620
+ "diff": -1.64,
1621
+ "ci95": [
1622
+ -2.32,
1623
+ -1.04
1624
+ ]
1625
+ },
1626
+ "casablanca_test": {
1627
+ "diff": -0.94,
1628
+ "ci95": [
1629
+ -1.45,
1630
+ -0.52
1631
+ ]
1632
+ },
1633
+ "average": {
1634
+ "diff": -1.11,
1635
+ "ci95": [
1636
+ -1.34,
1637
+ -0.9
1638
+ ]
1639
+ }
1640
+ },
1641
+ "sygma-audar_fix": {
1642
+ "sada_test": {
1643
+ "diff": 5.3,
1644
+ "ci95": [
1645
+ 4.21,
1646
+ 6.37
1647
+ ]
1648
+ },
1649
+ "commonvoice_test": {
1650
+ "diff": -2.87,
1651
+ "ci95": [
1652
+ -3.13,
1653
+ -2.62
1654
+ ]
1655
+ },
1656
+ "masc_test_clean": {
1657
+ "diff": -1.24,
1658
+ "ci95": [
1659
+ -1.58,
1660
+ -0.91
1661
+ ]
1662
+ },
1663
+ "masc_test_noisy": {
1664
+ "diff": -3.36,
1665
+ "ci95": [
1666
+ -4.19,
1667
+ -2.55
1668
+ ]
1669
+ },
1670
+ "mgb2_test": {
1671
+ "diff": 1.53,
1672
+ "ci95": [
1673
+ 0.38,
1674
+ 2.48
1675
+ ]
1676
+ },
1677
+ "casablanca_test": {
1678
+ "diff": -5.45,
1679
+ "ci95": [
1680
+ -5.95,
1681
+ -4.96
1682
+ ]
1683
+ },
1684
+ "average": {
1685
+ "diff": -1.02,
1686
+ "ci95": [
1687
+ -1.33,
1688
+ -0.72
1689
+ ]
1690
+ }
1691
+ },
1692
+ "beam_bonus-audar_fix": {
1693
+ "sada_test": {
1694
+ "diff": 5.38,
1695
+ "ci95": [
1696
+ 4.31,
1697
+ 6.44
1698
+ ]
1699
+ },
1700
+ "commonvoice_test": {
1701
+ "diff": -2.87,
1702
+ "ci95": [
1703
+ -3.13,
1704
+ -2.62
1705
+ ]
1706
+ },
1707
+ "masc_test_clean": {
1708
+ "diff": -1.24,
1709
+ "ci95": [
1710
+ -1.58,
1711
+ -0.91
1712
+ ]
1713
+ },
1714
+ "masc_test_noisy": {
1715
+ "diff": -3.36,
1716
+ "ci95": [
1717
+ -4.19,
1718
+ -2.55
1719
+ ]
1720
+ },
1721
+ "mgb2_test": {
1722
+ "diff": 1.53,
1723
+ "ci95": [
1724
+ 0.38,
1725
+ 2.48
1726
+ ]
1727
+ },
1728
+ "casablanca_test": {
1729
+ "diff": -5.45,
1730
+ "ci95": [
1731
+ -5.95,
1732
+ -4.96
1733
+ ]
1734
+ },
1735
+ "average": {
1736
+ "diff": -1.0,
1737
+ "ci95": [
1738
+ -1.32,
1739
+ -0.7
1740
+ ]
1741
+ }
1742
+ }
1743
+ }
1744
+ },
1745
+ "examples_wer": {
1746
+ "6k_v_SBA_187_1-seg_287_573-290_051": {
1747
+ "greedy": 12.5,
1748
+ "beam_bonus": 12.5,
1749
+ "sygma": 12.5,
1750
+ "audar_raw": 12.5,
1751
+ "audar_fix": 12.5
1752
+ },
1753
+ "6k_SBA_116_0-seg_400_170-403_210": {
1754
+ "greedy": 57.1,
1755
+ "beam_bonus": 28.6,
1756
+ "sygma": 28.6,
1757
+ "audar_raw": 14.3,
1758
+ "audar_fix": 14.3
1759
+ },
1760
+ "6k_v_SBA_32_3-seg_284_515-290_800": {
1761
+ "greedy": 850.0,
1762
+ "beam_bonus": 83.3,
1763
+ "sygma": 83.3,
1764
+ "audar_raw": 7333.3,
1765
+ "audar_fix": 116.7
1766
+ },
1767
+ "6k_v_SBA_41_1-seg_133_300-152_850": {
1768
+ "greedy": 607.1,
1769
+ "beam_bonus": 100.0,
1770
+ "sygma": 100.0,
1771
+ "audar_raw": 1035.7,
1772
+ "audar_fix": 92.9
1773
+ }
1774
+ },
1775
+ "examples_reward_only_same_as_sygma": {
1776
+ "6k_v_SBA_187_1-seg_287_573-290_051": true,
1777
+ "6k_SBA_116_0-seg_400_170-403_210": true,
1778
+ "6k_v_SBA_32_3-seg_284_515-290_800": true,
1779
+ "6k_v_SBA_41_1-seg_133_300-152_850": false
1780
+ },
1781
+ "qwen_truncation": {
1782
+ "unique_hypotheses": 368358,
1783
+ "over_400_tokens": 0,
1784
+ "over_400_degenerate": 0
1785
+ }
1786
+ }
analysis/reviewer_analyses.py ADDED
@@ -0,0 +1,388 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Offline analyses requested in review, computed from saved artifacts (no new decoding).
2
+
3
+ Inputs (downloaded from gdrive:ASR/...):
4
+ nbest/<set>.jsonl 8-best lists per clip: text, am (summed log-prob, length penalty 0),
5
+ degenerate flag, qwen (Qwen3-1.7B-Base log-prob, nats)
6
+ [gdrive:ASR/paper_artifacts/qwen_rescoring]
7
+ base/base_<set>.jsonl greedy outputs of the base model [gdrive:ASR/benchmarks/leaderboard_base]
8
+ audar/audar[fix]_<set> Audar raw / with repair [gdrive:ASR/paper_artifacts/pod_final_snapshot/bench_outputs]
9
+ lb/<set>.json leaderboard manifests (GitHub)
10
+
11
+ .venv/bin/python paper/analysis/reviewer_analyses.py --art <dir> --out paper/analysis/results.json
12
+ """
13
+
14
+ import argparse
15
+ import json
16
+ import math
17
+ import random
18
+ import re
19
+ import sys
20
+ from collections import Counter, defaultdict
21
+ from pathlib import Path
22
+
23
+ # The decoder (sygma_asr.py + cohere_asr/) sits at the repository root in the Hugging Face release
24
+ # (analysis/ is one level down) and in hf_release/Sygma-ASR-Arabic/ in the development tree.
25
+ _here = Path(__file__).resolve().parent
26
+ DECODER = next(c for c in (_here.parent, _here.parents[1] / "hf_release" / "Sygma-ASR-Arabic")
27
+ if (c / "sygma_asr.py").exists())
28
+ sys.path.insert(0, str(DECODER))
29
+ from sygma_asr import is_degenerate # noqa: E402 (the released detector)
30
+
31
+ SETS = ["sada_test", "commonvoice_test", "masc_test_clean", "masc_test_noisy", "mgb2_test", "casablanca_test"]
32
+ BASE_FILES = {"sada_test": "base_sada_test", "commonvoice_test": "base_cv_commonvoice_test",
33
+ "masc_test_clean": "base_masc_test_clean", "masc_test_noisy": "base_masc_test_noisy",
34
+ "mgb2_test": "base_mgb2_test", "casablanca_test": "base_casablanca_test"}
35
+ BETA, Q_ALPHA, Q_BETA = 1.0, 0.01, 1.5
36
+
37
+
38
+ def normalize_arabic_text(text):
39
+ """Verbatim copy of the leaderboard's eval.py normalization (= finetune/bench.py)."""
40
+ text = re.sub(r'[!"#$%&\'()*+,\-./:;<=>?@\[\\\]^_`{|}~،؛؟]', '', text)
41
+ text = re.sub(r'[ً-ْ]', '', text)
42
+ text = re.sub('پ', 'ب', text)
43
+ text = re.sub('ڤ', 'ف', text)
44
+ text = re.sub(r'[آ]', 'ا', text)
45
+ text = re.sub(r'[أإ]', 'ا', text)
46
+ text = re.sub(r'[ؤ]', 'و', text)
47
+ text = re.sub(r'[ئ]', 'ي', text)
48
+ text = re.sub(r'[ء]', '', text)
49
+ for e, w in zip('٠١٢٣٤٥٦٧٨٩', '0123456789'):
50
+ text = text.replace(e, w)
51
+ text = re.sub(r'(^|\s)و\s+', r'\1و', text)
52
+ return re.sub(r'\s+', ' ', text).strip()
53
+
54
+
55
+ def sdi(ref, hyp):
56
+ """Word-level (substitutions, deletions, insertions, reference words), scored with jiwer
57
+ exactly as in finetune/bench.py."""
58
+ import jiwer
59
+ n = len(ref.split())
60
+ if not ref.strip():
61
+ return 0, 0, len(hyp.split()), 0
62
+ if not hyp.strip():
63
+ return 0, n, 0, n
64
+ o = jiwer.process_words(ref, hyp)
65
+ return o.substitutions, o.deletions, o.insertions, n
66
+
67
+
68
+ def _words(text):
69
+ """Word count used for the benchmarked results: words after the leaderboard normalization
70
+ (finetune/rescore.py: len(N(t).split()))."""
71
+ return len(normalize_arabic_text(text).split())
72
+
73
+
74
+ def cluster_of(set_name, cid):
75
+ """Recording-level cluster for the bootstrap (clips of one recording are resampled together)."""
76
+ if set_name == "sada_test": # 6k_v_SBA2_2011_1-seg_... -> episode 6k_v_SBA2_2011
77
+ return re.sub(r"_\d+$", "", cid.split("-seg")[0])
78
+ if set_name.startswith("masc"): # <video_id>_<start>
79
+ return cid.rsplit("_", 1)[0]
80
+ if set_name == "mgb2_test": # <program-guid>_spk-..._seg-...
81
+ return cid.split("_spk")[0]
82
+ if set_name == "casablanca_test": # <recording>_<segment>
83
+ return cid.split("_")[0]
84
+ return cid # Common Voice: no speaker id survives in the manifest (its `id` is unique per clip) -> clip level
85
+
86
+
87
+ def load_jsonl(p):
88
+ return [json.loads(l) for l in open(p, encoding="utf-8")]
89
+
90
+
91
+ def stem(name):
92
+ return Path(name).name.rsplit(".wav", 1)[0]
93
+
94
+
95
+ def pick(hyps, key, filt):
96
+ """Benchmarked selection (finetune/rescore.py): if every hypothesis is degenerate, all are re-scored."""
97
+ pool = [h for h in hyps if not (filt and h["degenerate"])] or hyps
98
+ return max(pool, key=key)["text"]
99
+
100
+
101
+ def pick_release(hyps):
102
+ """Released sygma_asr.py: word count on punctuation-stripped raw text; top beam if all are degenerate."""
103
+ from sygma_asr import _words as raw_words
104
+ good = [h for h in hyps if not h["degenerate"]]
105
+ return max(good, key=lambda h: h["am"] + BETA * raw_words(h["text"]))["text"] if good else hyps[0]["text"]
106
+
107
+
108
+ def main():
109
+ ap = argparse.ArgumentParser()
110
+ ap.add_argument("--art", required=True)
111
+ ap.add_argument("--out", required=True)
112
+ ap.add_argument("--boot", type=int, default=10000)
113
+ args = ap.parse_args()
114
+ art = Path(args.art)
115
+ res = {}
116
+
117
+ # token lengths for the length-normalization baseline (the model's own tokenizer)
118
+ from huggingface_hub import snapshot_download
119
+ from cohere_asr.tokenization_cohere_asr import CohereAsrTokenizer
120
+ tok = CohereAsrTokenizer.from_pretrained(snapshot_download("CohereLabs/cohere-transcribe-arabic-07-2026"))
121
+ tl_cache = {}
122
+
123
+ def ntok(t):
124
+ if t not in tl_cache:
125
+ tl_cache[t] = len(tok(t, add_special_tokens=False)["input_ids"]) + 1 # + EOS
126
+ return tl_cache[t]
127
+
128
+ # ---------- dev set: tune the length-normalization exponent (pooled 608 clips) ----------
129
+ dev = load_jsonl(art / "nbest/dev_youtube_najdi.jsonl") + load_jsonl(art / "nbest/dev_saudi_podcasts.jsonl")
130
+
131
+ def corpus_wer(pairs):
132
+ e = w = 0
133
+ for ref, hyp in pairs:
134
+ s, d, i, n = sdi(normalize_arabic_text(ref), normalize_arabic_text(hyp))
135
+ e += s + d + i
136
+ w += n
137
+ return 100 * e / w
138
+
139
+ lam_grid = [0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 2.5, 3.0, 4.0, 6.0]
140
+ dev_ln = {}
141
+ for filt in (False, True):
142
+ for lam in lam_grid:
143
+ dev_ln[(filt, lam)] = corpus_wer([(r["ref"], pick(r["hyps"], lambda h: h["am"] / ntok(h["text"]) ** lam, filt)) for r in dev])
144
+ best_ln = {filt: min(lam_grid, key=lambda l: dev_ln[(filt, l)]) for filt in (False, True)}
145
+ res["dev_lennorm"] = {f"{'filter' if f else 'nofilter'}_lambda{l}": round(v, 2) for (f, l), v in dev_ln.items()}
146
+ res["dev_lennorm_best"] = {("filter" if f else "nofilter"): l for f, l in best_ln.items()}
147
+ dev_sys = {
148
+ "beam_top": lambda r: r["hyps"][0]["text"],
149
+ "beam_filter": lambda r: pick(r["hyps"], lambda h: h["am"], True),
150
+ "beam_bonus": lambda r: pick(r["hyps"], lambda h: h["am"] + BETA * _words(h["text"]), False),
151
+ "sygma": lambda r: pick(r["hyps"], lambda h: h["am"] + BETA * _words(h["text"]), True),
152
+ }
153
+ res["dev"] = {k: round(corpus_wer([(r["ref"], f(r)) for r in dev]), 2) for k, f in dev_sys.items()}
154
+ res["dev_beta_curve"] = {("filter" if filt else "nofilter"): {str(b): round(corpus_wer(
155
+ [(r["ref"], pick(r["hyps"], lambda h, b=b: h["am"] + b * _words(h["text"]), filt)) for r in dev]), 2)
156
+ for b in (0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 2.5, 3.0)} for filt in (False, True)}
157
+ res["dev_youtube_only_beam_top"] = round(corpus_wer([(r["ref"], r["hyps"][0]["text"]) for r in dev[:600]]), 2)
158
+
159
+ # ---------- test sets ----------
160
+ systems = ["greedy", "beam_top", "beam_filter", "beam_bonus", "sygma", "sygma_release", "lennorm", "lennorm_filter",
161
+ "qwen", "nolm_b15", "audar_raw", "audar_fix"]
162
+ per = {} # set -> system -> list of (S, D, I, N) aligned by clip
163
+ meta = {}
164
+ for s in SETS:
165
+ nb = {stem(r["file"]): r for r in load_jsonl(art / f"nbest/{s}.jsonl")}
166
+ greedy = {stem(r["audio_filepath"]): r for r in load_jsonl(art / f"base/{BASE_FILES[s]}.jsonl")}
167
+ araw = {stem(r["audio_filepath"]): r for r in load_jsonl(art / f"audar/audar_{s}.jsonl")}
168
+ afix = {stem(r["audio_filepath"]): r for r in load_jsonl(art / f"audar/audarfix_{s}.jsonl")}
169
+ ids = [i for i in greedy if i in nb and i in araw and i in afix]
170
+ outs = defaultdict(list)
171
+ for cid in ids:
172
+ hy = nb[cid]["hyps"]
173
+ outs["greedy"].append(greedy[cid]["pred_text"])
174
+ outs["beam_top"].append(hy[0]["text"])
175
+ outs["beam_filter"].append(pick(hy, lambda h: h["am"], True))
176
+ outs["beam_bonus"].append(pick(hy, lambda h: h["am"] + BETA * _words(h["text"]), False))
177
+ outs["sygma"].append(pick(hy, lambda h: h["am"] + BETA * _words(h["text"]), True))
178
+ outs["sygma_release"].append(pick_release(hy))
179
+ outs["lennorm"].append(pick(hy, lambda h: h["am"] / ntok(h["text"]) ** best_ln[False], False))
180
+ outs["lennorm_filter"].append(pick(hy, lambda h: h["am"] / ntok(h["text"]) ** best_ln[True], True))
181
+ outs["qwen"].append(pick(hy, lambda h: h["am"] + Q_ALPHA * h["qwen"] + Q_BETA * _words(h["text"]), True))
182
+ outs["nolm_b15"].append(pick(hy, lambda h: h["am"] + Q_BETA * _words(h["text"]), True))
183
+ outs["audar_raw"].append(araw[cid]["pred_text"])
184
+ outs["audar_fix"].append(afix[cid]["pred_text"])
185
+ refs = [greedy[c]["text"] for c in ids]
186
+ per[s] = {k: [sdi(normalize_arabic_text(r), normalize_arabic_text(h)) for r, h in zip(refs, outs[k])] for k in systems}
187
+ meta[s] = {"ids": ids, "dur": [greedy[c]["duration"] for c in ids], "refs": refs,
188
+ "outs": outs,
189
+ "clusters": [greedy[c]["id"] if s == "commonvoice_test" else cluster_of(s, c) for c in ids]}
190
+ print(f"[{s}] {len(ids)} clips", flush=True)
191
+
192
+ def wer_of(rows, idx=None):
193
+ it = rows if idx is None else (rows[i] for i in idx)
194
+ e = w = 0
195
+ for a, b, c, n in it:
196
+ e += a + b + c
197
+ w += n
198
+ return 100 * e / w if w else float("nan")
199
+
200
+ table = {}
201
+ for s in SETS:
202
+ table[s] = {}
203
+ for k in systems:
204
+ S_ = sum(x[0] for x in per[s][k]); D = sum(x[1] for x in per[s][k]); I = sum(x[2] for x in per[s][k]); N = sum(x[3] for x in per[s][k])
205
+ table[s][k] = {"wer": round(wer_of(per[s][k]), 2), "S": S_, "D": D, "I": I, "N": N,
206
+ "degenerate": sum(is_degenerate(o) for o in meta[s]["outs"][k])}
207
+ table[s]["clips"] = len(meta[s]["ids"])
208
+ table["average"] = {k: round(sum(wer_of(per[s][k]) for s in SETS) / len(SETS), 2) for k in systems}
209
+ res["test"] = table
210
+
211
+ # ---------- paired cluster bootstrap (resample recordings; macro-average recomputed per replicate) ----------
212
+ import numpy as np
213
+ nrng = np.random.default_rng(0)
214
+ cl_idx, cl_err, cl_n = {}, {}, {}
215
+ for s in SETS:
216
+ names = sorted(set(meta[s]["clusters"]))
217
+ pos = {c: j for j, c in enumerate(names)}
218
+ cl_idx[s] = np.array([pos[c] for c in meta[s]["clusters"]])
219
+ cl_err[s], cl_n[s] = {}, {}
220
+ for k in systems:
221
+ e = np.array([a + b_ + c for a, b_, c, _ in per[s][k]], dtype=float)
222
+ n = np.array([x[3] for x in per[s][k]], dtype=float)
223
+ cl_err[s][k] = np.bincount(cl_idx[s], weights=e, minlength=len(names))
224
+ cl_n[s][k] = np.bincount(cl_idx[s], weights=n, minlength=len(names))
225
+ res["n_clusters"] = {s: int(cl_idx[s].max() + 1) for s in SETS}
226
+ # per-set, per-system WER for every replicate; replicates drawn in chunks to bound memory.
227
+ # Each replicate draws n_clusters recordings with replacement (multinomial counts), so a
228
+ # recording drawn twice contributes its errors and words twice.
229
+ boot = {s: {k: [] for k in systems} for s in SETS}
230
+ chunk = 1000
231
+ for start in range(0, args.boot, chunk):
232
+ m = min(chunk, args.boot - start)
233
+ for s in SETS:
234
+ n_c = res["n_clusters"][s]
235
+ cnt = nrng.multinomial(n_c, np.full(n_c, 1 / n_c), size=m).astype(np.float32)
236
+ for k in systems:
237
+ boot[s][k].append(100 * (cnt @ cl_err[s][k]) / (cnt @ cl_n[s][k]))
238
+ boot = {s: {k: np.concatenate(v) for k, v in d.items()} for s, d in boot.items()}
239
+
240
+ def boot_wer(s, k):
241
+ return boot[s][k]
242
+
243
+ def ci(v):
244
+ lo, hi = np.percentile(np.asarray(v), [2.5, 97.5]) # numpy default (linear interpolation)
245
+ return [round(float(lo), 2), round(float(hi), 2)]
246
+
247
+ pairs = [("sygma", "greedy"), ("beam_bonus", "greedy"), ("beam_filter", "greedy"), ("beam_top", "greedy"),
248
+ ("sygma", "beam_bonus"), ("sygma", "beam_filter"), ("sygma", "lennorm_filter"), ("lennorm_filter", "greedy"),
249
+ ("qwen", "sygma"), ("qwen", "nolm_b15"), ("sygma", "audar_fix"), ("beam_bonus", "audar_fix"),
250
+ ("beam_bonus", "lennorm")]
251
+ res["bootstrap"] = {}
252
+ for a, bb in pairs:
253
+ d = {s: boot_wer(s, a) - boot_wer(s, bb) for s in SETS}
254
+ avg = sum(d[s] for s in SETS) / len(SETS)
255
+ point = {s: round(wer_of(per[s][a]) - wer_of(per[s][bb]), 2) for s in SETS}
256
+ point["average"] = round(sum(wer_of(per[s][a]) - wer_of(per[s][bb]) for s in SETS) / len(SETS), 2)
257
+ res["bootstrap"][f"{a}-{bb}"] = {**{s: {"diff": point[s], "ci95": ci(d[s])} for s in SETS},
258
+ "average": {"diff": point["average"], "ci95": ci(avg)}}
259
+
260
+ # ---------- same non-degenerate intersection ----------
261
+ inter = {}
262
+ for s in SETS:
263
+ o = meta[s]["outs"]
264
+ keep = [i for i in range(len(meta[s]["ids"]))
265
+ if not any(is_degenerate(o[k][i]) for k in ("greedy", "sygma", "audar_raw"))]
266
+ inter[s] = {"clips": len(keep), **{k: round(wer_of(per[s][k], keep), 2) for k in ("greedy", "sygma", "audar_raw", "audar_fix")}}
267
+ res["nondegenerate_intersection"] = inter
268
+
269
+ # ---------- SADA by duration (all clips) ----------
270
+ buckets = [(0, 5), (5, 10), (10, 20), (20, 31)]
271
+ dd = {}
272
+ for lo, hi in buckets:
273
+ idx = [i for i, d in enumerate(meta["sada_test"]["dur"]) if lo <= d < hi]
274
+ dd[f"{lo}-{hi}s"] = {"clips": len(idx), **{k: round(wer_of(per["sada_test"][k], idx), 2)
275
+ for k in ("greedy", "beam_top", "beam_bonus", "sygma", "audar_fix")}}
276
+ res["sada_by_duration"] = dd
277
+
278
+ # ---------- detector audit ----------
279
+ aud = {}
280
+ for s in SETS:
281
+ refs = meta[s]["refs"]
282
+ o = meta[s]["outs"]
283
+ flagged_refs = [r for r in refs if is_degenerate(r)]
284
+ fl = [i for i, h in enumerate(o["greedy"]) if is_degenerate(h)]
285
+ low = [i for i in fl if wer_of([per[s]["greedy"][i]]) <= 50]
286
+ aud[s] = {"references_flagged": len(flagged_refs), "references": len(refs),
287
+ "greedy_flagged": len(fl), "greedy_flagged_with_wer_le_50": len(low),
288
+ "examples_flagged_refs": flagged_refs[:5]}
289
+ # clips where the filter changed Sygma's choice vs. bonus-only, and the effect
290
+ ch = [i for i in range(len(refs)) if o["sygma"][i] != o["beam_bonus"][i]]
291
+ aud[s]["filter_changed_choice"] = len(ch)
292
+ aud[s]["filter_changed_wer_bonus_only"] = round(wer_of(per[s]["beam_bonus"], ch), 2) if ch else None
293
+ aud[s]["filter_changed_wer_sygma"] = round(wer_of(per[s]["sygma"], ch), 2) if ch else None
294
+ res["detector_audit"] = aud
295
+
296
+ # ---------- benchmark reconstruction audit ----------
297
+ rec = {}
298
+ for s in ("sada_test", "casablanca_test"):
299
+ lb = [json.loads(l) for l in open(art / f"lb/{s}.json", encoding="utf-8")]
300
+ texts = Counter(normalize_arabic_text(r["text"]) for r in lb)
301
+ lid = lambda r: r.get("id") or stem(r["audio_filepath"])
302
+ have = set(meta[s]["ids"])
303
+ missing = [r for r in lb if lid(r) not in have]
304
+ amb = [r for r in lb if texts[normalize_arabic_text(r["text"])] > 1]
305
+ amb_dur = [r for r in amb if sum(1 for q in amb if normalize_arabic_text(q["text"]) == normalize_arabic_text(r["text"])
306
+ and abs(q["duration"] - r["duration"]) <= 0.1) > 1]
307
+ rec[s] = {"manifest_rows": len(lb), "matched": len(lb) - len(missing), "missing": len(missing),
308
+ "rows_with_shared_text": len(amb), "rows_with_shared_text_and_duration_within_0.1s": len(amb_dur),
309
+ "missing_mean_duration": round(sum(r["duration"] for r in missing) / len(missing), 2) if missing else None,
310
+ "all_mean_duration": round(sum(r["duration"] for r in lb) / len(lb), 2),
311
+ "missing_mean_words": round(sum(len(r["text"].split()) for r in missing) / len(missing), 2) if missing else None,
312
+ "all_mean_words": round(sum(len(r["text"].split()) for r in lb) / len(lb), 2)}
313
+ res["reconstruction"] = rec
314
+
315
+ # ---------- sensitivity: drop leaderboard rows whose text+duration match is ambiguous ----------
316
+ sens = {}
317
+ amb_ids = {}
318
+ for s in ("sada_test", "casablanca_test"):
319
+ lb = [json.loads(l) for l in open(art / f"lb/{s}.json", encoding="utf-8")]
320
+ lid = lambda r: r.get("id") or stem(r["audio_filepath"])
321
+ by_text = defaultdict(list)
322
+ for r in lb:
323
+ by_text[normalize_arabic_text(r["text"])].append(r)
324
+ amb_ids[s] = {lid(r) for grp in by_text.values() if len(grp) > 1 for r in grp
325
+ if sum(1 for q in grp if abs(q["duration"] - r["duration"]) <= 0.1) > 1}
326
+ for s in SETS:
327
+ keep = [i for i, c in enumerate(meta[s]["ids"]) if c not in amb_ids.get(s, set())]
328
+ sens[s] = {"clips": len(keep), **{k: round(wer_of(per[s][k], keep), 2)
329
+ for k in ("greedy", "beam_bonus", "sygma", "lennorm_filter", "audar_fix")}}
330
+ sens["average"] = {k: round(sum(sens[s][k] for s in SETS) / len(SETS), 2)
331
+ for k in ("greedy", "beam_bonus", "sygma", "lennorm_filter", "audar_fix")}
332
+ sens["removed"] = {s: len(amb_ids[s]) for s in amb_ids}
333
+ keepmask = {s: [c not in amb_ids.get(s, set()) for c in meta[s]["ids"]] for s in SETS}
334
+ sb = {s: {} for s in SETS}
335
+ for s in SETS:
336
+ idx = [i for i, k in enumerate(keepmask[s]) if k]
337
+ names = sorted({meta[s]["clusters"][i] for i in idx}); pos = {c: j for j, c in enumerate(names)}
338
+ ci_ = np.array([pos[meta[s]["clusters"][i]] for i in idx])
339
+ for k in ("greedy", "beam_bonus", "sygma", "audar_fix"):
340
+ e = np.array([sum(per[s][k][i][:3]) for i in idx], float); n = np.array([per[s][k][i][3] for i in idx], float)
341
+ sb[s][k] = (np.bincount(ci_, weights=e, minlength=len(names)), np.bincount(ci_, weights=n, minlength=len(names)))
342
+ sb[s]["_n"] = len(names)
343
+ srng = np.random.default_rng(1)
344
+ acc = {pr: {s: [] for s in SETS} for pr in [("beam_bonus", "greedy"), ("sygma", "audar_fix"), ("beam_bonus", "audar_fix")]}
345
+ for start in range(0, args.boot, 1000):
346
+ m = min(1000, args.boot - start)
347
+ for s in SETS:
348
+ n_c = sb[s]["_n"]; cnt = srng.multinomial(n_c, np.full(n_c, 1 / n_c), size=m).astype(np.float32)
349
+ w = {k: 100 * (cnt @ sb[s][k][0]) / (cnt @ sb[s][k][1]) for k in ("greedy", "beam_bonus", "sygma", "audar_fix")}
350
+ for a_, b_ in acc:
351
+ acc[(a_, b_)][s].append(w[a_] - w[b_])
352
+ sens["bootstrap"] = {}
353
+ for (a_, b_), d in acc.items():
354
+ d = {s: np.concatenate(v) for s, v in d.items()}
355
+ avg = sum(d[s] for s in SETS) / len(SETS)
356
+ kept = {s: [i for i, k in enumerate(keepmask[s]) if k] for s in SETS}
357
+ pt = {s: wer_of(per[s][a_], kept[s]) - wer_of(per[s][b_], kept[s]) for s in SETS}
358
+ sens["bootstrap"][f"{a_}-{b_}"] = {**{s: {"diff": round(pt[s], 2), "ci95": ci(d[s])} for s in SETS},
359
+ "average": {"diff": round(sum(pt.values()) / len(SETS), 2), "ci95": ci(avg)}}
360
+ res["sensitivity_no_ambiguous"] = sens
361
+
362
+ # ---------- WER of the example outputs (Table: real outputs) ----------
363
+ ex_ids = ["6k_v_SBA_187_1-seg_287_573-290_051", "6k_SBA_116_0-seg_400_170-403_210",
364
+ "6k_v_SBA_32_3-seg_284_515-290_800", "6k_v_SBA_41_1-seg_133_300-152_850"]
365
+ pos = {c: i for i, c in enumerate(meta["sada_test"]["ids"])}
366
+ res["examples_wer"] = {c: {k: round(wer_of([per["sada_test"][k][pos[c]]]), 1)
367
+ for k in ("greedy", "beam_bonus", "sygma", "audar_raw", "audar_fix")} for c in ex_ids}
368
+ res["examples_reward_only_same_as_sygma"] = {c: meta["sada_test"]["outs"]["beam_bonus"][pos[c]] == meta["sada_test"]["outs"]["sygma"][pos[c]] for c in ex_ids}
369
+
370
+ # ---------- Qwen truncation: hypotheses longer than 400 Qwen tokens ----------
371
+ try:
372
+ from transformers import AutoTokenizer
373
+ qtok = AutoTokenizer.from_pretrained("Qwen/Qwen3-1.7B-Base")
374
+ texts = {h["text"] for s in SETS + ["dev_youtube_najdi", "dev_saudi_podcasts"]
375
+ for r in load_jsonl(art / f"nbest/{s}.jsonl") for h in r["hyps"]}
376
+ long_ = [t for t in texts if len(qtok(t, add_special_tokens=False)["input_ids"]) > 400]
377
+ res["qwen_truncation"] = {"unique_hypotheses": len(texts), "over_400_tokens": len(long_),
378
+ "over_400_degenerate": sum(is_degenerate(t) for t in long_)}
379
+ except Exception as e: # tokenizer download unavailable
380
+ res["qwen_truncation"] = {"error": str(e)}
381
+
382
+ Path(args.out).write_text(json.dumps(res, ensure_ascii=False, indent=1))
383
+ print(json.dumps({k: res[k] for k in ("dev", "dev_lennorm_best")}, indent=1))
384
+ print(json.dumps(res["test"]["average"], indent=1))
385
+
386
+
387
+ if __name__ == "__main__":
388
+ main()
paper_artifacts/README.md ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Paper artifacts: predictions and 8-best lists
2
+
3
+ These are the per-clip system outputs behind every table of the paper *Sygma ASR Arabic: Improving Dialectal Speech Recognition through Length-Corrected N-Best Decoding*.
4
+
5
+ **No reference transcripts are included.** `analysis/attach_references.py` re-attaches them from their public sources:
6
+
7
+ - **Test sets:** the [Open Universal Arabic ASR Leaderboard](https://github.com/Natural-Language-Processing-Elm/open_universal_arabic_asr_leaderboard) manifests, at commit `8fce8595b49057c98bafc2ba41b69c331cb5176e`.
8
+ - **Development sets:** `ahmedsamirtarjama/youtube_najdi` and `HuggingPanda/Saudi_Podcasts_ASR`, at pinned revisions, matched by row index.
9
+
10
+ | Path | Contents |
11
+ |---|---|
12
+ | `nbest/<set>.jsonl` | One row per clip: `file`, and `hyps` holding 8 hypotheses, each with `text`, `am` (summed log-prob, length penalty 0), `degenerate` and `qwen` (Qwen3-1.7B-Base log-prob, nats). Test sets plus the two development sets. |
13
+ | `base/base_<set>.jsonl` | Greedy output of the pretrained base model (`pred_text`), with `audio_filepath`, `duration` and the manifest `id`. |
14
+ | `audar/audar_<set>.jsonl` | Audar-ASR-V1-Turbo output in our pipeline, with its model-card settings. |
15
+ | `audar/audarfix_<set>.jsonl` | The same, after re-decoding degenerate outputs (system-specific repair). |
16
+
17
+ Audar-ASR-V1-Turbo outputs were produced under the AudarAI Community License v1.0 for research benchmarking. They are published as evaluation results and imply no endorsement by AudarAI. Test-set audio is not redistributed; rebuild it from the public mirrors (see the paper, Section 3).
paper_artifacts/audar/audar_casablanca_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audar_commonvoice_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audar_masc_test_clean.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audar_masc_test_noisy.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audar_mgb2_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audar_sada_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audarfix_casablanca_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audarfix_commonvoice_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audarfix_masc_test_clean.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audarfix_masc_test_noisy.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audarfix_mgb2_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/audar/audarfix_sada_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/base/base_casablanca_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/base/base_cv_commonvoice_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/base/base_masc_test_clean.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/base/base_masc_test_noisy.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/base/base_mgb2_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/base/base_sada_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/nbest/casablanca_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/nbest/commonvoice_test.jsonl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:142ce85260b95affa70c0e2b4876a9450d91184b0883a2c24b426b318e052ff6
3
+ size 12811945
paper_artifacts/nbest/dev_saudi_podcasts.jsonl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {"file": "saudi_podcasts_000084.wav", "hyps": [{"text": "ما ادري لكن في تلك اللحظه يعني حسن طويري الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لانه يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم", "am": -7.562635898590088, "degenerate": false, "qwen": -545.8482666015625}, {"text": "ما ادري لكن في تلك اللحظه يعني حسن طويرقي الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لانه يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم", "am": -7.793780326843262, "degenerate": false, "qwen": -554.79638671875}, {"text": "ما ادري لكن في تلك اللحظه يعني حسن طويري الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لانه يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم صحيح", "am": -8.130192756652832, "degenerate": false, "qwen": -551.9638671875}, {"text": "ما ادري لكن في تلك اللحظه يعني حسن طويرقي الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لانه يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم صحيح", "am": -8.360993385314941, "degenerate": false, "qwen": -561.0250854492188}, {"text": "ما ادري لكن في تلك اللحظه يعني حسن طويري الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لان يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم", "am": -8.563798904418945, "degenerate": false, "qwen": -548.62109375}, {"text": "ما ادري لكن في تلك اللحظه يعني حسن طويرقي الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لان يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم", "am": -8.737364768981934, "degenerate": false, "qwen": -557.5285034179688}, {"text": "ما ادري لكن في تلك اللحظه يعني حسن طويري الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لان يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم صحيح", "am": -8.98222827911377, "degenerate": false, "qwen": -554.4840087890625}, {"text": "ما ادري لكن في تلك اللحظه يعني حسن طويرقي الله يعطيك العافيه ولا الله يسامحك؟ لا الله يعطيه العافيه الله يعطيه العافيه هذه ترى لحظات عجيبه لان يعني فعلا وكل واحد عنده قصه في هذه المرحله اللي يقول كنت قاعد وجاء ابوي قال يلا مشينا نسجل ولا جاء اخوي قال يلا ولا جاء فلان قال وهذه البعض يشوفها مشكله اصلا في النظام التعليمي انه يعني انت في ذاك المرحله ما تدري وش تبغى وما تدري وش نعم صحيح", "am": -9.161344528198242, "degenerate": false, "qwen": -563.6232299804688}]}
2
+ {"file": "saudi_podcasts_000083.wav", "hyps": [{"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولا واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر وهذا 20 سنه بعدها رياضيات. طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا.", "am": -6.1986308097839355, "degenerate": false, "qwen": -484.0925598144531}, {"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولا واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر وهذا 20 سنه بعدها رياضيات طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا.", "am": -6.53135871887207, "degenerate": false, "qwen": -488.34759521484375}, {"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولا واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر وهذا 20 سنه بعدها رياضيات طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا", "am": -6.6481122970581055, "degenerate": false, "qwen": -489.72808837890625}, {"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولى واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر وهذا 20 سنه بعدها رياضيات. طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا.", "am": -6.746990203857422, "degenerate": false, "qwen": -487.637939453125}, {"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولى واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر وهذا 20 سنه بعدها رياضيات طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا.", "am": -7.061420440673828, "degenerate": false, "qwen": -492.4940185546875}, {"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولا واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر وهذا 20 سنه بعدها رياضيات. طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا", "am": -7.065371513366699, "degenerate": false, "qwen": -485.50408935546875}, {"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولا واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر، وهذا 20 سنه بعدها رياضيات. طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا.", "am": -7.205840587615967, "degenerate": false, "qwen": -488.0591735839844}, {"text": "قلت له هذا رايك؟ قال انت والله يا ولدي ما تعرف مصلحتك، انا اعرف مصلحتك. هذا الحوار دقيقه تخيل حوار ما يتجاوز الدقيقه. سحبت بطاقه ثانيه وسجلت رياضيات اولى واحياء ثانيه ودرست اربع سنوات بامر حسن الطيرقي. يا ساتر وهذا 20 سنه بعدها رياضيات طبعا انا احب الرياضيات لكني احب الاحياء اكثر منها. الى الان؟ والله شوف الان لا", "am": -7.302462577819824, "degenerate": false, "qwen": -493.82843017578125}]}
3
+ {"file": "saudi_podcasts_000115.wav", "hyps": [{"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو هل تحس ان طريقه الكتابه والتدوين لها دور يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي انت لا طابعها في ورقه وش الفرق بين والله لا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذا الان الملزمه هي خطه", "am": -8.428437232971191, "degenerate": false, "qwen": -532.2603759765625}, {"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو هل تحس ان طريقه الكتابه والتدوين لها دور؟ يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي انت لا طابعها في ورقه وش الفرق بين والله لا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذا الان الملزمه هي خطه", "am": -9.145489692687988, "degenerate": false, "qwen": -537.3446044921875}, {"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو هل تحس ان طريقه الكتابه والتدوين لها دور يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي انت لا طابعها في ورقه وش الفرق بين والله لا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذه الان الملزمه هي خطه", "am": -9.287461280822754, "degenerate": false, "qwen": -532.5009765625}, {"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو هل تحس ان طريقه الكتابه والتدوين لها دور؟ يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي انت لا طابعها في ورقه وش الفرق بين والله لا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذه الان الملزمه هي خطه", "am": -9.873492240905762, "degenerate": false, "qwen": -537.3364868164062}, {"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو هل تحس ان طريقه الكتابه والتدوين لها دور يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي انت لا طابعها في ورقه وش الفرق بين والله لا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذا الان ملزمه هي خطه", "am": -9.965812683105469, "degenerate": false, "qwen": -530.7452392578125}, {"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو هل تحس ان طريقه الكتابه والتدوين لها دور؟ يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي انت لا طابعها في ورقه، وش الفرق بين والله ��ا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذا الان الملزمه هي خطه", "am": -10.107102394104004, "degenerate": false, "qwen": -544.2124633789062}, {"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو، هل تحس ان طريقه الكتابه والتدوين لها دور؟ يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي، انت لا طابعها في ورقه، وش الفرق بين والله لا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذا الان الملزمه هي خطه", "am": -10.529064178466797, "degenerate": false, "qwen": -548.9486694335938}, {"text": "ف كل شيء مسجل علشان علشان تمشي المساله بطريقه بطريقه مخططه حلو هل تحس ان طريقه الكتابه والتدوين لها دور يعني انا بالنسبه لي اتخيل اني بطلع ابلكيشن ولا شيء وبحطها بجوالي انت لا طابعها في ورقه وش الفرق بين والله لا انا ما اقول لك ما في فرق بس انا رجل تقليدي لا زلت الى الان رجل تقليدي واحتفظ بهذه الاشياء هذا الان الملزمه هي خطة", "am": -10.82451057434082, "degenerate": false, "qwen": -533.245849609375}]}
4
+ {"file": "saudi_podcasts_000122.wav", "hyps": [{"text": "ويقودك في هذه العمليه عن طريق اسئله. وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب ابغى كذا وكل واحد عنده تصور داخلي عن هذا ال", "am": -6.3338942527771, "degenerate": false, "qwen": -522.1796875}, {"text": "يقودك في هذه العمليه عن طريق اسئله. وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب ابغى كذا وكل واحد عنده تصور داخلي عن هذا ال", "am": -6.359781265258789, "degenerate": false, "qwen": -520.6834106445312}, {"text": "ويقودك في هذه العمليه عن طريق اسئله. وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب وابغى كذا وكل واحد عنده تصور داخلي عن هذا ال", "am": -6.706113338470459, "degenerate": false, "qwen": -525.6243286132812}, {"text": "يقودك في هذه العمليه عن طريق اسئله. وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب وابغى كذا وكل واحد عنده تصور داخلي عن هذا ال", "am": -6.720580101013184, "degenerate": false, "qwen": -525.048583984375}, {"text": "يقودك في هذه العمليه عن طريق اسئله. وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام. الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب ابغى كذا وكل واحد عنده تصو�� داخلي عن هذا ال", "am": -7.029944896697998, "degenerate": false, "qwen": -522.376953125}, {"text": "ويقودك في هذه العمليه عن طريق اسئله. وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام. الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب ابغى كذا وكل واحد عنده تصور داخلي عن هذا ال", "am": -7.135889053344727, "degenerate": false, "qwen": -523.1636962890625}, {"text": "يقودك في هذه العمليه عن طريق اسئله وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب ابغى كذا وكل واحد عنده تصور داخلي عن هذا ال", "am": -7.2520952224731445, "degenerate": false, "qwen": -517.1553344726562}, {"text": "يقودك في هذه العمليه عن طريق اسئله. وهي هدفها انك تسوي خطه لحياتك بطريقه ما وانك تفهم وضعك الحالي. ففي البدايه يسالك يقول لك يلا بسم الله تخيل جنه جنه الحياه وجحيم الحياه حياتك في افضل حاله اللي اكثر شيء تتمناه. صف هذه الحياه. يا سلام. الجنه بالنسبه لك في الحياه ما هي؟ فتقعد انت تحلم وتكتب وتكتب وتكتب وابغى كذا وكل واحد عنده تصور داخلي عن هذا ال", "am": -7.392237663269043, "degenerate": false, "qwen": -526.220703125}]}
5
+ {"file": "saudi_podcasts_000190.wav", "hyps": [{"text": "في قضايا ثانيه امم يعني انا اودعته السجن العام او بفروعه او اي منطقه امم لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجرائه امم لكن وش صار؟ نسمع مثل الناس في بيان ولا انه انسجن لا لا بس خوينا فلت يعني منك ربما جابوه اه وان شاء الله انه جابوه اوكي لكن كان اجتهاد وانا مجتهد والله فكنت تبغاه يجي لدوله خليجيه او", "am": -10.77086067199707, "degenerate": false, "qwen": -607.7161865234375}, {"text": "قضايا ثانيه امم يعني انا اودعته السجن العام او بفروعه او اي منطقه امم لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجرائه امم لكن وش صار؟ نسمع مثل الناس في بيان ولا ان انسجن لا لا بس خوينا فلت يعني منك ربما جابوه اه وان شاء الله انه جابوه اوكي لكن كان اجتهاد وانا مجتهد والله فكنت تبغاه يجي لدوله خليجيه او", "am": -10.815436363220215, "degenerate": false, "qwen": -608.4835205078125}, {"text": "في قضايا ثانيه امم يعني انا اودعته السجن العام او بفروعه او اي منطقه امم لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجرائه امم لكن وش صار؟ نسمع مثل الناس في بيان ولا ان انسجن لا لا بس خوينا فلت يعني منك ربما جابوه اه وان شاء الله انه جابوه اوكي لكن كان اجتهاد وانا مجتهد والله فكنت تبغاه يجي لدوله خليجيه او", "am": -10.862565040588379, "degenerate": false, "qwen": -608.4080810546875}, {"text": "في قضايا ثانيه. امم. يعني انا اودعته السجن العام. او بفروعه او اي منطقه. امم. لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجرائه. امم. لكن وش صار؟ نسمع مثل الناس في بيان ولا انه انسجن. لا لا بس خوينا فلت يعني منك. ربما جابوه. اه. وان شاء الله انه جابوه. اوكي. لكن كان اجتهاد وانا مجتهد والله. فكنت تبغاه يجي لدوله خليجيه او.", "am": -11.520906448364258, "degenerate": false, "qwen": -635.0045776367188}, {"text": "في قضايا ثانيه. امم. يعني انا اودعته السجن العام. او بفروعه او اي منطقه. امم. لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجرائه. امم. لكن وش صار؟ نسمع مثل الناس في بيان ولا ان انسجن. لا لا بس خوينا فلت يعني منك. ربما جابوه. اه. وان شاء الله انه جابوه. اوكي. لكن كان اجتهاد وانا مجتهد والله. فكنت تبغاه يجي لدوله خليجيه او.", "am": -11.857931137084961, "degenerate": false, "qwen": -635.8552856445312}, {"text": "في قضايا ثانيه. امم. يعني انا اودعته السجن العام. او بفروعه او اي منطقه. امم. لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجراءه. امم. لكن وش صار؟ نسمع مثل الناس في بيان ولا انه انسجن. لا لا بس خوينا فلت يعني منك. ربما جابوه. اه. وان شاء الله انه جابوه. اوكي. لكن كان اجتهاد وانا مجتهد والله. فكنت تبغاه يجي لدوله خليجيه او.", "am": -12.050345420837402, "degenerate": false, "qwen": -637.646484375}, {"text": "قضايا ثانيه. امم. يعني انا اودعته السجن العام. او بفروعه او اي منطقه. امم. لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجرائه. امم. لكن وش صار؟ نسمع مثل الناس في بيان ولا انه انسجن. لا لا بس خوينا فلت يعني منك. ربما جابوه. اه. وان شاء الله انه جابوه. اوكي. لكن كان اجتهاد وانا مجتهد والله. فكنت تبغاه يجي لدوله خليجيه او.", "am": -12.101439476013184, "degenerate": false, "qwen": -632.0194091796875}, {"text": "في قضايا ثانيه. امم. يعني انا اودعته السجن العام. او بفروعه او اي منطقه. امم. لا يعني اني ادري اتابع والله صار عليك كذا كذا الا اذا جت اوراق معينه لاجرائه. امم. لكن وش صار؟ نسمع مثل الناس في بيان ولا انه انسجن. لا لا بس خوينا فلت يعني منك. ربما جابوه. اه. وان شاء الله انه جابوه. اوكي. لكن كان اجتهاد وانا مجتهد والله. فكنت تبغاه يجي لدوله خليجيه او", "am": -12.129947662353516, "degenerate": false, "qwen": -634.7819213867188}]}
6
+ {"file": "saudi_podcasts_000158.wav", "hyps": [{"text": "قلت انا بعده يعني سيراوي هذه مقصوده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا واني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسلمك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوري", "am": -22.572017669677734, "degenerate": false, "qwen": -637.033203125}, {"text": "قلت انا بعده يعني سيراوي هذه مقصوده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا اني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسلمك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوري", "am": -22.601778030395508, "degenerate": false, "qwen": -631.906982421875}, {"text": "قلت انا بعده يعني سيراوي هذه مقصوده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا واني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسعدك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوري", "am": -22.602930068969727, "degenerate": false, "qwen": -636.2677612304688}, {"text": "قلت انا بعده يعني سيراوي هذه مقص��ده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا واني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسلمك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوله", "am": -22.6613826751709, "degenerate": false, "qwen": -638.3243408203125}, {"text": "قلت انا بعده يعني سيراوي هذه مقصوده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا اني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسلمك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوله", "am": -22.684770584106445, "degenerate": false, "qwen": -633.053955078125}, {"text": "قلت انا بعده يعني سيراوي هذه مقصوده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا اني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسعدك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوري", "am": -22.73431968688965, "degenerate": false, "qwen": -631.1064453125}, {"text": "قلت انا بعده يعني سيراوي هذه مقصوده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا واني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسعدك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوله", "am": -22.775423049926758, "degenerate": false, "qwen": -637.6968383789062}, {"text": "قلت انا بعده يعني سيراوي هذه مقصوده لا لا بس والله الناس يعني يعني ودها تسمع هالقصص يعني في بعضها ممكن يستفيدون من اشياء وفي قصص حلوه يعني الناس تستمتع فيها ودنا اني اكرمتنا والله بجيتك يعني لا والله صح انك خليتني لاحق اشهر لاحقني اشهر وانا كل ما اتصلت بغصني بطل اتهرب ولكن ما في اليد حيله انت من الحلوين الله يسعدك اسلم اسلم طال عمرك سلمت الحين ليش ينقولون نقلوكم من الدوري", "am": -23.353515625, "degenerate": false, "qwen": -642.111083984375}]}
7
+ {"file": "saudi_podcasts_000145.wav", "hyps": [{"text": "نهاب العم الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه وكنا نهابه الله يجعله جنات النعيم فبالتالي دريت انا جاي عارف انا من عيونه انه زعلان ومعاه الورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درتني", "am": -6.515056610107422, "degenerate": false, "qwen": -526.3125}, {"text": "نهاب العم الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه و وكنا نهابه الله يجعله جنات النعيم فبالتالي دريت انا جاي عارف انا من عيونه انه زعلان ومعاه الورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درتني", "am": -7.458856582641602, "degenerate": false, "qwen": -534.8795166015625}, {"text": "نهاب العمه الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه وكنا نهابه الله يجعله جنات النعيم فبالتالي دريت انا جاي عارف انا من عيونه انه زعلان ومعاه الورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درتني", "am": -7.579031467437744, "degenerate": false, "qwen": -524.6716918945312}, {"text": "نهاب العم الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه وكنا نهابه الله يجعله جنات النعيم فبالتالي دريت انا جاي عارف انا من عيونه انه زعلان ومعاه هالورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درتني", "am": -7.615162372589111, "degenerate": false, "qwen": -534.692138671875}, {"text": "نهاب العم الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه ووكنا نهابه الله يجعله جنات النعيم فبالتالي دريت انا جاي عارف انا من عيونه انه زعلان ومعاه الورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درتني", "am": -7.864632606506348, "degenerate": false, "qwen": -533.9091796875}, {"text": "نهاب العم الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه وكنا نهابه الله يجعله جنات النعيم فبالتالي دريت انا جاي اعرف انا من عيونه انه زعلان ومعاه الورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درتني", "am": -7.8901448249816895, "degenerate": false, "qwen": -525.3516845703125}, {"text": "نهاب العم الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه وكنا نهابه. الله يجعله جنات النعيم فبالتالي دريت انا جاي عارف انا من عيونه انه زعلان ومعاه الورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درتني", "am": -8.358694076538086, "degenerate": false, "qwen": -534.9298095703125}, {"text": "نهاب العم الله يرحمه الوالد متوفي وانا عمري سنتين فهو اللي متوليها حقيقه ما يقصر علينا في في التربيه وكنا نهابه الله يجعله جنات النعيم فبالتالي دريت انا جاي عارف انا من عيونه انه زعلان ومعاه الورقه انا انحشت الصحيح دريت ان الدعوه قال خلاص ما عليك بما معناه المهم رجعت للوالده الله يرحمها يوم درت اني", "am": -8.605613708496094, "degenerate": false, "qwen": -526.683837890625}]}
8
+ {"file": "saudi_podcasts_000147.wav", "hyps": [{"text": "الساعة 6:00 وخط جميل قضيت معهم 4 شهور يوم لمحت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت بتاخذ الرابعة وبعدها ننقصك الخامسة السادسة الامور سهلات لاني اجي مع الحارس انا اللي افتح الباب احيانا ما يجون الساعة 8:00 الا البيانات مسجلة وبخط جميل ما كان فيه طوابع ولا كان فيه ايميلات ولا كنت اهتم بال", "am": -9.742133140563965, "degenerate": false, "qwen": -531.2444458007812}, {"text": "الساعة 6 وخط جميل قضيت معهم 4 شهور يوم لمحت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت بتاخذ الرابعة وبعدها ننقصك الخامسة السادسة الامور سهلات لاني اجي مع الحارس انا اللي افتح الباب احيانا ما يجون الساعة 8 الا البيانات مسجلة وبخط جميل ما كان فيه طوابع ولا كان فيه ايميلات ولا كنت اهتم بال", "am": -9.904139518737793, "degenerate": false, "qwen": -528.6151123046875}, {"text": "الساعة 6:00 وخط جميل قضيت معهم اربع شهور يوم ��محت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت بتاخذ الرابعة وبعدها ننقصك الخامسة السادسة الامور سهلات لاني اجي مع الحارس انا اللي افتح الباب احيانا ما يجون الساعة 8:00 الا البيانات مسجلة وبخط جميل ما كان فيه طوابع ولا كان فيه ايميلات ولا كنت اهتم بال", "am": -9.9251127243042, "degenerate": false, "qwen": -532.3846435546875}, {"text": "الساعة 6:00 وخط جميل قضيت معهم 4 شهور يوم لمحت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت تبي تاخذ الرابعة وبعدها ننقصك الخامسة السادسة الامور سهلات لاني اجي مع الحارس انا اللي افتح الباب احيانا ما يجون الساعة 8:00 الا البيانات مسجلة وبخط جميل ما كان فيه طوابع ولا كان فيه ايميلات ولا كنت اهتم بال", "am": -9.986197471618652, "degenerate": false, "qwen": -538.1484375}, {"text": "الساعة 6 وخط جميل قضيت معهم 4 شهور يوم لمحت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت تبي تاخذ الرابعة وبعدها ننقصك الخامسة السادسة الامور سهلات لاني اجي مع الحارس انا اللي افتح الباب احيانا ما يجون الساعة 8 الا البيانات مسجلة وبخط جميل ما كان فيه طوابع ولا كان فيه ايميلات ولا كنت اهتم بال", "am": -10.031846046447754, "degenerate": false, "qwen": -534.640625}, {"text": "الساعة 6:00 وخط جميل قضيت معهم اربع شهور يوم لمحت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت بتاخذ الرابعه وبعدها ننقصك الخامسه السادسه الامور سهلات لاني اجي مع الحارس انا اللي افتح الباب احيانا ما يجون الساعه 8:00 الا البيانات مسجله وبخط جميل ما كان فيه طوابع ولا كان فيه ايميلات ولا كنت اهتم بال", "am": -10.179725646972656, "degenerate": false, "qwen": -539.231689453125}, {"text": "الساعة 6:00 وخط جميل قضيت معهم اربع شهور يوم لمحت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت بتاخذ الرابعة وبعدها ننقصك الخامسة السادسة الامور سهلات لاني اجي مع مع الحارس انا اللي افتح الباب احيانا ما يجون الساعة 8:00 الا البيانات مسجلة وبخط جميل ما كان فيه طوابع ولا كان فيه ايميلات ولا كنت اهتم بال", "am": -10.198593139648438, "degenerate": false, "qwen": -541.1083984375}, {"text": "الساعة 6:00 وخط جميل قضيت معهم 4 شهور يوم لمحت لهم اني بمشي خلاص تعاقد انتهى قالوا لا احنا نبيك تستمر موظف رسمي انت بتاخذ الرابعة وبعدها ننقصك الخامسة السادسة الامور سهلات لاني اجي مع الحارس انا اللي افتح الباب احيانا ما يجون الساعة 8:00 الا البيانات مسجلة وبخط جميل ما كان فيه طوابع ولا كان في ايميلات ولا كنت اهتم بال", "am": -10.348669052124023, "degenerate": false, "qwen": -535.22802734375}]}
paper_artifacts/nbest/dev_youtube_najdi.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/nbest/masc_test_clean.jsonl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c023e121c0ef221ae95c5b313e514d99a8da2a2cb2108154754822415f5f7768
3
+ size 12066464
paper_artifacts/nbest/masc_test_noisy.jsonl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2f0585dd4df4d52c37a796113821611785a29214ac31a7cc24257bf8c187d26a
3
+ size 12302719
paper_artifacts/nbest/mgb2_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
paper_artifacts/nbest/sada_test.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
sygma_asr.py CHANGED
@@ -25,6 +25,7 @@ import soundfile as sf
25
  import torch
26
 
27
  BASE_MODEL = "CohereLabs/cohere-transcribe-arabic-07-2026"
 
28
  SR = 16000
29
  BETA = 1.0
30
  BEAMS = 8
@@ -59,10 +60,49 @@ def is_degenerate(text):
59
 
60
 
61
  def _words(text):
 
62
  t = re.sub(r"[!\"#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~،؛؟]", " ", text)
63
  return len(t.split())
64
 
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  def _load_cohere(device):
67
  """Load the Cohere processor + model the way its repo code expects (transformers 4.x)."""
68
  import sys
@@ -70,7 +110,7 @@ def _load_cohere(device):
70
  import transformers
71
  from huggingface_hub import snapshot_download
72
 
73
- local = snapshot_download(BASE_MODEL) # weights, tokenizer and mel-filterbank buffers (Cohere, unchanged)
74
  sys.path.insert(0, str(Path(__file__).resolve().parent))
75
  # cohere_asr/ = Cohere's Apache-2.0 model code, vendored; one change: GenerationMixin added (see NOTICE)
76
  from cohere_asr.modeling_cohere_asr import CohereAsrForConditionalGeneration
@@ -93,10 +133,17 @@ def _load_cohere(device):
93
 
94
 
95
  class SygmaASR:
96
- def __init__(self, device=None, beta=BETA, beams=BEAMS, punctuation=True, repair=False):
 
 
 
 
 
 
 
97
  self.device = device or ("cuda" if torch.cuda.is_available() else "cpu")
98
  self.processor, self.model = _load_cohere(self.device)
99
- self.beta, self.beams, self.repair = beta, beams, repair
100
  self.prompt = self.model.build_prompt(language="ar", punctuation=punctuation)
101
  self.amp = self.device.startswith("cuda")
102
 
@@ -120,9 +167,9 @@ class SygmaASR:
120
  results = []
121
  for i in range(len(batch)):
122
  hyps = list(zip(texts[i * self.beams:(i + 1) * self.beams], scores[i * self.beams:(i + 1) * self.beams]))
123
- good = [h for h in hyps if not is_degenerate(h[0])]
124
- if good:
125
- results.append(max(good, key=lambda h: h[1] + self.beta * _words(h[0]))[0])
126
  continue
127
  fixed = None
128
  for fb in (FALLBACKS if self.repair else []):
 
25
  import torch
26
 
27
  BASE_MODEL = "CohereLabs/cohere-transcribe-arabic-07-2026"
28
+ BASE_REVISION = "c3e911b42149bf7a1e53d5cef9878aee87515a23" # the base-model revision used for all paper results
29
  SR = 16000
30
  BETA = 1.0
31
  BEAMS = 8
 
60
 
61
 
62
  def _words(text):
63
+ """Deployment-mode word count: punctuation replaced by spaces on the raw text."""
64
  t = re.sub(r"[!\"#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~،؛؟]", " ", text)
65
  return len(t.split())
66
 
67
 
68
+ def normalize_arabic_text(text):
69
+ """The Open Universal Arabic ASR Leaderboard's eval.py normalization (verbatim)."""
70
+ text = re.sub(r'[!"#$%&\'()*+,\-./:;<=>?@\[\\\]^_`{|}~،؛؟]', '', text)
71
+ text = re.sub(r'[ً-ْ]', '', text)
72
+ text = re.sub('پ', 'ب', text)
73
+ text = re.sub('ڤ', 'ف', text)
74
+ text = re.sub(r'[آ]', 'ا', text)
75
+ text = re.sub(r'[أإ]', 'ا', text)
76
+ text = re.sub(r'[ؤ]', 'و', text)
77
+ text = re.sub(r'[ئ]', 'ي', text)
78
+ text = re.sub(r'[ء]', '', text)
79
+ for e, w in zip('٠١٢٣٤٥٦٧٨٩', '0123456789'):
80
+ text = text.replace(e, w)
81
+ text = re.sub(r'(^|\s)و\s+', r'\1و', text)
82
+ return re.sub(r'\s+', ' ', text).strip()
83
+
84
+
85
+ def select_hypothesis(hyps, beta=BETA, mode="benchmark", use_filter=True):
86
+ """Pick one hypothesis from an N-best list of (text, summed log-prob) pairs.
87
+
88
+ mode="benchmark" reproduces the paper exactly: words are counted after the leaderboard
89
+ normalization, and if every hypothesis is degenerate all of them are re-ranked.
90
+ mode="deployment" counts words on punctuation-stripped raw text and returns None when every
91
+ hypothesis is degenerate (the caller then repairs or keeps the top beam hypothesis).
92
+ use_filter=False disables the breakdown filter (the paper's reward-only configuration).
93
+
94
+ select_hypothesis(hyps, 1.0, "benchmark", use_filter=False) # reward only (primary result)
95
+ select_hypothesis(hyps, 1.0, "benchmark", use_filter=True) # Sygma (reward + filter)
96
+ select_hypothesis(hyps, 0.0, "benchmark", use_filter=False) # Beam-8 top
97
+ """
98
+ good = [h for h in hyps if not (use_filter and is_degenerate(h[0]))]
99
+ if mode == "benchmark":
100
+ return max(good or hyps, key=lambda h: h[1] + beta * len(normalize_arabic_text(h[0]).split()))[0]
101
+ if mode == "deployment":
102
+ return max(good, key=lambda h: h[1] + beta * _words(h[0]))[0] if good else None
103
+ raise ValueError(f"unknown mode {mode!r}")
104
+
105
+
106
  def _load_cohere(device):
107
  """Load the Cohere processor + model the way its repo code expects (transformers 4.x)."""
108
  import sys
 
110
  import transformers
111
  from huggingface_hub import snapshot_download
112
 
113
+ local = snapshot_download(BASE_MODEL, revision=BASE_REVISION) # weights, tokenizer, mel buffers (Cohere, unchanged)
114
  sys.path.insert(0, str(Path(__file__).resolve().parent))
115
  # cohere_asr/ = Cohere's Apache-2.0 model code, vendored; one change: GenerationMixin added (see NOTICE)
116
  from cohere_asr.modeling_cohere_asr import CohereAsrForConditionalGeneration
 
133
 
134
 
135
  class SygmaASR:
136
+ def __init__(self, device=None, beta=BETA, beams=BEAMS, punctuation=True, repair=False, mode="benchmark",
137
+ use_filter=True):
138
+ """mode="benchmark" (default) is the configuration evaluated in the paper; mode="deployment"
139
+ is the earlier released behaviour and is required for repair=True."""
140
+ if mode not in ("benchmark", "deployment"):
141
+ raise ValueError(f"unknown mode {mode!r}")
142
+ if repair and mode != "deployment":
143
+ raise ValueError("repair=True is only available with mode='deployment'")
144
  self.device = device or ("cuda" if torch.cuda.is_available() else "cpu")
145
  self.processor, self.model = _load_cohere(self.device)
146
+ self.beta, self.beams, self.repair, self.mode, self.use_filter = beta, beams, repair, mode, use_filter
147
  self.prompt = self.model.build_prompt(language="ar", punctuation=punctuation)
148
  self.amp = self.device.startswith("cuda")
149
 
 
167
  results = []
168
  for i in range(len(batch)):
169
  hyps = list(zip(texts[i * self.beams:(i + 1) * self.beams], scores[i * self.beams:(i + 1) * self.beams]))
170
+ pick = select_hypothesis(hyps, self.beta, self.mode, self.use_filter)
171
+ if pick is not None:
172
+ results.append(pick)
173
  continue
174
  fixed = None
175
  for fb in (FALLBACKS if self.repair else []):