Как автоматизировать голосовые отчеты для Praat

Есть ли способ автоматизировать создание голосового отчета (в разделе "Импульсы" в окне "Просмотр и редактирование") для Praat, поскольку я должен сделать это для более чем 100 файлов. Мне нужен голосовой отчет для всего файла, и в идеале я бы делал это на Python, поскольку я знаком с этим.

2 ответа

[Отказ от ответственности: я являюсь автором упомянутой библиотеки Parselmouth]

В зависимости от вашей реальной цели, вы можете получить тот же вывод "Голосовой отчет" за пределами меню редактора звука (открывается с помощью View & Edit): выберите звуковой объект, проанализируйте его высоту (выберите Soundнажмите Analyse periodicity > To Pitch...) и импульсы (выберите Sound а также Pitch объекты, нажмите To PointProcess (cc)). Затем выбираем все 3 объекта (Sound, Pitch, PointProcess) и действие Voice report... позволит вам получить вывод.

Это работает даже в пакетной версии Praat (т.е. без графического интерфейса пользователя). Я не эксперт в написании сценариев Praat, но преобразование этого рабочего процесса кажется достаточно простым.

Что касается другой части вашего вопроса: сделать это на Python на самом деле возможно с библиотекой Parselmouth. Это библиотека с открытым исходным кодом, которую я создавал, которая позволяет получить доступ к Praat из Python интуитивно понятным для Python способом:

import parselmouth
sound = parselmouth.Sound("the_north_wind_and_the_sun.wav")
pitch = sound.to_pitch()
pulses = parselmouth.praat.call([sound, pitch], "To PointProcess (cc)")
voice_report_str = parselmouth.praat.call([sound, pitch, pulses], "Voice report", 0.0, 0.0, 75, 600, 1.3, 1.6, 0.03, 0.45)

Для некоторых вещей существуют методы Python на объектах, для некоторых других функций вам нужно будет использовать parselmouth.praat.call пока больше не будет сделано работы над библиотекой. Но это работает с Python.

Однако, если вас интересует только часть голосового отчета и вы хотите получить их как фактические числовые переменные (например, потому что вы хотите запустить некоторую статистику для всех 100 файлов?), Ко всем этим вещам можно получить доступ независимо от Voice report функциональность. Например, чтобы получить только среднюю высоту звука определенного звукового файла как Python float:

mean_pitch = parselmouth.praat.call(pitch, "Get mean", 0.0, 0.0, "Hertz")

Голосовой отчет является командой редактора и поэтому не будет доступен в пакетных экземплярах Praat. Вам понадобится экземпляр Praat, который подключен к графическому интерфейсу (в противном случае вы получите Cannot view or edit a Sound from batch ошибка).

Я не знаком с текущими библиотеками, специфичными для Python, поэтому не знаю, есть ли такая, которая может обойти эту проблему (я сомневаюсь в этом). Тем не менее, вы можете избежать этого, используя sendpraat для процедурного управления удаленным экземпляром Praat, который, в свою очередь, может быть подключен к графическому интерфейсу. Посмотрите этот ответ для получения дополнительной информации о том, как это будет работать.

Ниже вы можете найти ответ, используя язык сценариев в самом Praat. Это может быть помещено в скрипт и выполнено как системная команда (или отправлено с использованием sendpraat) с любого языка, который вы предпочитаете.

form Voice report...
  positive F0_min 50
  positive F0_max 500
endform

sound = selected("Sound")
end = Get total duration

View & Edit
editor: sound
  # Optimise settings for voice research 
  # and make sure things are turned on
  Pitch settings: f0_min, f0_max, 
    ... "Hertz", "cross-correlation", "automatic"
  info$ = Editor info
  if !extractNumber(info$, "Pulses show:")
    Show pulses
  endif

  Select: 0, end
  report$ = Voice report
endeditor

# Remove header from report
# This leaves text that is parsable as YAML
report$ = replace_regex$(report$, "-- Voice report .*\n", "", 1)
report$ = replace_regex$(report$, "\nTime range .*\n", "", 1)
report$ = replace_regex$(report$, "\s*From 0 to .*\n", "", 1)

writeInfoLine: report$

Голосовой отчет (как и большинство выходных данных от Praat) в первую очередь предназначен для использования людьми, и поэтому его нетрудно проанализировать на машине. Я добавил несколько дополнительных команд для предварительной обработки голосового отчета в своем ответе, чтобы сделать вывод, по крайней мере, анализируемым YAML, что может упростить ситуацию в вашем случае.

Другие вопросы по тегам