Как стать автором
Обновить

Анализ аудиоданных (часть 2)

Время на прочтение7 мин
Количество просмотров13K

В первой части анализа аудиоданных мы рассмотрели характеристики, которые есть у каждого аудиосигнала.

Анализ аудиоданных (часть1).

Характеристики аудиофайлов для разных аудио записей.

В наборе аудиоданных есть Human files - 10322 файла ( записи “живого” голоса (класс 1)) и Spoof files - 39678 файлов ( записи синтетического/конвертированного/перезаписанного голоса (класс 2)) . В одном аудиофайле (3 - 6 сек) голос мужской или женский что-то говорит на каком-то языке (английском, русском, немецком, китайском)

Вот так выглядят характеристики аудиофайлов для разных аудио записей:

характеристики аудиофайлов  для разных аудио записей
характеристики аудиофайлов для разных аудио записей
характеристики аудиофайлов  для разных аудио записей
характеристики аудиофайлов для разных аудио записей
характеристики аудиофайлов  для разных аудио записей
характеристики аудиофайлов для разных аудио записей

Выбор характеристик для извлечения из аудиофайла.

Каждый исследователь выбирает свои характеристики для извлечения из аудиофайла.

Мы разберем относительно простой и более быстрый способ классификации аудиофайлов - алгоритм машинного обучения - SVM (Support Vector Machines) / машины опорных векторов. ( Подробно разберем в третьей части анализа аудиоданных).

А для этого нам нужно извлечь значимые характеристики и преобразовать их в структурированные данные - в двухмерную таблицу, состоящую из столбцов и строк с помощью библиотеки Pandas. Эта таблица называется фреймом данных - Dataframes.

Из значимых характеристик я выбрала:

  • Средние значения и стандартные отклонения Мел-кепстральных коэффициентов ( по 20 значений);

  • Среднее значение, стандартное отклонение и skew (наклон) Спектрального центроида

  • Среднее значение и стандартное отклонение Спектрального спада;

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

Мел-кепстральные коэффициенты — один из важнейших признаков в обработке аудио. MFCC — это матрица значений, которая захватывает тембральные аспекты. Мел - это единица высоты звука, это та же частотная ось, только выражается в Мелах, вместо Герц. Кепстр - это акустическая волна (параметры голосового тракта, тоновые сигналы, шумы и фильтры).

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

Частотные характеристики речи:

  • частота основного тона;

  • период основного тона (мс);

  • количество побочных гармоник (формантных областей);

  • нижняя частота спектра;

  • верхняя частота спектра;

  • частотный диапазон;

  • частота максимального уровня спектральной плотности

Временные характеристики речи:

  • длительность звука речи (мс);

  • длительность пауз речи между словами (мс);

  • длительность пауз речи между фразами (мс);

  • скорость звуков речи (звуков/с);

  • темп речи (слов/мин);

  • плотность речи (%) – отношение времени наличия звука к полному времени речевого сигнала;

  • скорость изменения уровня громкости основного тона (дБ/с);

  • скорость изменения частоты основного тона (Гц/с).

Вот так выглядят Мел-кепстральные коэффициенты:

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

Мел-кепстральные коэффициенты (MFCC) в виде массива numpy:

Мел-кепстральные коэффициенты (MFCC) в виде массива numpy
Мел-кепстральные коэффициенты (MFCC) в виде массива numpy

Для каждого аудиофайла свои Мел-кепстральные коэффициенты. Это хорошо видно, если рассмотреть Мел-кепстральные коэффициенты в виде массива numpy. Все коэффициенты разные.

Средние значения и стандартные отклонения Мел-кепстральных коэффициентов

Давайте посмотрим, как выглядят Средние значения и стандартные отклонения Мел-кепстральных коэффициентов в виде двухмерной таблицы (Dataframes), состоящей из столбцов и строки и в виде графика.

# Feature Generation
# MFCCs
mfccs_mean=np.mean(mfccs,axis=1)
mfccs_std=np.std(mfccs,axis=1)

coeffs=np.arange(0,20)
plt.figure(figsize=(15,5))
plt.title('Mean MFCCs')
sns.barplot(x=coeffs,y=mfccs_mean)

plt.figure(figsize=(15,5))
plt.title('SD MFCCs')
sns.barplot(x=coeffs,y=mfccs_std)
# Generate the chroma Dataframe
mfccs_df=pd.DataFrame()
for i in range(0,20):
    mfccs_df['mfccs_mean_'+str(i)]=mfccs_mean[i]
