sayitinsaami.yle.fi scraper
For a DT2112 project
JSON = "http://sayitinsaami.yle.fi/js/fraasit.js?2019-02-15"
import requests
rawdata = requests.get(JSON)
to_clean = rawdata.text
to_clean = to_clean.replace(" f:", ' "f":').replace(" fi:", ' "fi":').replace(" sv:", ' "sv":').replace(" en:", ' "en":').replace(" sme:", ' "sme":').replace(" smn:", ' "smn":').replace(" sms:", ' "sms":').replace(" cats:", ' "cats":')
if to_clean.startswith("FRAASIT = "):
to_clean = to_clean[10:]
to_clean = to_clean.strip()
if to_clean.endswith("},\n]"):
to_clean = to_clean.replace("},\n]", "}]")
import json
data = json.loads(to_clean)
with open("sayitinsaami_output.tsv", "w") as outf:
for item in data:
outf.write(f'{item["sme"]}\thttp://sanosesaameksi.katrikoivula.com/audio/sme/{item["f"]}.m4a\n')
!cat output.tsv|awk -F'\t' '{print $2}'|while read i;do f=$(echo $i|awk -F/ '{print $NF}'); if [ ! -e $f ];then wget -c $i;fi;done
with open("sayitinsaami.json", "w") as cleaned:
json.dump(data, cleaned)
!ls *.m4a|zip sayitinsaami_audio.zip -@
!for f in *.m4a;do ffmpeg -i $f -acodec pcm_s16le -ac 1 -ar 16000 $(basename $f .m4a).wav;done
!ls -al *.wav
text = []
audio = []
for item in data:
text.append(item["sme"])
audio.append(f'{item["f"]}.wav')
%%capture
!pip install datasets
%%capture
!pip install torchaudio librosa
from datasets import Dataset, Audio
text = []
audio = []
with open("/home/joregan/sayitinsaami/sayitinsaami_output.tsv") as tsvf:
for line in tsvf.readlines():
parts = line.split("\t")
text.append(parts[0])
urlparts = parts[1].split("/")
audio_path = "/home/joregan/sayitinsaami/" + urlparts[-1].replace("m4a", "wav").strip()
audio.append(audio_path)
audio_ds = Dataset.from_dict({"text": text, "audio": audio}).cast_column("audio", Audio())
audio_ds[1]
%%capture
!pip install --upgrade evaluate jiwer
def clean_text(batch):
if "(duaali)" in batch["text"]:
batch["text"] = batch["text"].replace("(duaali)", "").strip()
if "..." in batch["text"]:
batch["text"] = batch["text"].replace("...", "").strip()
if batch["text"][-1] in "?!.":
batch["text"] = batch["text"][:-1]
return batch
audio_ds = audio_ds.map(clean_text)
from transformers import pipeline
import torch
MODEL = "NbAiLab/whisper-large-sme"
LANG = "fi"
pipe = pipeline(task="automatic-speech-recognition", model=MODEL, chunk_length_s=30, device=0)
pipe.model.config.forced_decoder_ids = pipe.tokenizer.get_decoder_prompt_ids(language=LANG, task="transcribe")
import evaluate
metric = evaluate.load("wer")
from transformers.pipelines.pt_utils import KeyDataset
from tqdm.auto import tqdm
preds = []
for out in tqdm(pipe(KeyDataset(audio_ds, "audio"))):
preds.append(out["text"])
from evaluate import load
wer_metric = load("wer")
wer_ortho = 100 * wer_metric.compute(
references=audio_ds["text"], predictions=preds
)
wer_ortho
def clean_for_wer(text):
if text[-1] in "?!.":
text = text[:-1]
return text.lower().strip()
preds = [clean_for_wer(x) for x in preds]
refs = [clean_for_wer(x) for x in audio_ds["text"]]
wer_ortho = 100 * wer_metric.compute(
references=refs, predictions=preds
)
wer_ortho