Обнаружение скрытых эмоций в голосе [Евгений Столов] (fb2) читать постранично, страница - 5


 [Настройки текста]  [Cбросить фильтры]

объясним тонкости, связанные с измерением этого параметра. В качестве примера рассмотрим цифровой образ слога „ka“.



При произнесении звука „k“ голосовые связки закрыты и напряжены, а поток воздуха из лёгких связки раскрывает. В результате возникает поток повышенного давления воздуха (вспышка), за которой следует поток малого давления, представленный на рисунке в виде шума. При произнесении слога „ka“ голосовой аппарат перестраивается на произнесение звука „A“, для чего требуется время установления. Если посмотреть на участок, относящийся к „A“, то можно заметить, что он имеет почти периодический характер. Частота этого сигнал и есть частота основного тона, или форманта F0.

Форма сигнала для других гласных звуков будет другой, и частота будет зависеть от гласного. Сигнал зависит от напряжения голосовых связок. При прохождении воздушного потока через вибрирующие связки образуются вихри, которые и определяют основную форму сигнала. Дополнительный вклад вносят фильтры, образованные ротовой полостью. Форманта F0 легко находится с помощью стандартной функции fft, если удалось выделить участок файла, относящийся к гласному звуку. Пусть K — номер коэффициента Фурье с максимальной мощностью, Fr частота стробирования сигнала, Len длина интервала, для которого найдены коэффициенты. Тогда F0= K*Fr/Len. Принцип измерения F0 остается прежним для всех гласных.

from scipy.fftpack import fft

from scipy import signal as sgn

[Fr,Dat] = read('Sounds/A.wav')

N =len(Fragm)

Wnd = sgn.windows.hann(N)

Fragm1 — = np.mean(Fragm)

Afft = abs(fft(Fragm1*Wnd))

Ind =np.argmax(Afft)

print('F0=',Ind*Fr/N)

Когда имеют дело с реальной речью, отмеченные голосовые (вокализованные) участки можно обнаружить, но они будут гораздо короче по сравнению с модельными. Возникает очевидная трудность — обнаружение фрагментов в файле, относящихся к чистым гласным. При анализе реальной речи это можно сделать, но задача становится трудоемкой. Вместо этого вычисляют усредненный коэффициент так, как указано выше. Альтернативой преобразованию Фурье для вычисления F0 является автокорреляция. На участках большой длины оба метода приводят к похожим результатам.

Мел-кепстральные коэффициенты

Частота основного тона является разновидностью спектральных характеристик. В настоящее время считается, что наиболее точной сжатой спектральной характеристикой являются мел-кепстральные коэффициенты (MFCC). Идея кепстра достаточно проста. Предположим, что нам нужно краткое описание преобразования Фурье заданного отрезка. Первое, что приходит в голову, применить к этому преобразованию снова преобразование Фурье и оставить лишь несколько коэффициентов. Особенностью преобразования Фурье является то, что в результате мы снова получим исходный отрезок. Чтобы избавиться от такого результата, сначала к преобразованию Фурье применяется логарифм, а уже после этого — обратное преобразование Фурье. Идея оказалась очень плодотворной, поскольку попутно удалось решить и другие задачи. Мел-кепстральные коэффициенты получаются после того, как кепстр применяется не к самому отрезку файла, а к результатам фильтрации исходного отрезка с помощью специальной гребенки фильтров. Для вычисления этих коэффициентов имеется функция в пакете librosa. Эти коэффициенты можно использовать для получения характеристик фрагмента, однако, следует учесть, что это весьма затратная с точки зрения времени операция.

Сравнение кривых

До сих пор мы имели дело с отдельными значениями параметров. Ниже будут рассмотрены параметры, представленные в виде кривых. Возникает вопрос, каким образом сравнивать две кривые, чтобы определить их взаимную близость.

Разложение по ортогональному базису

Пусть заданы две кривые, определенные функциями F(t),G(t). Выбираем ортонормированный базис и оставляем заданное число M коэффициентов. В качестве примера такого разложения можно взять преобразование Фурье или дискретное косинус преобразование. Этот подход хорош, когда совпадают области определения обеих функций. Если же они разнятся (имеют разные длины), то для сравнения понадобятся дополнительные манипуляции с коэффициентами.

Квантили

Существует другой подход, основанный на квантилях, свободный от указанного выше недостатка и требующий минимальных вычислений. С этой целью исходные функции нормируются таким образом, чтобы их область значений заполняла интервал [0,1]. После этого выбирается набор квантилей в качестве вектора характеристик функций. Квантили зависят только от области значений, поэтому зависимость от длины интервалов, на которых определены функции, сводится к минимуму.

def getQuant(Wave,Intervs):

'''Standard quaniles normalized by the maximum of wave

'''

Wave = np.float32(Wave)

Wave /= max(Wave)

Quant = np.quantile(Wave,Intervs)

return np.float32(Quant)

Применим квантили для сравнения формы двух