for i in range(0,20):
    mfccs_df['mfccs_std_'+str(i)]=mfccs_mean[i]
mfccs_df.loc[0]=np.concatenate((mfccs_mean,mfccs_std),axis=0)
mfccs_df
Средние значения и стандартные отклонения Мел-кепстральных коэффициентов  по 20 значений         (human_00004.wav  - мужской голос, английский язык)
Средние значения и стандартные отклонения Мел-кепстральных коэффициентов по 20 значений (human_00004.wav - мужской голос, английский язык)
Средние значения и стандартные отклонения Мел-кепстральных коэффициентов  по 20 значений                   (spoof_00031.wav - перезаписанный женский голос, английский язык)
Средние значения и стандартные отклонения Мел-кепстральных коэффициентов по 20 значений (spoof_00031.wav - перезаписанный женский голос, английский язык)

Спектральный центроид - Spectral Centroid

Спектральный центроид относится к спектральным (частотным) признакам. Спектральные характеристики всех звуковых сигналов определяются с помощью двух зависимостей:

  • зависимость амплитуды от времени

  • зависимость амплитуды от частоты Спектральный центроид указывает, на какой частоте сосредоточена энергия спектра ( энергия напряжения) или, другими словами, указывает, где расположен “центр масс” для звука.

Вот так выглядит Спектральный центроид:

Спектральный центроид
Спектральный центроид

Среднее значение, стандартное отклонение и skew (наклон) Спектрального центроида;

# Spectral Features
# Spectral Centroid

cent_mean=np.mean(cent)
cent_std=np.std(cent)
cent_skew=scipy.stats.skew(cent,axis=1)[0]
print('Mean: '+str(cent_mean))
print('SD: '+str(cent_std))
print('Skewness: '+str(cent_skew))
Среднее значение, стандартное отклонение и skew (наклон) Спектрального центроида;    (human_00004.wav  - мужской голос, английский язык)
Среднее значение, стандартное отклонение и skew (наклон) Спектрального центроида; (human_00004.wav - мужской голос, английский язык)
Среднее значение, стандартное отклонение и skew (наклон) Спектрального центроида;                  (spoof_00031.wav - перезаписанный женский голос, английский язык)
Среднее значение, стандартное отклонение и skew (наклон) Спектрального центроида; (spoof_00031.wav - перезаписанный женский голос, английский язык)

Спектральный спад - Spectral Rolloff

Спектральный спад относится к спектральным (частотным) признакам. Это мера формы сигнала, представляющая собой частоту, в которой высокие частоты снижаются до 0. Чтобы получить ее, нужно рассчитать долю элементов в спектре мощности, где 85% ее мощности находится на более низких частотах.

Вот так выглядит Спектральный спад:

Спектральный спад
Спектральный спад

Среднее значение и стандартное отклонение Спектрального спада;

# Spectral Rolloff
rolloff_mean=np.mean(rolloff)
rolloff_std=np.std(rolloff)
rolloff_skew=scipy.stats.skew(rolloff,axis=1)[0]
print('Mean: '+str(rolloff_mean))
print('SD: '+str(rolloff_std))
print('Skewness: '+str(rolloff_skew))
Среднее значение и стандартное отклонение Спектрального спада;         (human_00004.wav  - мужской голос, английский язык)
Среднее значение и стандартное отклонение Спектрального спада; (human_00004.wav - мужской голос, английский язык)
Среднее значение и стандартное отклонение Спектрального спада;      (spoof_00031.wav - перезаписанный женский голос, английский язык)
Среднее значение и стандартное отклонение Спектрального спада; (spoof_00031.wav - перезаписанный женский голос, английский язык)

Извлечение значимых характеристик

Для извлечения необходимо импортировать библиотеки Python:

import librosa
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import os
import pathlib
import csv


import warnings
warnings.filterwarnings('ignore')

Из всех аудиофайлов в наборе данных с помощью библиотеки librosa - librosa.feature, метода append( ) и метода extend( ) проводим:

  • Извлечение из Мел-кепстральных коэффициентов - средние значения и стандартные отклонения (по 20 значений);

  • Извлечение из Спектрального центроида - среднее значение, стандартное отклонение и skew (наклон);

  • Извлечение из Спектрального спада - среднее значение и стандартное отклонение;

Извлечение значимых характеристик:

