Universiteternes mange ansigter

Udover at arbejde med mediesprog og sprogforandring interesserer jeg mig også for sprogpolitik i forskellige afskygninger. Fx har jeg undersøgt hvad der sker når universiteters undervisningssprog ændres fra dansk til engelsk – noget jeg bl.a. har skrevet om sammen med netværket her.

Universiteter og undervisningssprog

Det finurlige (og foruroligende) ved sammenhængen mellem universiteter og sprog er at beslutninger som påvirker sproglige valg aldrig handler om sprog… Måske skulle jeg sige det på en anden måde. Der træffes masser af beslutninger der påvirker sprogvalg, men dem der træffer beslutningerne, tænker aldrig på sprog og er som regel ligeglade med sprog. Et godt eksempel er undervisningssprog på universiteterne. Når man i højere og højere grad underviser på engelsk (og det gør man på alle nordiske universiteter), er det ikke fordi man mener engelsk er et bedre sprog at undervise på. Det er fordi man ønsker internationalisering, og internationalisering kræver engelsk. Argumentet er at alle verdens lande er i konkurrence om at tiltrække de bedste studerende og forskere, og den eneste måde at tiltrække de bedste, er ved at standardisere undervisningen (altså gøre den engelsk); “for hvem gider dog at lære dansk for at læse i Danmark?”.

Denne intention (og den tro på markedskræfternes retfærdighed som den hviler på) kan man mene meget godt og dårligt om. Det korte af det lange er at valget af undervisningssprog, skyldes intentionen om internationalisering og ikke pædagogiske eller sproglige overvejelser.

Universiteter og internationalisering – bullshitbingo for øvede

I de seneste år har de herskende politiske vinde altså blæst i retning af internationalisering, markedsgørelsekonkurrence, placering på internationale ranglister osv. Det er helt i tråd med disse tendenser at Københavns Universitets den 28. oktober kunne præsentere sit nyeste bud på en forskningsprofilering. Københavns Universitets særlige kendetegn er angiveligt at det er

Et fagligt bredt, internationalt anerkendt universitet 
med fokus på grundforskning og løsning af globale problemer

Nu kan man nok spørge sig selv hvilket universitet der ikke kunne bruge disse ord om sig selv… Er det ikke bare bullshitbingo for virkelig øvede? Jo, det er det faktisk! Men ordvalget er stadig interessant: internationalt, grundforskning, globale problemer. Retorikken er tydeligt at det her er et international(isere)t universitet med fokus på konkurrence.

Nye vinde blæser

Nogen på Københavns Universitet må have følt sig snydt da de hørte videnskabsminister Morten Østergaards nyeste udmelding 29. oktober (dagen efter launchen af KU’s udstillingsvindue og selvpræsentation). Nu er bonusordene ikke længere internationalisering, grundforskning og globale løsninger; nej, nu er det nationen og det lokale erhversliv der skal tilgodeses med bedre uddannelser til flere (danskere) og med tydeligere erhverspotentiale i uddannelserne. Universiteterne skal tænke længere end “den sidste eksamen” og i stedet have fokus på “den første arbejdsdag”. For universiteterne betyder det at de ikke skal forstå sig selv som internationale institutioner i et globalt marked, men som nationale institutioner til samfundets (og Dansk Industris) bedste. Jeg siger ikke at det er forkert at lægge linjen om, eller at man ikke kan opnå flere mål, men jeg tror det var en stille revolution i dansk universitetspolitik vi her blev mødt af.

Ikke mindst er det jo ironisk at Københavns Universitets nøje designede bullshit-frase

Et fagligt bredt, internationalt anerkendt universitet 
med fokus på grundforskning og løsning af globale problemer

bliver forældet lige præcis én dag efter at være blevet offentliggjort – for nu er det altså ikke længere internationalisering politikerne ønsker, nu er det nationalisering. Må jeg foreslå en ændring:

Et fagligt bredt, internationalt anerkendt universitet 
med fokus på grundforskning, uddannelser af højeste kvalitet
og løsning af globale og nationale problemer

Dermed er en tekst som allerede var bullshit, bullshittet yderligere op – ganske gratis.

De ringer Vi spiller… på en ny måde

Jeg præsenterede Dialekkortet for kolleger på Sprogforandringscentret i sidste uge, og flere efterspurgte en mere systematisk adgang til data (så man slipper for at rode med et kort hvis man fx er interesseret i at lytte til alle unge kvinder eller alle optagelser fra 1970′erne).

