# Kunagise Pärtli kärina skripti põhjal # leiab voorude kaupa iga kõneleja kohta jutu kestuse # (ja kärina kestuse, et arvutada kärina %)-jääb välja? # lisaks iga kõneleja kohta: # 1) keskmine fraasi pikkus (sõnades/silpides/ms); # 2) fraaside (IP/TS/HS) hulk; # 3) f0 mediaan ja ulatus # # Anton Malmi ja Pärtel Lippus täiendasid (2022) # leiab kõik need samad asjad, aga ka lisaks: # 4) pooleli jäänud sõnade arv voorus - hesit # 5) samas voorus korratud sõnade arv (pausideta) - rep # 6) venituste arv kõnevoorus - elong # 7) pauside arv ja kestus kõnevoorus - pause # 8) üneemide arv kõnevoorus - filler # # # Skript logib iga kõneleja voorude kaupa andmed - turn tulem = Create Table with column names: "voorud_kest", 0, "file SP2_fail SP1_ID SP2_ID SP1_sugu SP2_sugu faili_kogukestus vooru_tyyp vooru_id vooru_kestus pauside_kestus artikul_kestus karin_kestus sonade_arv silpide_arv foneemide_arv poolikute_arv korduste_arv venituste_arv pauside_arv yneemide_arv f0Mean f0Min f0Med f0Max" rida = 0 clearinfo logi$ = "" aegakulus = 0 # Siin kasutatakse mõningaid https://gitlab.keeleressursid.ee/partel/plugin_PhonCorpTools sisalduvaid asju, nt foneetikakorpuse lisamärkide klassifikatsioon # klassifitseeritud lisamärgid sisaldab tääge <üneemid> lsd$ = readFile$: preferencesDirectory$ + "/plugin_PhonCorpTools/seaded/klassifitseeritud_lisamargid.txt" # võtame lisamärkide klassifikatsiooni tükkideks lisa_yneem$ = mid$(lsd$, index(lsd$, "<üneemid>"), index(lsd$, "")-index(lsd$, "<üneemid>")) lisa_tagasi$ = mid$(lsd$, index(lsd$, ""), index(lsd$, "")-index(lsd$, "")) lisa_muu$ = mid$(lsd$, index(lsd$, ""), index(lsd$, "")-index(lsd$, "")) lisa_desk$ = mid$(lsd$, index(lsd$, ""), index(lsd$, "")-index(lsd$, "")) lisa_lexFB$ = mid$(lsd$, index(lsd$, ""), index(lsd$, "")-index(lsd$, "")) #käib läbi skk0 ja skk2 (monologid & trialoogid jäävad praegu vahele) for sub_korp from 0 to 1 sub_korp = sub_korp * 2 ; see tähendab 0 ja 2, 1 jääb vahele #kaustaaeg = 0 stopwatch # siin peaks määrama kausta, kus on korpuse TG ja WAV failid # path_tg$ = "~\Desktop\Suuline keel arvudes\Textgridid\SKK" + string$(sub_korp) + "_TG\" path_tg$ = "~/ownCloud/EKSKFK/temp/v1.2/SKK" + string$(sub_korp) + "_TG/" # path_wav$ = "~\Desktop\Suuline keel arvudes\Wavid\SKK" + string$(sub_korp) + "_WAV\" path_wav$ = "~/ownCloud/EKSKFK/SKK" + string$(sub_korp) + "_WAV/" Create Strings as file list: "temp", path_tg$ + "*.TextGrid" faile = Get number of strings # teine luup käib läbi iga faili selles kaustas for f to faile #pause ---'fail$'--- selectObject: "Strings temp" tg$ = Get string: f fail$ = tg$ - ".TextGrid" #Read from file: path_tg$ + tg$ # lisame voorukihi (skriptiga, mille leiab https://gitlab.keeleressursid.ee/partel/plugin_PhonCorpTools) runScript: "SKK_lisa_konevoorud_ip_pohjal.praatscript", fail$ writeInfo: logi$ # kas ja mitmes on häälelaadi ja lausungi kiht selectObject: "TextGrid "+ fail$ kihte = Get number of tiers sonaKiht = 0 vooruKiht = 0 hKiht = 0 sylKiht = 0 hl_tasand = 0 for k to kihte k$ = Get tier name: k if k$ = "sõnad" sonaKiht = k elsif k$ = "kõnevoorud" vooruKiht = k elsif k$ = "häälikud" hKiht = k elsif k$ = "silbid" sylKiht = k elsif k$ = "häälelaad" hl_tasand = k endif endfor # otsime üles SP1 ID sp1_ID$ = mid$(fail$, 8, 5) sp1_sex$ = right$(sp1_ID$, 1) filedur = Get total duration # Kui on dialoog, otsime üles SP2 ID if sub_korp <> 1 dial$ = left$ ( fail$, 6) Create Strings as file list: "dial_temp", path_tg$ + dial$ + "*.TextGrid" for i to 2 dial$ = Get string... i if dial$ <> "'fail$'.TextGrid" teine_fail$ = dial$-".TextGrid" endif endfor selectObject: "Strings dial_temp" Remove sp2_ID$ = mid$ (teine_fail$, 8, 5) sp2_sex$ = right$(sp2_ID$, 1) endif # käime läbi voorukihi ja küsime voorude kestust, sõnade, silpide ja häälikute arvu # siin peaks ka logima siis hesit, rep, elong, pause, filler #tmp_f0 = Create Table with column names: "tpm_f0", 0, "f0" wav = Read from file: path_wav$ + fail$ + ".wav" selectObject: "TextGrid "+fail$ voorusegmente = Get number of intervals: vooruKiht for voor to voorusegmente n_sona = 0 n_syl = if sylKiht = 0 then undefined else 0 fi n_phon = if hKiht = 0 then undefined else 0 fi cr_dur = if hl_tasand = 0 then undefined else 0 fi dur_art = 0 pause_dur = 0 dur_voor = 0 x_f0 = 0 hesit = 0 eel_sona$ = "" rep = 0 elong = 0 pause = 0 filler = 0 selectObject: "TextGrid " + fail$ int$ = Get label of interval: vooruKiht, voor # Kui ei ole paus if int$ = "voor" or int$ = "ts" # vooru kestus start = Get starting point: vooruKiht, voor stop = Get end point: vooruKiht, voor dur_voor = stop - start # loeb kokku lex sõnad ja nende kestuse ja lisaks poolikud sõnad, kordused, pausid, üneemid a_sona = Get high interval at time: sonaKiht, start b_sona = Get low interval at time: sonaKiht, stop for sona from a_sona to b_sona sona_alg = Get start time of interval: sonaKiht, sona sona_ots = Get end time of interval: sonaKiht, sona sona$ = Get label of interval: sonaKiht, sona #loeb kokku sõnad ja artikulatsiooni kestuse if sona$ <> "#" and left$(sona$,1) <> "." n_sona += 1 dur_art += sona_ots - sona_alg # poolikud sõnad (on sõnade tingimuse sees) if right$(sona$,1) = "-" hesit += 1 endif # kas sõna kordub; seab peale seda võrdlus selle sõna eel_sona$-ks sona_1$ = if index(sona$, "/") = 0 then sona$ else left$(sona$, index(sona$, "/")-1) fi if sona_1$ = eel_sona$ and sona_1$ <> "" rep +=1 endif eel_sona$ = sona_1$ # venitused #kas sõnatasandil on venitus? if index(sona$, ".venit") > 0 elong += 1 #kui ei, siis käime läbi häälikud sõnas else #määrame hääliku alguse ja lõpu nr venit_alg = Get high interval at time: hKiht, sona_alg venit_lopp = Get low interval at time: hKiht, sona_ots # küsime, kas mõni häälik sõnas on venitatud repeat #küsime mis on häälik phon_1$ = Get label of interval: hKiht, venit_alg #kui häälikul on küljes ::, lisandub elongile 1 if index(phon_1$, "::") > 0 elong += 1 endif #see käib kõik häälikud läbi või nii kaua kui vähemalt ühel häälikul on :: venit_alg += 1 until venit_alg > venit_lopp or index(phon_1$, "::") > 0 endif # nüüd on sõnadest kõik olemas, vaatame pause #pausid ja selle kestus; praegu loeb ainult # e vaiksed pausid elsif sona$ = "#" pause += 1 pause_dur += sona_ots - sona_alg #üneemid elsif left$(sona$, 1) = "." if index(lisa_yneem$, """" + sona$ + """") > 0 sona$ = "#YN" filler += 1 endif endif endfor #siin peaks olema sõnatasandi tsükli lõpp, edasi kõnevooru piires silbid kokku # kui silbikiht on olemas, loeme kokku silbid vooru piires if sylKiht > 0 a_syl = Get high interval at time: sylKiht, start b_syl = Get low interval at time: sylKiht, stop for syl from a_syl to b_syl syl$ = Get label of interval: sylKiht, syl if syl$ <> "" n_syl += 1 endif endfor endif # kui häälikukiht on olemas, loeme häälikud kokku if hKiht > 0 a_phon = Get high interval at time: hKiht, start b_phon = Get low interval at time: hKiht, stop for phon from a_phon to b_phon phon$ = Get label of interval: hKiht, phon if phon$ <> "" n_phon += 1 endif endfor endif # kui häälelaadi kiht on olemas, loeme kärina kestuse if hl_tasand > 0 a_hl = Get high interval at time: hl_tasand, start b_hl = Get low interval at time: hl_tasand, stop for hl from a_hl to b_hl hl$ = Get label of interval: hl_tasand, hl if hl$ = "kärin" hl_start = Get start time of interval: hl_tasand, hl hl_stop = Get end time of interval: hl_tasand, hl cr_dur += hl_stop - hl_start endif endfor endif #kirjutame tulemused faili selectObject: tulem rida += 1 Append row Set string value: rida, "file", fail$ Set string value: rida, "SP1_ID", sp1_ID$ Set string value: rida, "SP1_sugu", sp1_sex$ Set numeric value: rida, "faili_kogukestus", filedur Set string value: rida, "SP2_fail", teine_fail$ Set string value: rida, "SP2_ID", sp2_ID$ Set string value: rida, "SP2_sugu", sp2_sex$ Set string value: rida, "vooru_tyyp", int$ Set numeric value: rida, "vooru_id", voor Set numeric value: rida, "vooru_kestus", dur_voor Set numeric value: rida, "artikul_kestus", dur_art Set numeric value: rida, "pauside_kestus", pause_dur Set numeric value: rida, "karin_kestus", cr_dur Set numeric value: rida, "sonade_arv", n_sona Set numeric value: rida, "silpide_arv", n_syl Set numeric value: rida, "foneemide_arv", n_phon Set numeric value: rida, "poolikute_arv", hesit Set numeric value: rida, "korduste_arv", rep Set numeric value: rida, "venituste_arv", elong Set numeric value: rida, "pauside_arv", pause Set numeric value: rida, "yneemide_arv", filler # põhitoon if dur_voor > 0.02 start_x = if start-0.02 < 0 then 0 else start-0.02 fi stop_x = if stop+0.02 > filedur then filedur else stop+0.02 fi selectObject: wav tmp1 = Extract part: start_x, stop_x, "rectangular", 1, "yes" tmp2 = noprogress To Pitch: 0, 50, 700 q1 = Get quantile: 0, 0, 0.25, "Hertz" q3 = Get quantile: 0, 0, 0.75, "Hertz" floor = q1*0.75 ceiling = q3*2 if floor <> undefined and ceiling <> undefined Remove selectObject: tmp1 tmp2 = noprogress To Pitch: 0, q1, q3 f0Mean = Get mean: start, stop, "Hertz" f0Max = Get quantile: start, stop, 0.95, "Hertz" f0Med = Get quantile: start, stop, 0.5, "Hertz" f0Min = Get quantile: start, stop, 0.05, "Hertz" selectObject: tulem Set numeric value: rida, "f0Mean", f0Mean Set numeric value: rida, "f0Min", f0Min Set numeric value: rida, "f0Max", f0Max Set numeric value: rida, "f0Med", f0Med endif selectObject: tmp1 plusObject: tmp2 Remove endif #if voor endif #voor to voorusegmente endfor selectObject: "TextGrid "+ fail$ plusObject: wav Remove aegakulus += stopwatch logi$ = fail$ + " tehtud! Aega on läinud " + fixed$(aegakulus, 3) + newline$ writeInfo: logi$ #for f to faile endfor select Strings temp Remove #for subkorp endfor