Скрипты Praat: извлечение слогового уровня вместе с акцентным уровнем с дополнительными изменениями
Я хочу извлечь слоги вместе с соответствующими акцентами. Если у слога нет ударения, на части ударения будет "нет".
Мой пример кодирования выглядит так:
writeInfo: ""
selectObject: "TextGrid example"
# syllable tier is 1
# accent tier is 2
number = Get number of intervals: 1
for i from 1 to number
syllable$ = Get label of intervals: 1, i
# It seems to be not possible to get time of interval
# I want to get the time of the whole interval, like it's done with points
syllable_time = Get time of interval: 1, i
accent = Get point at time: 2, syllable_time
accent$ = Get label of point: 2, accent
#if no accent$
#appendInfoLine syllable$, " ", "no"
#elif accent$ <> "-" and accent$ <> "%"
#appendInfoLine syllable$, " ", accent$
#endif
endfor
Результат должен выглядеть так:
"de:6 no
I no
"Ra:n H*L
"vIl no
"an no
"zaI no
n@m no
a: no
"tOm H*
Добавление
Слои 1 и 2:
2 ответа
Решение
Вы можете сделать это в несколько шагов. Сначала добавьте дополнительный 'no'
к слою 2:
#Select TexGrid
selectObject: 1
number = Get number of intervals: 1
for i from 1 to number
time_start = Get start point: 1, i
#time_end = Get end point: 1, i
name$ = Get label of interval: 1, i
point$ = Get label of point: 2, i
Insert point: 2, time_start, "no"
endfor
Затем извлеките информацию из слоя 2 и сохраните ее в файл:
#Select TextGrid
selectObject: 1
number = Get number of points: 2
for n from 1 to number
accent_time = Get time of point: 2, n
syllable = Get interval at time: 1, accent_time
syllable$ = Get label of interval: 1, syllable
accent$ = Get label of point: 2, n
writeFileLine: "myFile.txt", accent$
endfor
В качестве последнего шага, вам нужно удалить эти дополнительные 'no'
Это из вашего результата. Давайте сделаем это в Python (упомяните все ваши формы шага, чтобы программа знала, от каких линий вы хотите избавиться):
fo = open("myFile.txt", "r")
st = fo.read();
lis = st.split()
fo.close()
for i, choice in enumerate(lis):
if choice == 'H*L' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'H*' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L*H' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L%' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'H%' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L*' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '!H*L' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '!H*' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'H*L?' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '..L' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L*HL' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '*?' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L*H?' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'H*?' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '..H' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L*?' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '!H' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'H!' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'HH*L' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '!H*L?' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == '.L' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L*!H' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'L*HL?' and lis[i-1] == 'no':
lis.pop(i-1)
elif choice == 'LH*L' and lis[i-1] == 'no':
lis.pop(i-1)
with open("output.txt", "w") as my_file:
for i in lis:
my_file.write(i + "\n")
К сожалению, раньше это делалось в качестве интервала для уровня 2. Теперь как пункт уровня:
objName$ = selected$ ("Sound")
select TextGrid 'objName$'
intervals_1 = Get number of intervals: 1
intervals_2 = Get number of points: 2
for i from 1 to intervals_1
syl_1$ = Get label of interval: 1, i
start_1 = Get start point: 1, i
end_1 = Get end point: 1, i
for j from 1 to intervals_2
syl_2$ = Get label of point: 2, j
time = Get time of point: 2, j
if syl_1$ != "" and syl_2$ != "" and time > start_1 and time < end_1
printline 'syl_1$' 'syl_2$'
endif
endfor
endfor