Я пытаюсь выяснить, как определить количество слогов в корпусе аудиозаписей. Я думаю, что хороший прокси может быть пиками в волновом файле.
Вот то, что я попробовал с файлом моего разговора на английском языке (мой фактический случай использования на кисуахили). Стенограмма записи этого примера: «Я пытаюсь использовать функцию таймера. Я смотрю на паузы, вокализации». Всего в этом отрывке 22 слога.
WAV-файл: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
seewave
Пакет в R велик, и есть несколько потенциальных функций. Перво-наперво, импортируйте файл волны.
library(seewave)
library(tuneR)
w <- readWave("YOURPATHHERE/test.wav")
w
# Wave Object
# Number of Samples: 278528
# Duration (seconds): 6.32
# Samplingrate (Hertz): 44100
# Channels (Mono/Stereo): Stereo
# PCM (integer format): TRUE
# Bit (8/16/24/32/64): 16
Первое, что я попробовал, была timer()
функция. Одна из вещей, которую он возвращает, - это продолжительность каждой вокализации. Эта функция идентифицирует 7 вокализаций, что намного меньше 22 слогов. Быстрый взгляд на сюжет показывает, что вокализации не равны слогам.
t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7
Я также попробовал функцию fpeaks без установки порога. Вернулось 54 пика.
ms <- meanspec(w)
peaks <- fpeaks(ms)
Это отображает амплитуду по частоте, а не по времени. Добавление порогового параметра, равного 0,005, отфильтровывает шум и уменьшает счет до 23 пиков, что довольно близко к фактическому количеству слогов (22).
Я не уверен, что это лучший подход. Результат будет чувствителен к значению параметра threshold, и мне придется обрабатывать большой пакет файлов. Есть лучшие идеи о том, как кодировать это, чтобы обнаружить пики, которые представляют слоги?
источник
changepoint
пакета. Проще говоря, анализ точек изменения фокусируется на обнаружении изменений, связанный пример касается торговых данных, но было бы интересно применить эту технику к звуковым данным.Ответы:
Я не думаю, что последующее является лучшим решением, но у @ eipi10 было хорошее предложение проверить этот ответ на CrossValidated . Так я и сделал.
Первым шагом является создание
argmax
функции:Я внес небольшие изменения в
test
функцию построения графиков: (а) для явного определения x и y и (b) для отображения количества пиков:Как и
fpeaks
подход, о котором я упоминал в своем первоначальном вопросе, этот подход также требует значительных настроек. Я не буду знать «правильный» ответ (т. Е. Количество слогов / пиков), поэтому я не уверен, как определить правило принятия решения.На данный момент
fpeaks
мне кажется немного менее сложным, но все же не удовлетворяющим.источник
loess
я не вижу аргументов, явно приведенных для степени сглаживания. На самом деле, нет смысла бегать по лессу через движущееся окно: оно уже делает это внутри.w
был аргумент в сглаживании. Вот как автор оригинального решения описал функцию: «Есть два параметра, которые должны быть настроены в зависимости от обстоятельств: w - это полуширина окна, используемого для вычисления локального максимума ... Другой - в данном случае не явный code - это аргумент span сглаживания лесса ".w
качестве одного из параметров, потому что он имел в виду очень общий подход, при котором сглаживатель может не быть лессом, но, возможно, будет оконным медианой, или Хеннингом, или чем-то еще, что считается подходящим для статистического поведения данных и Задачи аналитика. Свойства многих из этих сглаживателей будут зависеть от ширины окна.У меня были похожие проблемы при анализе профилей электрофореза белка. Я решил их, применив некоторые функции пакета msprocess R ко вторым производным профилей (см. Https://fr.wikipedia.org/wiki/D%C3%A9pouillement_d 'une_courbe # Position_et_hauteur_du_pic). Это было опубликовано здесь: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract;jsessionid=8EE0B64238728C0979FF71C576884771.f02t03
Я понятия не имею, может ли подобное решение работать на вас. Удачи
источник
Вот библиотека на Python, которую я использовал ранее, пытаясь оценить периодичность путем нахождения пиков в функции автокорреляции.
Он использует разности первого порядка / дискретные производные для обнаружения пиков и поддерживает настройку по пороговым параметрам и параметрам минимального расстояния (между последовательными пиками). Можно также улучшить разрешение пика, используя гауссову оценку плотности и интерполяцию (см. Ссылку).
Он работал довольно хорошо для меня без особых настроек, даже для шумных данных. Попробуйте.
источник
Я хотел бы предложить решение с использованием
changepoint
пакета. В приведенном ниже упрощенном примере делается попытка идентифицировать пики, определенные здесь как точки изменения, путем просмотра одного канала из доступных данных.пример
Источник данных
Подготовка данных
Диаграмма, сгенерированная посредством
plot.ts
звонка:Анализ изменений
changepoint
Пакет предоставляет ряд опции для идентификации изменения / пиков в данных. Приведенный ниже код предоставляет только простой пример поиска 3 пиков с помощью метода BinSeg :Полученный график: Также возможно получить значения:
Примечания стороны
Приведенный пример в основном касается иллюстрации того, как анализ точек изменения может быть применен к предоставленным данным; следует соблюдать осторожность в отношении параметров, передаваемых в
cp.var
функцию. Подробное описание пакета и доступных функций приведено в следующей статье:Killick, Rebecca and Eckley, Idris (2014) точка изменения: пакет R для анализа точек изменения. Журнал статистического программного обеспечения, 58 (3). С. 1-19.
ecp
ecp
Стоит отметить еще один пакет R.ecp
Облегчает предприятие непараметрический многомерный анализ точки изменения, которые могут быть полезны , если хотелось бы , чтобы идентифицировать точки изменения , происходящие по нескольким каналам.источник