def extract_features(directory, file):
    name = f'{directory}/{file}'
    y, sr = librosa.load(name, mono=True, duration=5)
    
    features = [] 
    features.append(file) # filename
    features.extend([np.mean(e) for e in librosa.feature.mfcc(y=y, sr=sr, 
                                                              n_mfcc=20)])  # mfcc_mean<0..20>
    features.extend([np.std(e) for e in librosa.feature.mfcc(y=y, sr=sr,
                                                             n_mfcc=20)])   # mfcc_std
    features.append(np.mean(librosa.feature.spectral_centroid(y=y, sr=sr).T,
                            axis = 0)[0])     # cent_mean
    features.append(np.std(librosa.feature.spectral_centroid(y=y,sr=sr).T,
                           axis = 0)[0])       # cent_std
    features.append(scipy.stats.skew(librosa.feature.spectral_centroid(y=y,sr=sr).T,
                                     axis = 0)[0])    # cent_skew
    features.append(np.mean(librosa.feature.spectral_rolloff(y=y, sr=sr).T, 
                            axis = 0)[0])      # rolloff_mean
    features.append(np.std(librosa.feature.spectral_rolloff(y=y, sr=sr).T, 
                           axis = 0)[0])       # rolloff_std
    

    features.append(directory.split('/')[-1])
    return features

Давайте посмотрим на аудио файлы в наборе данных:

#Cписки файлов
human_dir, _, human_files = next(os.walk('../input/audioset/Training_Data/human'))
spoof_dir, _, spoof_files = next(os.walk('../input/audioset/Training_Data/spoof'))
print(f"Human files: {len(human_files)}\nSpoof files: {len(spoof_files)}")

Human files: 10322 Spoof files: 39678

Извлечение и сохранение значений в формате CSV файла

buffer = []
buffer_size = 5000
buffer_counter = 0

# Создание заголовка для файла CSV.
header = ['filename']
header.extend([f'mfcc_mean{i}' for i in range(1, 21)])
header.extend([f'mfcc_std{i}' for i in range(1, 21)])
header.extend(['cent_mean', 'cent_std', 'cent_skew', 'rolloff_mean', 'rolloff_std',
               'label'])

with open('dataset.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter=',')
    writer.writerow(header)
    for directory, files in [(human_dir, human_files), (spoof_dir, spoof_files)]:
        for file in files:
            features = extract_features(directory, file)
            if buffer_counter + 1 == buffer_size:
                buffer.append(features)
                writer.writerows(buffer)
                print(f"- [{directory.split('/')[-1]}] Write {len(buffer)} rows")
                buffer = []
                buffer_counter = 0
            else:
                buffer.append(features)
                buffer_counter += 1
        if buffer:
            writer.writerows(buffer)
            print(f"- [{directory.split('/')[-1]}] Write {len(buffer)} rows") 
        print(f"- [{directory.split('/')[-1]}] Writing complete")
        buffer = []
        buffer_counter = 0

Загрузка формата CSV файла

Для загрузки формата CSV файла используется метод Pandas read.csv(). В скобках указывается путь к файлу в кавычках, чтобы Pandas считывал файл во фрейм данных (Dataframes - df) с этого адреса.

data = pd.read_csv('../input/datatrain/dataset.csv')
data
Двухмерная таблица - Dataframes, состоящая из  47столбцов  и 50000 строк.
Двухмерная таблица - Dataframes, состоящая из 47столбцов и 50000 строк.
Двухмерная таблица - Dataframes, состоящая из  47столбцов  и 50000 строк.
Двухмерная таблица - Dataframes, состоящая из 47столбцов и 50000 строк.

В таблице data мы видим:

  • столбец ‘filename’, где указан номер и название файла (Аудиофайлы перемешаны);

  • столбцы ‘mfcc_mean{i}’ и ‘mfcc_std{i}’ - средние значения и стандартные отклонения (по 20 значений) из Мел-кепстральных коэффициентов;

  • столбцы 'cent_mean', 'cent_std', 'cent_skew' - среднее значение, стандартное отклонение и skew (наклон) из Спектрального центроида;

  • столбцы 'rolloff_mean', 'rolloff_std' - среднее значение и стандартное отклонение из Спектрального спада ;

  • столбец ‘label’ метка.

В следующей (третьей части анализа аудиоданных) разберем алгоритм машинного обучения - SVM (Support Vector Machines) / Машины опорных векторов.

Теги:
Хабы:
Всего голосов 6: ↑6 и ↓0+6
Комментарии6

Публикации

Истории

Работа

Python разработчик
119 вакансий
Data Scientist
78 вакансий

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань