Считайте метки TextGrid в объект Strings в Praat

Я застрял, пытаясь понять, как читать строки из текстовой сетки, которая открыта в окне, но не сохраняется на жестком диске в виде необработанного текстового файла. Моя цель - манипулировать строками и сохранить их позже.

Я хочу сделать что-то подобное, но не совсем понимаю, как будет работать синтаксис.

tG$ = selectObject: selected$("TextGrid")
stringID = Read Strings from tG

numberOfStrings = Get number of strings
for stringNumber from 0 to numberOfStrings
    selectObject: stringID
    line$ = Get string: stringNumber
...

person badner    schedule 25.01.2017    source источник


Ответы (2)


Вам нужно перебрать интервалы в TextGrid и использовать appendFileLine для вывода меток в текстовый файл. Например:

# Your need to select the TextGrid manually, and it has only one tier (tier number 1)

outputFile$ = "~/Desktop/output.txt"

writeFile: outputFile$, ""                        ; start from an empty .txt

numberOfIntervals = Get number of intervals: 1    ; (this is tier 1)

for interval to numberOfIntervals
    label$ = Get label of interval: 1, interval
    if label$ != ""                               ; (we just want non-empty intervals)
        xmin = Get start time of interval: 1, interval
        xmax = Get end time of interval: 1, interval
        appendFileLine: outputFile$, "'label$''tab$''xmin''tab$''xmax'"
    endif
endfor

Этот скрипт выведет файл .txt со значениями, разделенными табуляцией: label, xmin, xmax. Вы можете изменить аргументы appendFileLine в соответствии с вашими потребностями (tab$ — это предопределенная переменная, которая является... вкладкой).

person Stefano    schedule 26.01.2017
comment
да это здорово. Однако моя проблема заключается в том, как на самом деле ПОЛУЧИТЬ строки TG и как выбрать объект в окне. Я не думаю, что мой код, который я вставил сюда, работает, потому что мне чего-то не хватает в том, как это сделать. - person badner; 26.01.2017
comment
Я получаю: нет объекта с именем audio1. Формула не работает. Строка скрипта 8 не выполнена или не завершена: « tG$ = selectObject: selected$(TextGrid) » Команда меню Выполнить не завершена - person badner; 26.01.2017
comment
это потому, что у меня есть выбранная Textgrid с именем audio1, но она должна каким-то образом войти в часть selected$. - person badner; 26.01.2017
comment
Я не уверен, что понимаю, что именно вы должны сделать. Если, когда вы говорите получить строки tg, вы имеете в виду получение меток интервалов tg, это то, что делает приведенный выше скрипт. Если вместо этого вы имеете в виду фактические строки в необработанном файле TG, вам нужно сначала сохранить файл TG в обычный текстовый файл, а затем прочитать его с помощью Read Strings from raw text file. - person Stefano; 26.01.2017
comment
Какова ваша конкретная цель? - person Stefano; 26.01.2017
comment
в яблочко. Возможно, моя терминология неверна, но я хочу получить временные метки xmin и xmax для каждого элемента телефона на уровне и сохранить эту информацию в переменных для каждого элемента на уровне. - person badner; 26.01.2017
comment
Я хочу сохранить отредактированные метки времени, открытые в окне, в новый файл, который не является текстовой сеткой. - person badner; 26.01.2017
comment
Затем вы должны использовать встроенные функции Get start time of interval и Get end time of interval, не нужно читать из сырого TG. :) Я могу обновить код выше, если хотите. Надеюсь, я понял, что вам нужно сделать! - person Stefano; 26.01.2017
comment
Пожалуйста, сделай! Ты далеко впереди меня. Спасибо! - person badner; 26.01.2017
comment
вы говорите, что выбрана текстовая сетка, но я все еще получаю сообщение об ошибке. Я думаю, что что-то не так с моим синтаксисом в tG$ = selectObject: selected$(TextGrid) - person badner; 26.01.2017
comment
Я смог исправить это следующим образом: selectObject: 2 Я думаю, что есть лучший способ сделать это автоматически, не зная номера объекта. В идеале я хотел бы найти первую текстовую сетку в списке, но пока это работает - person badner; 26.01.2017

Метки TextGrid нельзя напрямую преобразовать в объект Strings, поскольку, в отличие от объектов TextGrid, объекты Strings не имеют уровней. Таким образом, у вас может быть код, который берет все метки определенного уровня в TextGrid и помещает их в объект Strings.

0. Создание пустого Strings

Проблема здесь в том, что Праат не хочет, чтобы вы сами заполняли объект Strings, поэтому Create empty Strings... нет. Однако вы можете подорвать одну из существующих команд, чтобы сделать это:

Create Strings as tokens: ""

1. Перемещение меток к объекту Strings

Теперь, когда у нас есть пустой Strings для заполнения, мы можем приступить к работе:

procedure labelsToStrings: .tier
  .textgrid = selected("TextGrid")

  # Make sure this works with interval and point tiers
  .item$ = if do("Is interval tier...", .tier) then
    ... "interval" else "point" fi

  # Make the empty Strings
  .strings = Create Strings as tokens: ""
  Rename: selected$("TextGrid")

  # Fetch each label, and insert it to the Strings object
  selectObject: .textgrid
  .n = do("Get number of " + .item$ + "s...", .tier)
  for .i to .n
    selectObject: .textgrid
    .label$ = do$("Get label of " + .item$ + "...", .tier, .i)

    # I assume you don't care about empty labels?
    if .label$ != ""
      selectObject: .strings
      Insert string: 0, .label$
    endif
  endfor

  # Make sure the new object is selected
  selectObject: .strings
endproc

2. Прибыль!

Вы можете попробовать:

synth = Create SpeechSynthesizer: "English", "default"
To Sound: "This is some text.", "yes"
sound    = selected("Sound")
textgrid = selected("TextGrid")

selectObject: textgrid
@labelsToStrings: 4

removeObject: sound, synth
View & Edit

3. Бонус

Если вы заинтересованы в получении всех меток в более управляемом пакете, вам также может быть интересна команда Index specified labels... из tgutils plugin, который я тоже написал. (Я знаю: я отлично умею называть вещи).

Этот делает что-то похожее на это, но вместо использования объекта Strings он сбрасывает все метки в Table, а также метку времени точек или начало и конец интервалов. И вы также можете указать подмножества меток, чтобы рассмотреть возможность использования буквального соответствия или регулярного выражения.

С его помощью вы можете переписать @labelsToStrings так:

procedure labelsToStrings: .tier
  .name$ = selected$("TextGrid")

  runScript: preferencesDirectory$ + "/plugin_tgutils/scripts/" +
    ... "index_specified_labels.praat", .tier, ".+", "yes"
  .table = selected("Table")

  Create Strings as tokens: ""
  Rename: .name$
  for .i to Object_'.table'.nrow
    .label$ = Object_'.table'$[.i, "label"]
    Insert string: 0, .label$
  endfor
  removeObject: .table
endproc
person jja    schedule 27.01.2017