#!/usr/bin/env python3 """LES AUTRES LANGUES DE WAXAL : 16 langues etiquetees jamais utilisees. On n'a exploite que lin, sna, lug -- or le corpus en contient 19. Les 13 autres splits train pesent 78,7 Go. Pourquoi c'est meilleur que FLEURS pour notre probleme : memes conditions d'enregistrement, meme domaine (description d'images), meme convention d'annotation, et surtout des LOCUTEURS ENTIEREMENT NOUVEAUX -- exactement ce qui manque, puisque nos echecs viennent tous du sur-apprentissage locuteur. FLEURS apporte des locuteurs neufs mais de la parole LUE, domaine different. Preuve directe que le multilingue transfere : joint_cont (multilingue) BAT le monolingue lin_s4 de 0.0072 au leaderboard. C'est le seul ajout de donnees qui ait jamais gagne sur ce projet. On l'a fait avec 3 langues ; il y en a 19. 100 % donnee du concours => aucune declaration de conformite requise. Premier lot : bantou et voisines, celles dont la phonotactique transfere le mieux vers lin/sna. Le bloc ethiopien (amh, orm, sid, tir, wal, 52 Go) reste en reserve. """ import glob, os, sys os.environ.setdefault("HF_HUB_DISABLE_XET", "1") os.environ.setdefault("HF_HOME", "/scratch/hf_home") from huggingface_hub import snapshot_download LANGS = os.environ.get("LANGS", "nyn,ach,sog,mas,aka,ewe").split(",") dest = "/scratch/data/waxal" tok = open(os.path.expanduser("~/.cache/huggingface/token")).read().strip() pats = ["data/ASR/%s/%s-train-*.parquet" % (l, l) for l in LANGS] print("telechargement : %s" % ", ".join(LANGS), flush=True) snapshot_download(repo_id="google/WaxalNLP", repo_type="dataset", allow_patterns=pats, local_dir=dest, max_workers=16, token=tok) fs = [] for l in LANGS: fs += glob.glob("%s/data/ASR/%s/%s-train-*.parquet" % (dest, l, l)) print("DL_OK : %d parquets, %.1f Go" % (len(fs), sum(os.path.getsize(f) for f in fs) / 1e9), flush=True) sys.path.insert(0, "/root") import prep_data prep_data.JOBS = [("waxal_%s_train" % l, "%s/data/ASR/%s/%s-train-*.parquet" % (dest, l, l), "transcription") for l in LANGS] prep_data.main() import json M = "/scratch/prep/manifests/" tot_clips = tot_h = 0 allrows = [] for l in LANGS: p = M + "waxal_%s_train.jsonl" % l if not os.path.exists(p): print(" %-5s MANIFESTE ABSENT" % l, flush=True); continue rows = [json.loads(x) for x in open(p, encoding="utf-8")] ok = [r for r in rows if os.path.exists(r["audio"])] h = sum(r["duration"] for r in ok) / 3600 spk = len(set(r.get("speaker") for r in ok)) print(" %-5s %6d clips | %6.1f h | %4d locuteurs" % (l, len(ok), h, spk), flush=True) tot_clips += len(ok); tot_h += h allrows += ok with open(M + "waxal_multi_train.jsonl", "w", encoding="utf-8") as f: for r in allrows: f.write(json.dumps(r, ensure_ascii=False) + "\n") print("TOTAL NOUVEAU : %d clips / %.1f h -> %swaxal_multi_train.jsonl" % (tot_clips, tot_h, M), flush=True) print("MULTI_DONE", flush=True)