Som løsning på dette ønske er her tre html-tabeller med data sorteret enten:

Køn => Alder => Bopæl (altså sorteret først efter køn (kvinder før mænd), så efter alder (unge før gamle) og så efter bopæl (Albertslund før Ballerup)

Optagelsesdato => Køn => Alder

Bopæl => Køn => Alder

De ringer, Vi spiller – som dialektkort

Jeg har (med stor hjælp fra Tilde Ranis) lavet forsøg med en onlinevisualisering af den sproglige variation i Danmarks Radio. Frugten af anstrengelserne er indtil videre dette Radiofoniske Dialektkort baseret et stort antal samtaler med De ringer, Vi spillers Jørn Hjorting som den ene part og små 500 almindelige danskere som den anden part.

DialektkortFor hver samtale er lytterens køn, alder, hjemby samt musikønske registreret. For de heldige forskere og studerende der har adgang til LARM.fm er der linket direkte til lyden af den enkelte samtale eller det enkelte musikstykke.

Der er skønhedsfejl ved dialektkortet.  Rettelser, kommentarer og forslag til hvordan Google Maps kan betvinges modtages med stor taknemmelighed.

Replik til Berlingskes kronik

Berlingeren trykke i dag, 20.2.2013 min replik til udfaldet i lørdagens kronik (se nedenfor), . Replikken er her i uredigeret form (og med min egen titel):

 

Sprogforskerne ødelægger sproget! –Og meteorologerne giver vådere somre?

Jacob Thøgersen, Københavns Universitet, Sprogforandringscentret DGCSS.

Kære Ole Gustav Justenlund

Det er vist mig du skyder efter i din kronik fra 16.2.2013 med bemærkningen: ”For nylig opfordrede en af [Sprogforandrings]centrets forskere med jappende og meget utydelig udtale en DR 1-studievært til at lade være med at sige »kræft«, for om ti år siger alle »kraft«. Sprogforskeren vidste, han havde »ratten« på sin side. Han var under 40.” Jeg er ked af at du fandt min tale jappende og min udtale utydelig, men radiointerviewet er heller ingen let genre når man ikke er trænet i den: 3 minutter til at fremstille sin sag og hele tiden en journalist der tripper for at komme videre med næste indslag. Og så var min hovedpointe faktisk slet ikke sproglig, men derimod at der med forskningsprojektet LARM er skaffet forskningsadgang til DR’s radioarkiver…

Men jeg er glad for at blive bemærket og glad for at der er andre end os ”18 videnskabelige medarbejdere [der dyrker] den sproglige deroute” der synes det er værd at diskutere sprogforandring. Først lige et par ord om hvor vi er enige, og så et par ord om hvor vi er uenige:

Vi der studerer sprogforandring i dansk, har bemærket de fleste af de sprogforandringer (eller hvis du foretrækker det ”sproglige dovenskab”) som du påpeger, så vi bliver ikke uenige om hvorvidt de findes. For eksempel: Ændringen af [v] til [w], [skrevet] til [skrewet], er en del af det man kalder spirantsvækkelsen, som man plejer at henføre til ca. 1100-tallet. Den samme svækkelse ramte det gamle [th] sådan at vi fik det bløde [d] vi kender i vore dages dansk. I moderne dansk kan et efterfølgende blødt [d], om man så må sige, virke tilbage på et forudgående [w] sådan at det også bliver til et blødt [d], og så får vi sammenfald mellem skrevet og skredet, nemlig omtrent [skreded]. Dette sammenfald er, om ikke før, beskrevet af Jørn Lund i 1978 i artiklen med det sigende navn: ”Atte bleddet svagere og stagve” (i Læsepædagogen nr. 4).

Måske kan du af mit svar (så kedeligt og akademisk som det måtte være) se vores uoverensstemmelse: Sprogvidenskaben ser det som sin opgave at undersøge og beskrive sprog, at eksplicitere de regler som vi som sprogbrugere anvender for at forstå hinanden. Vi prøver at forstå både den menneskelige hjerne og de sociale mekanismer som gør at kommunikation mellem individer lykkes. Vi forsøger at forstå hvorfor sprog forandrer sig (ville det ikke være lettere hvis de ikke gjorde?). Man kan sammenligne os med meteorologer: Meteorologens opgave er at beskrive vejrfænomener og -forandringer og at forudsige dem. Det er ikke meteorologens opgave at sørge for længere somre eller regn på torsdag. Og det er ikke sprogvidenskabens opgave at stoppe dansks forandring på et givet stade, hvad enten dette stade så er år 1000, 1500, 1800, 1950, eller hvad idealister nu kunne blive enige om – ”vi er blevet enige om at vejret fremover skal være som det var forrige fredag”. Selv hvis nogen besluttede at det var vores opgave, ville det formentlig ikke have nogen effekt. Men mere om det nedenfor.

Dansk er i nogle henseender særligt. Der er mange vokaler i dansk, og derfor, tror jeg nok, er dansktalendes ører følsomme over for selv meget lille vokalvariation og danske debattører måske hurtigere end andre til at fare i blækhuset over vokalforandringer. Alle sprog har reduktioner, eller sjuskefænomener om du vil, men dansk mediesprog har måske nok flere end man er vant til fra vores nabolandes. Disse reduktionsfænomener gør at et givet dansk ord kan have ret forskellige udtaler afhængigt af hvem der siger dem, og hvilken sproglig sammenhæng de optræder i. Dea Trier Mørch sagde [livet] (med [v] og [d]) (i hvert fald når hun talte til en radiomikrofon). Jeg siger [liwed] (med [w] og blødt [d]), og når jeg taler hurtigt siger jeg måske [lied]. Er det, hånden på hjertet, ikke fascinerende at kommunikationen som regel forløber stort set uden problemer indtil vi stopper op og begynder at filosofere over at der er noget galt? Hvordan det kan lade sig gøre? Det er det vi vil forstå.

Den nyeste forskning i talesprogsreduktioner, både på dansk og på fx engelsk, tysk og nederlandsk, tyder på at det bl.a. kan lade sig gøre fordi der er ret klare regler for hvad der reduceres hvornår. Fx kan meget hyppige ord reduceres mere end sjældne ord (formentlig fordi de er lettere at forudsige ud af sammenhængen), og nogle ordklasser har større tendens til at reduceres end andre. Dermed kan reduktion altså hjælpe os med at afkode hvilket ord der menes. Det er den slags resultater der får Ruben Schachtenhaufen (han er den ”ph.d.-studerende [der] skaffe[de] sig medieopmærksomhed ved at erklære, at sprogligt sjuskeri er et tegn på overskud”) til at sige at ”sjusk” er et gode for kommunikationen. Vi bruger, efter denne logik, reduktioner til at understrege hvad i en sætning der er væsentligt og hvad der er mindre væsentligt. Hvis vi udtaler alt lige tydeligt, kan det af lytteren opfattes som om vi giver alt samme vægt – det er det man gør i fx en diktatoplæsning. Med reduktioner, ligesom med fx tryk og tone, kan man fremhæve visse ord i en sætning. ”Sjusk” er altså ikke i sig selv godt eller skidt, det er et af de mange parametre der indgår i det at kommunikere med sprog.

Og så til historien om ”det flade a” og ”kræft”/”kraft”: Min pointe med at undersøge ”det flade a” er at finde ud af om det hjælper at regulere andres sprogbrug, eller om det er spildte kræfter. Har sproglig revselse en målelig effekt, eller er det som at råbe til himlen for at stoppe regnen? Her er ”det flade a” og DR’s radioavis interessante danske eksempler. ”Det flade a”, som kan oversættes til ”et [a] der ligner et [æ] mere end det bør”, var det absolut mest udskældte danske udtalefænomen i det 20. århundrede. Der er skrevet hundredvis af kronikker der fordømmer det, det er nævnt i alle udtaleanvisninger osv. Alle nyhedsoplæsere har fået strenge ordrer på ikke at bruge ”flade a’er” – og få lyttere har formentlig opfattet at de gjorde det. Alligevel ser man en gradvis tendens til at a’erne nærmer sig æ’er mere og mere. Noget tyder altså på at nogle kræfter er stærkere end revselsen, og at det som én generation hører som utilbørligt, er upåfaldende for den næste.

Nu står der så en debat om udtalen af [e] og [æ] efter [r] og om der altså bør være en udtaleforskel mellem kræft og kraft, ret og rat osv. Også denne forandring har efterhånden været diskuteret i årevis, og mange, i hvert fald østdanskere, op til 50 år har ikke udtaleforskel i ordparrene, selvom de måske nok tror de har det. I P1-Morgen tillod jeg mig at fremskrive udviklingen af dette ”ræ” med den viden vi har om ”det flade a”, altså: ”lad være med at spilde kræfter på at prøve at stoppe udviklingen, den løber i sin egen retning uanset hvad den enkelte journalist vælger at gøre”, og ”i løbet af en generation eller to vil ingen bemærke at der skulle være noget forkert over at have samme udtale af kræft og kraft, for det har de fleste til den tid”. Det var det jeg prøvede at forklare Jan Falkentoft og lytterne.

 

Forskningscenter fører til sprogligt forfald!

Når man nu arbejder med noget så marginalt og – ja lad os sige det som det er – nørdet som sprogforandring, er det ikke hver dag man finder sin vej til landsdækkende medier. Og endnu sjældnere er det at nogen andre end venner om familie lægger mærke til det hvis man har gjort sin eksistens synlig. Så stor var min overraskelse da jeg så mig selv omtalt i Berlingskes kronik lørdag den 16.2.2013. Jeg tror det her er første gang jeg er blevet angrebet igennem medier, dog uden navns nævnelse… Jeg tager kritikken som en hæder, og glæder mig til fremtidig debat med hr. Justenlund og alle andre der er interesserede i sprogforandring, hvadenten de studerer den akademisk eller bekymrer sig om den:

Ole Gustav Justenlund skriver bl.a.:
“Man kan undre sig over, hvorfor det netop er Danmark, der er blevet så hårdt angrebet af sproglig vandalisme i de elektroniske medier, mens politikere og tv-folk i Sverige og Tyskland er meget omhyggelige med deres talte sprog. En af forklaringerne kan være, at det sproglige forfald er blevet institutionaliseret hertillands. På Center for Sociolingvistiske Sprogforandringsstudier ved Københavns Universitet dyrker 18 videnskabelige medarbejdere (deriblandt tre professorer) den sproglige deroute. Jo kraftigere sprogændringer, jo mere får de 18 forskere at beskæftige sig med. Ganske vist plæderer de officielt for sproglig mangfoldighed og tolerance, hvor intet »dømmes (…) som rigtigt eller forkert, grimt eller pænt«; men reelt går de ind for et dominerende lavkøbenhavnsk, som i charme og kommunikationsduelighed ligger langt fra tidligere tiders robuste københavnske arbejdersprog.”

Og med specifik adresse til mig: “For nylig opfordrede en af centrets forskere med jappende og meget utydelig udtale en DR 1-studievært til at lade være med at sige »kræft«, for om ti år siger alle »kraft«. Sprogforskeren vidste, han havde »ratten« på sin side. Han var under 40.”

Læs hele kronikken (og utallige kommentarer) her.

## This script extracts and plays marked vowels of the selected type in files from a selected decade.
## Vowels must be manually marked, and decade is deduced from the file name.
## Vowels can be extracted either in isolation or in the context of a target word.
## The script is designed to qualitatively assess vowel differences that are measured. With the use of the script, 
## a large quantity of vowels can be browsed relatively quickly.
##
## The script is written by jthoegersen@hum.ku.dk, GNU/GPL
##

form Vowel Extractor
choice Vowel 1
    button e
    button æ
    button ANLong
    button ANShort
    button AMShort
    button AMLong
    button C
    button O
    button å
    button ræ
    button ru
    button Aj
    button oj

choice Target 1
    button 1950s
    button 1960s
    button 1970s
    button 1980s
    button 1990s
    button 2000s

choice Context 2
    button In isolation
    button In target word
endform

Create Strings as file list... files L:\Korpus\vokaler\final\*.TextGrid

select Strings files
strings = Get number of strings

for string to strings

    select Strings files

    string$ = Get string... string
    filename$ = replace$ ("'string$'", ".TextGrid", "", 1)

    ### Select files ###
    variable$ = replace_regex$ ("'filename$'", "([0-9]+_)?([0-9]_)?[0-9]{8}_", "", 1)
    variable$ = replace_regex$ ("'variable$'", "_?F", "", 1)

    if variable$ = vowel$
        
        file$ = replace_regex$ ("'filename$'", "_'variable$'_?F", "", 1)
        file2$ = replace_regex$ ("'file$'", "^([0-9]+_)?([0-9]_)?([0-9]_)*", "", 1)
        year$ = replace_regex$ ("'file2$'", "[0-9]{4}$", "", 1)
        decade$ = replace_regex$ ("'year$'", "[0-9]$", "0", 1)
        decade$ = "'decade$'s"

        if decade$ = target$

            Open long sound file... L:\Korpus\lydfiler\'file$'.wav
            Read from file... L:\Korpus\vokaler\final\'string$'
    
            hits = Get number of intervals... 3

            for hit to hits

                select TextGrid 'filename$'

                label$ = Get label of interval... 3 hit

                if label$ <> ""

                    start = Get start point... 3 hit
                    end = Get end point... 3 hit
                    mid = start+((end-start)/2)

                    if context$ = "In target word"
                        ortointerval = Get interval at time... 1 mid
                        start = Get start point... 1 ortointerval
                        end = Get end point... 1 ortointerval
                        end = end+0.01
                    endif
    
                    select LongSound 'file$'

                    Extract part... start-0.01 end+0.01 no
                    Play
                    Remove

                    beginPause ("Continue?")
                    loop = endPause("Continue", "Next file", "Abort", 1)

                    if loop = 2
                        hit = hits
                    endif

                    if loop = 3
                        hit = hits
                        string = strings
                    endif
                endif
            endfor

            select LongSound 'file$'
            Remove
            select TextGrid 'filename$'
            Remove
        endif
    endif
endfor

select Strings files
Remove

Addition to the Great Formant Extraction Script – checks for “Stød”

clearinfo

files = Get number of strings

for file to files

    select Strings appended

    string$ = Get string... file

    Read from file... L:\Korpus\vokaler\'string$'

    vowels = Get number of points... 4

    for vowel to vowels

        time = Get time of point... 4 vowel

        ortointerval = Get interval at time... 1 time
        word$ = Get label of interval... 1 ortointerval
        phon$ = Get label of interval... 2 ortointerval

        if index (string$, "Long") > 0    
            
            if index (string$, "AN") > 0

                if index (phon$, "z:!") > 0

                    stod$ = "!"

                else
                    stod$ = ""
                endif

            elsif index (string$, "AM") > 0

                if index (phon$, "A:!") > 0

                    stod$ = "!"
                else
                    stod$ = ""
                endif
            endif

        elsif index (string$, "Long") = 0
            stod$ = ""
        endif

        printline 'stod$'
    endfor
    Remove
endfor

The Great Formant Extraction Script

### Create new file ###

#if fileReadable ("L:\Korpus\vokaler\statistik\'file$'_'variable$'.csv")
#    deleteFile ("L:\Korpus\vokaler\statistik\'file$'_'variable$'.csv")
#endif

if fileReadable ("L:\Korpus\vokaler\statistik\AllFiles.csv")
    deleteFile ("L:\Korpus\vokaler\statistik\AllFiles.csv")
endif

### Header ###
#fileappend L:\Korpus\vokaler\statistik\'file$'_'variable$'.csv File;Year;Decade;Speaker;Variable;PreWord;TargetWord;ProWord;PreSound;ProSound;Timing;MaxFreq;BW1;BW2;BW3;F1;F2;F3;DefaultFreq;BW1d;BW2d;BW3d;F1d;F2d;F3d'newline$'
fileappend L:\Korpus\vokaler\statistik\AllFiles.csv File;Year;Decade;Speaker;Sex;Variable;PreWord;TargetWord;ProWord;PreSound;ProSound;Timing;MaxFreq;BW1;BW2;BW3;F1;F2;F3;DefaultFreq;BW1d;BW2d;BW3d;F1d;F2d;F3d'newline$'

Create Strings as file list... filesShort L:\Korpus\vokaler\*Short*F.TextGrid
Create Strings as file list... filesLong L:\Korpus\vokaler\*Long*F.TextGrid

plus Strings filesShort
Append

select Strings filesShort
Remove
select Strings filesLong
Remove

Read Strings from raw text file... L:\Korpus\femaleSpeakers.txt
females = Get number of strings

select Strings appended
strings = Get number of strings

for string to strings

    select Strings appended

    string$ = Get string... string
    filename$ = replace$ ("'string$'", ".TextGrid", "", 1)

    ### Select files ###
    variable$ = replace_regex$ ("'filename$'", "([0-9]+_)?([0-9]_)?[0-9]{8}_", "", 1)
    variable$ = replace_regex$ ("'variable$'", "_?F", "", 1)

    file$ = replace_regex$ ("'filename$'", "_'variable$'_?F", "", 1)

    file2$ = replace_regex$ ("'file$'", "^([0-9]+_)?([0-9]_)?([0-9]_)*", "", 1)
    year$ = replace_regex$ ("'file2$'", "[0-9]{4}$", "", 1)

    decade$ = replace_regex$ ("'year$'", "[0-9]$", "0", 1)

    #decade = 'decade$'
    decade$ = "'decade$'s"

    Read from file... L:\Korpus\vokaler\'string$'
    Open long sound file... L:\Korpus\lydfiler\'file$'.wav
    Read from file... L:\Korpus\textgrids\'file$'.TextGrid

    ortointervals = Get number of intervals... 1

    ### Default speaker ###

    speakersegment$ = "XXX"


    ### Loop ###

    select TextGrid 'filename$'

    vowels = Get number of points... 4

    for vowel to vowels

        select TextGrid 'filename$'

        time = Get time of point... 4 vowel

        ### Orthography ###

        ortointerval = Get interval at time... 1 time
        word$ = Get label of interval... 1 ortointerval

        if ortointerval > 1
            preword$ = Get label of interval... 1 ortointerval-1
        else
            preword$ = ""
        endif

        if ortointerval < ortointervals
            proword$ = Get label of interval... 1 ortointerval+1
        else
            proword$ = ""
        endif

        ### Find speaker ###

        select TextGrid 'file$'
        segment = Get interval at time... 2 time
        speaker$ = Get label of interval... 2 segment

        speaker$ = replace_regex$ ("'speaker$'", ".+\(", "", 1)
        speaker$ = replace_regex$ ("'speaker$'", "\)$", "", 1)

        if speaker$ <> speakersegment$

            sex = 1
            
            select Strings femaleSpeakers

            for speaker to females

                taler$ = Get string... speaker

                if startsWith (speaker$, taler$) > 0

                    sex = 2
                endif
            endfor
                    
            if sex = 1
                defaultfreq = 5000
                sex$ = "M"
            elsif sex = 2
                defaultfreq = 5500
                sex$ = "F"
            endif

            speakersegment$ = speaker$

        endif

        ### Vowel timing ###

        select TextGrid 'filename$'
        vowelinterval = Get interval at time... 3 time
        vowelstart = Get start point... 3 vowelinterval
        vowelend = Get end point... 3 vowelinterval
        voweltime = vowelend-vowelstart
        voweltime = voweltime*1000

        ### Phonological context ###

        phoninterval = Get interval at time... 2 time
        phon$ = Get label of interval... 2 phoninterval

        ### Index depends on variable ###

        if variable$ = "ANLong"
            place = index (phon$, "2z:")
        elsif variable$ = "ANShort"
            place = index (phon$, "2a")
        elsif variable$ = "AMLong"
            place = index (phon$, "2A:")
        elsif variable$ = "AMShort"
            place = index (phon$, "2A")
        endif

        ### Preceeding vowel (may be in preceeding interval, if that is not empty) ###

        preceeding$ = mid$ (phon$, place-1, 1)

        if preceeding$ = "["
            phon2$ = Get label of interval... 2 phoninterval-1
    
            if phon2$ = ""
                preceeding$ = "Ø"
            else
                length = length (phon2$)
                preceeding$ = mid$ (phon2$, length-1, 1)
            endif
        endif


        ### Proceeding vowel (may be in proceeding interval, if that is not empty) ###

        if endsWith (variable$, "Long")
    
            proceeding$ = mid$ (phon$, place+3, 1)

            ### If the vowel has stød, the stød is not considered context ###

            if proceeding$ = "!"
                proceeding$ = mid$ (phon$, place+4, 1)
            endif
        
            if proceeding$ = "]"

                phon2$ = Get label of interval... 2 phoninterval+1

                if phon2$ = ""
                    proceeding$ = "Ø"
                else
                    proceeding$ = mid$ (phon2$, 2, 1)

                    if proceeding$ = "2"
                        proceeding$ = mid$ (phon2$, 3, 1)
                    endif
                endif
            endif

        elsif endsWith (variable$, "Short")

            proceeding$ = mid$ (phon$, place+2, 1)

            ### If the vowel has stød, the stød is not considered context ###

            if proceeding$ = "!"
                proceeding$ = mid$ (phon$, place+3, 1)
            endif
        
            if proceeding$ = "]"

                phon2$ = Get label of interval... 2 phoninterval+1

                if phon2$ = ""
                    proceeding$ = "Ø"
                else
                    proceeding$ = mid$ (phon2$, 2, 1)

                    if proceeding$ = "2"
                        proceeding$ = mid$ (phon2$, 3, 1)
                    endif
                endif
            endif
        endif

        ### Formant extraction ###

        select LongSound 'file$'

        Extract part... time-0.1 time+0.1 yes

        maxfreq = 4500
        bw = 1000


        ### Evaluate BandWidth of f1 and select candidate MaxFreq setting ###

        while maxfreq < 6000

            To Formant (burg)... 0 5 maxfreq 0.03 50
            bw1'maxfreq' = Get bandwidth at time... 1 time Hertz Linear
            bw2'maxfreq' = Get bandwidth at time... 2 time Hertz Linear
            bw'maxfreq' = bw1'maxfreq'+bw2'maxfreq'

            if bw'maxfreq' < bw
                bw = bw'maxfreq'
                freq = maxfreq
            endif

            Remove

            maxfreq = maxfreq + 100

            select Sound 'file$'
    
        endwhile

        ### Formant extraction - best candidate ###
    
        To Formant (burg)... 0 5 freq 0.03 50
    
        f1 = Get value at time... 1 time Hertz Linear
        f2 = Get value at time... 2 time Hertz Linear
        f3 = Get value at time... 3 time Hertz Linear
        bw1 = Get bandwidth at time... 1 time Hertz Linear
        bw2 = Get bandwidth at time... 2 time Hertz Linear
        bw3 = Get bandwidth at time... 3 time Hertz Linear
        Remove

        ### Formant extraction - default ###

        select Sound 'file$'

        To Formant (burg)... 0 5 defaultfreq 0.03 50
    
        f1d = Get value at time... 1 time Hertz Linear
        f2d = Get value at time... 2 time Hertz Linear
        f3d = Get value at time... 3 time Hertz Linear
        bw1d = Get bandwidth at time... 1 time Hertz Linear
        bw2d = Get bandwidth at time... 2 time Hertz Linear
        bw3d = Get bandwidth at time... 3 time Hertz Linear
        Remove

        select Sound 'file$'
        Remove

        ### Printout ###

        #fileappend L:\Korpus\vokaler\statistik\'file$'_'variable$'.csv 'file$';'year$';'decade$';'speaker$';'sex';'variable$';'preword$';'word$';'proword$';'preceeding$';'proceeding$';'voweltime:0';'freq';'bw1:0';'bw2:0';'bw3:0';'f1:0';'f2:0';'f3:0';'defaultfreq';'bw1d:0';'bw2d:0';'bw3d:0';'f1d:0';'f2d:0';'f3d:0''newline$'
        fileappend L:\Korpus\vokaler\statistik\AllFiles.csv 'file$';'year$';'decade$';'speaker$';'sex$';'variable$';'preword$';'word$';'proword$';'preceeding$';'proceeding$';'voweltime:0';'freq';'bw1:0';'bw2:0';'bw3:0';'f1:0';'f2:0';'f3:0';'defaultfreq';'bw1d:0';'bw2d:0';'bw3d:0';'f1d:0';'f2d:0';'f3d:0''newline$'

    endfor

    select LongSound 'file$'
    Remove
    select TextGrid 'file$'
    Remove
    select TextGrid 'filename$'
    Remove

endfor

A Praat script to assist manual coding of variables

## This script is used in coding for assimilated endings, but it could be modified to any other task that invoves
## a human evaluation of a sound extract.
##
## The script searches for words ending in certain strings of letters in adjectives and verbs 
## (i.e. words that are coded as of these Parts of Speech). If the string is found, the corresponding
## sound is extracted and played for the coder. When the coder has decided on the proper code, he or she
## enters it, and it is written to the TextGrid. The coder can listen to the extract any number of times,
## and cancel the task if in doubt.
## There is no "undo".
##
## A list of excluded words can be given in the txt file "ExcludedWords.txt"
##
## The script is written December 2011 by jthoegersen@hum.ku.dk and is GNU/GPL
##


# The coder initials are used to generate unique output tier names and output files from each coder

form Coding of assimilations
    comment Search criteria
    word Search_string
    comment Coder initials (in capitals)
    word Coder
endform



filename$ = selected$ ("TextGrid")


# A list of words that are to be omitted from the analysis can be generated as a txt file.

Read Strings from raw text file... C:\tmp\ExcludedWords.txt

Open long sound file... c:\tmp\'filename$'.wav


select TextGrid 'filename$'
tiers = Get number of tiers


# The script checks whether the output tier already exists (as the last tier) to avoid working on files that have already been coded once

lastTier$ = Get tier name... tiers

if lastTier$ = "Assimilation_'coder$'"
    beginPause ("Error!")
    comment ("The output tier already exists. Delete tier?")
    delete = endPause ("Yes", 0)

    if delete = 1
        Remove tier... tiers
    endif
    
endif


# The output tier is (re)generated

Insert interval tier... tiers+1 Assimilation_'coder$'

tiers = Get number of tiers


# "Intervals" are the intervals that are being analysed. Change the tier number if they are not in tier 1 

intervals = Get number of intervals... 1


# "Trials" is a counter of the number of times the coder listens before making a choice (i.e. a certainty check)

trials = 1


# Here is the search procedure proper.

for interval to intervals

    select TextGrid 'filename$'
    label$ = Get label of interval... 1 interval


# Look in the exclusion list for words that are omitted

    exclude = 0

    select Strings ExcludedWords
    strings = Get number of strings

    for string to strings

        string$ = Get string... 'string'

        if label$ = "'string$'"
            exclude = 1
        endif
    endfor


    select TextGrid 'filename$'

    if exclude = 0

        if endsWith (label$, "search_string$")


# "stem" is generated as the entire word minus the ending (the RegEx removes the search string only at the end of the word ($)).

            stem$ = replace_regex$ ("'label$'", "'search_string$'$", "", 1)

            call assimilations

        endif
    endif
endfor

###

# Cleanup after all intervals have been checked

select LongSound 'filename$'
Remove
select Strings ExcludedWords
Remove
select TextGrid 'filename$'
Save as text file... c:\tmp\output\'filename$'_'search_string$'_'coder$'.TextGrid


#################################

procedure assimilations


# Part-of-speech is included as an additional search criteria

pos_label$ = Get label of interval... 5 interval

if index_regex("'pos_label$'", "(ADJ|V_PRES|V_PAST|V_PARTC_PAST)") > 0


# Timecodes for extraction of sound (including a 25 ms buffer) and for the placement of the output interval in the output tier

    start = Get starting point... 1 interval
    end = Get end point... 1 interval
    endCut = 'end'+0.025
    startCut = 'start'-0.025


# The boundaries of the interval of the output tier in which the code is written, is generated. There is a small work-around
# because Praat will not set a boundary at the very beginning of a file (where there is already a default boundary). If one has
# search strings that may appear in the very last interval of the tier, something similar must be written to avoid writing "end"
# boundaries in the last interval.

    stringIntervals = Get number of intervals... tiers

    if stringIntervals > 1

        tEndBoundary = Get end point... tiers stringIntervals-1

        if tEndBoundary <> start
            Insert boundary... tiers start
        endif

    elsif stringIntervals = 1

        Insert boundary... tiers start

    endif

    Insert boundary... tiers end
    
    select LongSound 'filename$'

    Extract part... startCut endCut no
    Play

######

# A pause prompt asks for coder's input. In this case, the coder has to choose between two different orthogrphical forms
# distinguished by the ending, and pronounced as but coders could equally well be asked to hear "assimilated" vs. "non-assimilated", "stop"
## vs. "fricative" etc.
# The "error" button is used if the script proposes a candidate word that shouldn't be analysed. (The script editor should search the
# output tier for "N/A"s and potentially add the words to the "ExcludedWords" list).

    beginPause ("What do you hear?")
    comment ("Is the word 'stem$'et or 'stem$'ede?")
    endelse = endPause("-et", "-ede", "Listen again", "Error!", 3)

    if endelse <> 3

        select TextGrid 'filename$'

        tttInterval = Get interval at time... tiers start


# The output label, of course, has to be adjusted to the individual task. Potentially one could just use "1", "2" and "3".
# The number of listens is also written to the code, and is immediately reset to 1.

        if endelse = 1
            Set interval text... tiers tttInterval \dh'tab$''trials'
            trials = 1
        elsif endelse = 2
            Set interval text... tiers tttInterval \dh\sw'tab$''trials'
            trials = 1
        elsif endelse = 4
            Set interval text... tiers tttInterval N/A'tab$''trials'
            trials = 1
        endif


# If the coder wishes to listen again, 1 is added to the number of listens, boundaries are deleted (they will be written again immediately,
# and the loop is sent back to the same interval once again.
            
    elsif endelse = 3
                
        select TextGrid 'filename$'

        Remove boundary at time... tiers start
        Remove boundary at time... tiers end

        interval = interval - 1

        trials = trials + 1

    endif

    select Sound 'filename$'
    Remove

endif

endproc