From 11ad92d4186d39957bbcef94121043b4036a417c Mon Sep 17 00:00:00 2001 From: esteng Date: Sat, 24 Feb 2018 18:01:52 -0500 Subject: [PATCH 1/5] starting sibilant script --- ICECAN/corpus_reorganization_script.py | 12 ++- ICECAN/sibilant_script/.DS_Store | Bin 0 -> 6148 bytes ICECAN/sibilant_script/open_tg.praat | 13 +++ ICECAN/sibilant_script/plan: | 17 ++++ ICECAN/sibilant_script/sendpraat_carbon | Bin 0 -> 18364 bytes ICECAN/sibilant_script/sib_script | 20 +++++ ICECAN/sibilant_script/superscript.py | 107 ++++++++++++++++++++++++ 7 files changed, 165 insertions(+), 4 deletions(-) create mode 100644 ICECAN/sibilant_script/.DS_Store create mode 100644 ICECAN/sibilant_script/open_tg.praat create mode 100644 ICECAN/sibilant_script/plan: create mode 100755 ICECAN/sibilant_script/sendpraat_carbon create mode 100644 ICECAN/sibilant_script/sib_script create mode 100644 ICECAN/sibilant_script/superscript.py diff --git a/ICECAN/corpus_reorganization_script.py b/ICECAN/corpus_reorganization_script.py index 81f7225..dbfc9c1 100644 --- a/ICECAN/corpus_reorganization_script.py +++ b/ICECAN/corpus_reorganization_script.py @@ -1,3 +1,5 @@ + +# coding=utf-8 import os import sys import csv @@ -8,8 +10,10 @@ from statistics import mean from textgrid import TextGrid, IntervalTier -orig_dir = r'/media/share/corpora/ICE-Can' -output_dir = r'/media/share/corpora/ICE-Can/to-align' +# orig_dir = r'/media/share/corpora/ICE-Can' +# output_dir = r'/media/share/corpora/ICE-Can/to-align' +orig_dir = r"/Volumes/data/corpora/ICE-Can" +output_dir = r"/Volumes/data/corpora/ICE-Can/to-align" os.makedirs(output_dir, exist_ok=True) @@ -332,5 +336,5 @@ def convert_wavs(): if __name__ == '__main__': reorganize_meta_file() - convert_wavs() - parse_transcripts() + # convert_wavs() + # parse_transcripts() diff --git a/ICECAN/sibilant_script/.DS_Store b/ICECAN/sibilant_script/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 b^vtf3`j`NOKteyV>?Zf{6 literal 0 HcmV?d00001 diff --git a/ICECAN/sibilant_script/sib_script b/ICECAN/sibilant_script/sib_script new file mode 100644 index 0000000..48358e3 --- /dev/null +++ b/ICECAN/sibilant_script/sib_script @@ -0,0 +1,20 @@ +csv_raw$ = readFile$ ("testsibilants.csv") + +procedure split (.sep$, .str$) + .seplen = length(.sep$) + .length = 0 + repeat + .strlen = length(.str$) + .sep = index(.str$, .sep$) + if .sep > 0 + .part$ = left$(.str$, .sep-1) + .str$ = mid$(.str$, .sep+.seplen, .strlen) + else + .part$ = .str$ + endif + .length = .length+1 + .array$[.length] = .part$ + until .sep = 0 +endproc + +Read from file: "/Volumes/data/corpora" ; Mac diff --git a/ICECAN/sibilant_script/superscript.py b/ICECAN/sibilant_script/superscript.py new file mode 100644 index 0000000..14b7ed3 --- /dev/null +++ b/ICECAN/sibilant_script/superscript.py @@ -0,0 +1,107 @@ +import os +import pandas as pd +import re +import argparse +import numpy as np +import subprocess +import sys + +np.random.seed(1234) +def get_sample(path): + sib_df = pd.read_csv(path) + + all_corpora = sib_df['corpus'] + corp_freqdict = {c:0 for c in set(all_corpora)} + data_dict = {c: None for c in set(all_corpora)} + for c in all_corpora: + corp_freqdict[c]+=1 + perc = .01 + tot_df = pd.DataFrame() + corp_freqdict = {c: np.rint(perc * float(v)) for c,v in corp_freqdict.items()} + for corp,num_samples in corp_freqdict.items(): + data=[] + sub_frame = sib_df[sib_df.corpus == corp] + + all_idxs = np.arange(0, sub_frame.shape[0],1) + + chosen_idxs = np.random.choice(all_idxs, size=int(num_samples)) + tot_df = pd.concat([tot_df, sub_frame.iloc[chosen_idxs]]) + + return tot_df, set(all_corpora) + +# def write_files(df, path_dict): +# """ +# Parameters +# ---------- +# df: pd dataframe +# representative sample of original data +# path_dict: +# dict with corpus name as key and path to textgrids for that corpus as value +# """ + +# desired_info = [] +# sub_df = df[] + +def input_taker(df,locations): + print("Interactive script for sibilant checks:") + enter = input("press enter to continue") + row_idx = 0 + print(enter) + while enter.strip() is "": + # get a line from the df + row = df.iloc[row_idx] + filename = row["discourse"] + corpus = row["corpus"].lower() + print(corpus) + if corpus == "SOTC": + split_name = re.split("-", filename) + outer_dir = "-".join(split_name[0:2]) + inner_dir = "-".join(split_name[0:3]) + tg_path = os.path.join(locations[corpus], outer_dir, inner_dir, filename + ".TextGrid") + wav_path = os.path.join(locations[corpus], outer_dir, inner_dir, filename + ".wav") + else: + # elif corpus == "Raleigh": + outer_dir = filename[0:6] + tg_path = os.path.join(locations[corpus], outer_dir, filename + ".TextGrid") + wav_path = os.path.join(locations[corpus], outer_dir, filename + ".wav") + + zoom_start, zoom_end = row["begin"], row["end"] + print(" ".join([str(x) for x in ["/Applications/Praat.app/Contents/MacOS/Praat","--run", "open_tg", + tg_path, wav_path, zoom_start, zoom_end]])) + p = subprocess.Popen([str(x) for x in ["/Applications/Praat.app/Contents/MacOS/Praat","--run", "open_tg", + tg_path, wav_path, zoom_start, zoom_end]], shell=True) + + p.communicate() + # open textgrid with wav by subprocess calling praat script with arguments + row_idx+=1 + + +def get_locations(corpora, location_file): + """ + needs a list of corpora (for checks) and a location file + where each line is , + """ + with open(location_file) as f1: + lines = [x.split(",") for x in f1.readlines()] + location_dict = {x.lower():None for x in corpora} + for corpus, location in lines: + try: + if not os.path.exists(location.strip()): + print("Error: Location {} does not exist".format(location)) + sys.exit(1) + location_dict[corpus.lower()] = location.strip() + except KeyError: + print("Error: Corpus {} is not in the sibilant dataset".format(corpus)) + sys.exit(1) + return location_dict + + + +one_perc_df, corpora = get_sample("testsibilants.csv") +just_Ral = one_perc_df[one_perc_df.corpus == "Raleigh"] +loc_dict = get_locations(corpora, "locations.txt") +input_taker(just_Ral, loc_dict) +sys.exit() + + +print(one_perc_df.shape) \ No newline at end of file From 91ad7eca8a5608ae99a4f8e8981e3ac1b4d6a92f Mon Sep 17 00:00:00 2001 From: esteng Date: Sun, 25 Feb 2018 12:57:38 -0500 Subject: [PATCH 2/5] superscript --- ICECAN/sibilant_script/superscript.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ICECAN/sibilant_script/superscript.py b/ICECAN/sibilant_script/superscript.py index 14b7ed3..11d16da 100644 --- a/ICECAN/sibilant_script/superscript.py +++ b/ICECAN/sibilant_script/superscript.py @@ -66,10 +66,13 @@ def input_taker(df,locations): wav_path = os.path.join(locations[corpus], outer_dir, filename + ".wav") zoom_start, zoom_end = row["begin"], row["end"] - print(" ".join([str(x) for x in ["/Applications/Praat.app/Contents/MacOS/Praat","--run", "open_tg", - tg_path, wav_path, zoom_start, zoom_end]])) - p = subprocess.Popen([str(x) for x in ["/Applications/Praat.app/Contents/MacOS/Praat","--run", "open_tg", - tg_path, wav_path, zoom_start, zoom_end]], shell=True) + + path_to_open = os.path.join(os.path.split(os.path.abspath(__file__))[0], "open_tg.praat") + # ./sendpraat praat "execute Users/Elias/SPADE/ICECAN/sibilant_script/open_tg.praat + command = ['./sendpraat', 'praat', '"execute', path_to_open, str(tg_path), str(wav_path), str(zoom_start), str(zoom_end)+ '"'] + print(" ".join(command)) + sys.exit() + p = subprocess.Popen(command, shell=True) p.communicate() # open textgrid with wav by subprocess calling praat script with arguments From 6d1d63062cee13fd7ef142e5ea66b7b91ff8d99b Mon Sep 17 00:00:00 2001 From: esteng Date: Sun, 25 Feb 2018 13:00:12 -0500 Subject: [PATCH 3/5] open script --- ICECAN/sibilant_script/open_tg.praat | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ICECAN/sibilant_script/open_tg.praat b/ICECAN/sibilant_script/open_tg.praat index 53ea41d..a6195ad 100644 --- a/ICECAN/sibilant_script/open_tg.praat +++ b/ICECAN/sibilant_script/open_tg.praat @@ -6,8 +6,9 @@ form Open a tgwav endform tg = Read from file: tg_path$ wav = Read from file: wav_path$ -selectObject: tg, wav +selectObject: wav +plusObject: tg View & Edit -editor: "checking" +editor: tg Zoom: start, end endeditor \ No newline at end of file From 4435abd20824757227b648b7a20be3adae2af382 Mon Sep 17 00:00:00 2001 From: esteng Date: Mon, 26 Feb 2018 14:15:10 -0500 Subject: [PATCH 4/5] working python to praat integration --- ICECAN/sibilant_script/open_2.praat | 49 +++++++++++++++++ ICECAN/sibilant_script/open_tg.praat | 5 ++ ICECAN/sibilant_script/{plan: => plan} | 6 +-- .../{sendpraat_carbon => sendpraat} | Bin ICECAN/sibilant_script/superscript.py | 50 ++++++++++-------- ICECAN/sibilant_script/temp.sh | 1 + 6 files changed, 86 insertions(+), 25 deletions(-) create mode 100644 ICECAN/sibilant_script/open_2.praat rename ICECAN/sibilant_script/{plan: => plan} (87%) rename ICECAN/sibilant_script/{sendpraat_carbon => sendpraat} (100%) create mode 100644 ICECAN/sibilant_script/temp.sh diff --git a/ICECAN/sibilant_script/open_2.praat b/ICECAN/sibilant_script/open_2.praat new file mode 100644 index 0000000..5a430af --- /dev/null +++ b/ICECAN/sibilant_script/open_2.praat @@ -0,0 +1,49 @@ +# read in file info +form Open a tgwav + sentence Tg_path /Volumes/data/corpora/Raleigh/ral368/ral3680d.TextGrid + sentence Wav_path /Volumes/data/corpora/Raleigh/ral368/ral3680d.wav + positive Start 1494.81 + positive End 1494.91 +endform + +# load files +tg = Read from file: tg_path$ +wav = Read from file: wav_path$ + +# select objects +selectObject: wav +plusObject: tg +grid$ = selected$ ("TextGrid") +sound$ = selected$ ("Sound") + +# add annotation tier and boundaries +select TextGrid 'grid$' +numberOfTiers = Get number of tiers + +Edit +editor TextGrid 'grid$' + Add interval tier... numberOfTiers+1 sibann + Close +endeditor + +Insert boundary... numberOfTiers+1 start +Insert boundary... numberOfTiers+1 end + +plus Sound 'sound$' +# zoom in on focused part +View & Edit +editor TextGrid 'grid$' + Zoom: start, end +endeditor + + +select Sound 'sound$' +Edit +editor Sound 'sound$' + Zoom: start, end + Select: start, end +endeditor + +#writeInfoLine: "COG: ", cog +#appendInfoLine: " + diff --git a/ICECAN/sibilant_script/open_tg.praat b/ICECAN/sibilant_script/open_tg.praat index a6195ad..87170a2 100644 --- a/ICECAN/sibilant_script/open_tg.praat +++ b/ICECAN/sibilant_script/open_tg.praat @@ -8,7 +8,12 @@ tg = Read from file: tg_path$ wav = Read from file: wav_path$ selectObject: wav plusObject: tg + View & Edit +Insert interval tier... '5' 'sib_ann' editor: tg + + #Insert boundary... '5' start + #Insert boundary... '5' end Zoom: start, end endeditor \ No newline at end of file diff --git a/ICECAN/sibilant_script/plan: b/ICECAN/sibilant_script/plan similarity index 87% rename from ICECAN/sibilant_script/plan: rename to ICECAN/sibilant_script/plan index f4d9573..58d1e15 100644 --- a/ICECAN/sibilant_script/plan: +++ b/ICECAN/sibilant_script/plan @@ -10,8 +10,8 @@ plan: - interactive script in batches (to avoid opening 600 praat windows at once and crashing computer) subprocess call to praat script - praat script opens corresponding file with path/filename and timing info - praat script adds a tier where annotation can happen - praat script opens textgrid and wav file, zooms in on time slice + praat script opens corresponding file with path/filename and timing info (done) + praat script adds a tier where annotation can happen (done) + praat script opens textgrid and wav file, zooms in on time slice (done) praat script opens long term spectral slice window praat script opens info window with COG, peak, slope, spread measures diff --git a/ICECAN/sibilant_script/sendpraat_carbon b/ICECAN/sibilant_script/sendpraat similarity index 100% rename from ICECAN/sibilant_script/sendpraat_carbon rename to ICECAN/sibilant_script/sendpraat diff --git a/ICECAN/sibilant_script/superscript.py b/ICECAN/sibilant_script/superscript.py index 11d16da..7edcdd9 100644 --- a/ICECAN/sibilant_script/superscript.py +++ b/ICECAN/sibilant_script/superscript.py @@ -3,10 +3,15 @@ import re import argparse import numpy as np -import subprocess +from subprocess import Popen, PIPE import sys +import shlex +from pyraat import PraatAnalysisFunction np.random.seed(1234) + +PRAAT = "/Applications/Praat.app/Contents/MacOS/Praat" + def get_sample(path): sib_df = pd.read_csv(path) @@ -29,24 +34,12 @@ def get_sample(path): return tot_df, set(all_corpora) -# def write_files(df, path_dict): -# """ -# Parameters -# ---------- -# df: pd dataframe -# representative sample of original data -# path_dict: -# dict with corpus name as key and path to textgrids for that corpus as value -# """ - -# desired_info = [] -# sub_df = df[] - def input_taker(df,locations): print("Interactive script for sibilant checks:") enter = input("press enter to continue") row_idx = 0 print(enter) + while enter.strip() is "": # get a line from the df row = df.iloc[row_idx] @@ -67,14 +60,28 @@ def input_taker(df,locations): zoom_start, zoom_end = row["begin"], row["end"] - path_to_open = os.path.join(os.path.split(os.path.abspath(__file__))[0], "open_tg.praat") - # ./sendpraat praat "execute Users/Elias/SPADE/ICECAN/sibilant_script/open_tg.praat - command = ['./sendpraat', 'praat', '"execute', path_to_open, str(tg_path), str(wav_path), str(zoom_start), str(zoom_end)+ '"'] - print(" ".join(command)) - sys.exit() - p = subprocess.Popen(command, shell=True) + path_to_open = os.path.join(os.path.split(os.path.abspath(__file__))[0], "open_2.praat") + # quote_str = '"runScript: \\"{}\\", {} {} {} {}"'.format(path_to_open, tg_path, wav_path, zoom_start, zoom_end) + # script_args = [tg_path, wav_path, zoom_start, zoom_end] + quote_str = "execute /Users/esteng/SPADE/ICECAN/sibilant_script/open_2.praat {} {} {} {}".format( + tg_path, wav_path, zoom_start, zoom_end) + cmd = ["./sendpraat", "praat", quote_str] + print(quote_str) + with Popen(cmd, stdout=PIPE, stderr=PIPE, stdin=PIPE) as p: + try: + text = str(p.stdout.read().decode('latin')) + err = str(p.stderr.read().decode('latin')) + except UnicodeDecodeError: + print(p.stdout.read()) + print(p.stderr.read()) + + print(text, err) - p.communicate() + # ./sendpraat praat "execute Users/Elias/SPADE/ICECAN/sibilant_script/open_tg.praat + # run_script("/Applications/Praat.app/Contents/MacOS/Praat", "open_2.praat", *script_args) + # par = run_script("open_2.praat", arguments=script_args) + # par() + enter = input("press enter to continue") # open textgrid with wav by subprocess calling praat script with arguments row_idx+=1 @@ -104,7 +111,6 @@ def get_locations(corpora, location_file): just_Ral = one_perc_df[one_perc_df.corpus == "Raleigh"] loc_dict = get_locations(corpora, "locations.txt") input_taker(just_Ral, loc_dict) -sys.exit() print(one_perc_df.shape) \ No newline at end of file diff --git a/ICECAN/sibilant_script/temp.sh b/ICECAN/sibilant_script/temp.sh new file mode 100644 index 0000000..39f897c --- /dev/null +++ b/ICECAN/sibilant_script/temp.sh @@ -0,0 +1 @@ +./sendpraat praat "execute /Users/esteng/SPADE/ICECAN/sibilant_script/open_2.praat /Volumes/data/corpora/Raleigh/ral128/ral1280d.TextGrid /Volumes/data/corpora/Raleigh/ral128/ral1280d.wav 1963.9436 1964.1331699999998" \ No newline at end of file From a0077dd6aa4e838fb1f36a970ea855834f8671a4 Mon Sep 17 00:00:00 2001 From: esteng Date: Wed, 14 Mar 2018 12:28:10 -0400 Subject: [PATCH 5/5] sibilant_script running --- sibilant_script/.DS_Store | Bin 0 -> 6148 bytes sibilant_script/README.md | 31 +++++++++ sibilant_script/open_2.praat | 57 ++++++++++++++++ sibilant_script/plan | 17 +++++ sibilant_script/sendpraat | Bin 0 -> 18364 bytes sibilant_script/sendpraat.exe | Bin 0 -> 41472 bytes sibilant_script/superscript.py | 121 +++++++++++++++++++++++++++++++++ 7 files changed, 226 insertions(+) create mode 100644 sibilant_script/.DS_Store create mode 100644 sibilant_script/README.md create mode 100644 sibilant_script/open_2.praat create mode 100644 sibilant_script/plan create mode 100755 sibilant_script/sendpraat create mode 100644 sibilant_script/sendpraat.exe create mode 100644 sibilant_script/superscript.py diff --git a/sibilant_script/.DS_Store b/sibilant_script/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0, + - the path should be an absolute path + - examples can be found in the "location_example.txt" file +2. Open the Praat application + - praat needs to be running already for the script to work +3. run the script + - input `python superscript.py` into the command line +4. step through the interactive script + - in the command line, a prompt will appear to press enter. Each time you press enter in the command line, a new row will be read from the testsibilants.csv file, which corresponds to a new sibilant. Three Praat windows should open. Note that opening the Praat windows may take a few seconds. + +## Adding new corpora +To add support for new corpora (in case you have them in textgrid format), two changes need to be made: +1. add their locations to the `locations.txt` file +2. add their names to `CORPUS_LIST` list at line 11 of `superscript.py` + + diff --git a/sibilant_script/open_2.praat b/sibilant_script/open_2.praat new file mode 100644 index 0000000..58d6352 --- /dev/null +++ b/sibilant_script/open_2.praat @@ -0,0 +1,57 @@ +# read in file info +form Open a tgwav + sentence Tg_path /Volumes/data/corpora/Raleigh/ral368/ral3680d.TextGrid + sentence Wav_path /Volumes/data/corpora/Raleigh/ral368/ral3680d.wav + positive Start 1494.81 + positive End 1494.91 + positive Cog 0.0 + positive Peak 0.0 + positive Slope 0.0 + positive Spread 0.0 +endform + +# load files +tg = Read from file: tg_path$ +wav = Read from file: wav_path$ + +# select objects +selectObject: wav +plusObject: tg +grid$ = selected$ ("TextGrid") +sound$ = selected$ ("Sound") + +# add annotation tier and boundaries +select TextGrid 'grid$' +numberOfTiers = Get number of tiers + +Edit +editor TextGrid 'grid$' + Add interval tier... numberOfTiers+1 sibann + Close +endeditor + +Insert boundary... numberOfTiers+1 start +Insert boundary... numberOfTiers+1 end + +plus Sound 'sound$' +# zoom in on focused part +View & Edit +editor TextGrid 'grid$' + Zoom: start, end +endeditor + + +select Sound 'sound$' +Edit +editor Sound 'sound$' + Zoom: start, end + Select: start, end +endeditor + +writeInfoLine: "COG: ", cog +appendInfoLine: "Peak: ", peak +appendInfoLine: "Slope: ", slope +appendInfoLine: "Spread: ", spread + + + diff --git a/sibilant_script/plan b/sibilant_script/plan new file mode 100644 index 0000000..58d1e15 --- /dev/null +++ b/sibilant_script/plan @@ -0,0 +1,17 @@ +plan: +- open/read csv w/ python/pandas (done) +- take 1% weighted sample (done) +- for each sample: + get path/filename + get timing info + write to individual file + get COG, peak, slope, spread + write to another file (?) +- interactive script + in batches (to avoid opening 600 praat windows at once and crashing computer) + subprocess call to praat script + praat script opens corresponding file with path/filename and timing info (done) + praat script adds a tier where annotation can happen (done) + praat script opens textgrid and wav file, zooms in on time slice (done) + praat script opens long term spectral slice window + praat script opens info window with COG, peak, slope, spread measures diff --git a/sibilant_script/sendpraat b/sibilant_script/sendpraat new file mode 100755 index 0000000000000000000000000000000000000000..9733b023d9de910aaa621783369d396b7403e22e GIT binary patch literal 18364 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 b^vtf3`j`NOKteyV>?Zf{6 literal 0 HcmV?d00001 diff --git a/sibilant_script/sendpraat.exe b/sibilant_script/sendpraat.exe new file mode 100644 index 0000000000000000000000000000000000000000..9d334affc76f16ab3a4c4f536b0d352cde56bab4 GIT binary patch literal 41472 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 literal 0 HcmV?d00001 diff --git a/sibilant_script/superscript.py b/sibilant_script/superscript.py new file mode 100644 index 0000000..2e7758c --- /dev/null +++ b/sibilant_script/superscript.py @@ -0,0 +1,121 @@ +import os +import pandas as pd +import re +import argparse +import numpy as np +from subprocess import Popen, PIPE +import sys +import platform + +np.random.seed(1234) + +CORPUS_LIST = ["SB_West", "Raleigh"] + +def get_sample(path): + sib_df = pd.read_csv(path) + + all_corpora = sib_df['corpus'] + corp_freqdict = {c:0 for c in set(all_corpora)} + data_dict = {c: None for c in set(all_corpora)} + for c in all_corpora: + corp_freqdict[c]+=1 + perc = .01 + tot_df = pd.DataFrame() + corp_freqdict = {c: np.rint(perc * float(v)) for c,v in corp_freqdict.items()} + for corp,num_samples in corp_freqdict.items(): + data=[] + sub_frame = sib_df[sib_df.corpus == corp] + + all_idxs = np.arange(0, sub_frame.shape[0],1) + + chosen_idxs = np.random.choice(all_idxs, size=int(num_samples)) + tot_df = pd.concat([tot_df, sub_frame.iloc[chosen_idxs]]) + + return tot_df, set(all_corpora) + +def input_taker(df,locations): + print("Interactive script for sibilant checks:") + enter = input("press enter to continue") + row_idx = 0 + print(enter) + + while enter.strip() is "": + # get a line from the df + row = df.iloc[row_idx] + filename = row["discourse"] + corpus = row["corpus"].lower() + print(corpus) + if corpus.lower() == "sotc": + split_name = re.split("-", filename) + outer_dir = "-".join(split_name[0:2]) + inner_dir = "-".join(split_name[0:3]) + tg_path = os.path.join(locations[corpus], outer_dir, inner_dir, filename + ".TextGrid") + wav_path = os.path.join(locations[corpus], outer_dir, inner_dir, filename + ".wav") + elif corpus.lower() == "raleigh": + outer_dir = filename[0:6] + tg_path = os.path.join(locations[corpus], outer_dir, filename + ".TextGrid") + wav_path = os.path.join(locations[corpus], outer_dir, filename + ".wav") + elif corpus.lower() == "sb_west": + tg_path = os.path.join(locations[corpus], filename + ".TextGrid") + wav_path = os.path.join(locations[corpus], filename + ".wav") + else: + print("Error: Corpus {} not implemented".format(corpus)) + sys.exit() + + zoom_start, zoom_end = row["begin"], row["end"] + cog, peak, slope, spread = row["cog"], row["peak"], row["slope"], row["spread"] + + path_to_open = os.path.join(os.path.split(os.path.abspath(__file__))[0], "open_2.praat") + + quote_str = "execute {} {} {} {} {} {} {} {} {}".format(path_to_open, + tg_path, wav_path, + zoom_start, + zoom_end, + cog, peak, + slope, + spread) + + if platform.system() == "Darwin": + cmd = ["./sendpraat", "praat", quote_str] + else: + cmd = ["sendpraat.exe", "praat", quote_str] + # print(quote_str) + with Popen(cmd, stdout=PIPE, stderr=PIPE, stdin=PIPE) as p: + try: + text = str(p.stdout.read().decode('latin')) + err = str(p.stderr.read().decode('latin')) + except UnicodeDecodeError: + print(p.stdout.read()) + print(p.stderr.read()) + + enter = input("press enter to continue") + row_idx+=1 + + +def get_locations(corpora, location_file): + """ + needs a list of corpora (for checks) and a location file + where each line is , + """ + with open(location_file) as f1: + lines = [x.split(",") for x in f1.readlines()] + location_dict = {x.lower():None for x in corpora} + for corpus, location in lines: + try: + if not os.path.exists(location.strip()): + print("Error: Location {} does not exist".format(location)) + sys.exit(1) + location_dict[corpus.lower()] = location.strip() + except KeyError: + print("Error: Corpus {} is not in the sibilant dataset".format(corpus)) + sys.exit(1) + return location_dict + + + +one_perc_df, corpora = get_sample("testsibilants.csv") +sub_df = one_perc_df[one_perc_df.corpus.isin(CORPUS_LIST)] +loc_dict = get_locations(corpora, "locations.txt") +input_taker(sub_df, loc_dict) + +print(one_perc_df.shape) \ No newline at end of file