Определение возрастапо голосу говорящего |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-06-21 19:32 большие данные big data, алгоритмы распознавания речи, распознавание образов Теперь, когда у нас есть и эти функции спектрограммы, давайте проведем над ними некоторое EDA! И поскольку мы увидели, что "гендер", по-видимому, имеет особое отношение к нашим аудиозаписям, давайте визуализируем среднюю спектрограмму mel для обоих полов отдельно, а также их различия. Как выполнить EDA и моделирование данных для аудиоданных Большинство людей знакомы с тем, как запустить проект data science на основе изображений, текста или табличных данных. Но не у многих есть опыт анализа аудиоданных. В этой статье мы узнаем, как мы можем сделать именно это. Как подготовить, изучить и проанализировать аудиоданные с помощью машинного обучения. Короче говоря: как и для всех других модальностей (например, текста или изображений), хитрость заключается в том, чтобы перевести данные в формат, поддающийся машинной интерпретации. Самое интересное в аудиоданных то, что вы можете обрабатывать их как множество различных модальностей:
В этой статье мы рассмотрим первые три подхода. Но сначала давайте подробнее рассмотрим, как на самом деле выглядят аудиоданные. 1. Множество аспектов аудиоданных Хотя существует несколько библиотек Python, которые позволяют вам работать с аудиоданными, в этом примере мы будем использовать librosa. Итак, давайте загрузим MP3-файл и построим график его содержимого.
То, что вы видите здесь, представляет собой осциллограмму произнесенного предложения: “он только что получил нового воздушного змея на свой день рождения”. 1.1. Форма волны - сигнал во временной области Раньше мы называли это данными временных рядов, но теперь мы называем это формой волны? Ну, это и то, и другое. Это становится яснее, когда мы смотрим только на небольшой сегмент этого аудиофайла. На следующем рисунке показано то же самое, что и выше, но на этот раз только 62,5 миллисекунды.
То, что вы можете видеть, - это временной сигнал, который колеблется вокруг значения 0 с различными частотами и амплитудами.Этот сигнал представляет собой изменение давления воздуха с течением времени или физическое смещение мембраны громкоговорителя (или мембраны в вашем ухе, если уж на то пошло). Вот почему это изображение аудиоданных также называется формой волны. Частота - это скорость, с которой этот сигнал колеблется. Низкая частота, например, 60 Гц, может быть звуком бас-гитары, в то время как пение птиц может быть на более высокой частоте 8000 Гц. Человеческая речь обычно находится где-то между этим. Чтобы знать, как быстро этот сигнал должен быть интерпретирован, нам также необходимо знать частоту дискретизации, с которой были записаны данные. В этом случае частота дискретизации в секунду составляла 16 000 или 16 Тыс. Гц. Это означает, что 1’000 временных точек, которые мы видим на предыдущем рисунке, представляют 62,5 миллисекунды (1000/16000 = 0,0625) аудиосигнала. 1.2. Преобразование Фурье - сигнал в частотной области В то время как предыдущая визуализация может сказать нам, когда что-то происходит (т.Е. около 2 секунд кажется, что сигналов много), она не может действительно сказать нам, с какой частотой это происходит. Поскольку форма сигнала показывает нам информацию о том, когда, этот сигнал также считается находящимся во временной области. Используя быстрое преобразование фурье, мы можем инвертировать эту проблему и получить четкую информацию о том, какие частоты присутствуют, при этом теряя всю информацию о том, когда. В таком случае говорят, что представление сигнала находится в частотной области. Давайте посмотрим, как выглядит наше предыдущее произнесенное предложение, представленное в частотной области.
Здесь вы можете видеть, что большая часть сигнала находится где-то между ~ 100 и ~ 1000 Гц (т.Е. между $ 10 ^ 2 $ и $ 10 ^ 3 $). Кроме того, кажется, есть некоторые дополнительные данные от 1 000 до 10 000 Гц. 1.3. Спектрограмма К счастью, нам не всегда нужно принимать решение о временной или частотной области. Используя график спектрограммы, мы можем извлечь выгоду из обеих областей, сохраняя при этом большинство их недостатков минимальными. Существует несколько способов создания таких графиков спектрограмм, но для этой статьи давайте рассмотрим три из них в частности. 1.3.1. Кратковременное преобразование Фурье (STFT) Используя небольшую адаптированную версию быстрого преобразования Фурье, а именно кратковременное преобразование фурье (STFT), мы можем создать такую спектрограмму. Небольшая хитрость, которая применяется здесь, заключается в том, что БПФ вычисляется для нескольких небольших временных окон (отсюда и “кратковременное фурье”) в виде скользящего окна.
Как и на всех графиках спектрограмм, цвет представляет величину (громкость/громкость) заданной частоты в данный момент времени. +0 дБ - это самый громкий звук, а - 80 дБ близок к тишине. На горизонтальной оси x мы можем видеть время, в то время как на вертикальной оси y мы можем видеть различные частоты. 1.3.2. Мэл-спектрограмма В качестве альтернативы STFT вы также можете вычислить спектрограмму mel, основанную на шкале mel. Эта шкала объясняет то, как мы, люди, воспринимаем высоту звука. Шкала mel рассчитывается таким образом, чтобы две пары частот, разделенных дельтой в шкале mel, воспринимались людьми как имеющие одинаковую разницу в восприятии. Спектрограмма mel вычисляется очень похоже на STFT, основное отличие заключается только в том, что ось y использует другой масштаб.
Сначала разница с STFT может показаться не слишком очевидной, но если вы присмотритесь повнимательнее, то увидите, что на графике STFT частота от 0 до 512 Гц занимает гораздо больше места на оси y, чем на графике mel. 1.3.3. Коэффициенты кепстрала малой частоты (MFCCc) Частотные коэффициенты кепстрала Mel (MFCC) представляют собой альтернативное представление спектрограммы mel, полученной ранее. Преимуществом MFCC перед mel-спектрограммой является довольно небольшое количество признаков (т.е. уникальных горизонтальных линий), обычно ~20. Из-за того, что спектрограмма mel ближе к тому, как мы, люди, воспринимаем высоту звука, и что MFCCs имеет всего несколько функций компонентов, большинство специалистов по машинному обучению предпочитают способ представления аудиоданных MFCCs в виде "изображения". Это не означает, что для данной проблемы представление STFT, mel или формы сигнала может работать лучше. Итак, давайте продолжим и вычислим MFCC и построим их график.
2. Data cleaning Теперь, когда мы немного лучше понимаем, как выглядят аудиоданные, давайте визуализируем еще несколько примеров. Примечание: Вы можете загрузить эти четыре примера по этим ссылкам: Audio 1, Audio 2, Audio 3, Audio 4.
Из этих четырех примеров и, что более важно, при их прослушивании мы можем получить еще несколько сведений об этом наборе аудиоматериалов:
Чтобы лучше понять, как это представлено в частотной области, давайте посмотрим на соответствующие спектрограммы STFT.
Когда мы слушаем аудиозаписи, мы можем заметить, что образец 3 имеет изменяющийся фоновый шум, охватывающий несколько частот, в то время как фоновый шум в образце 4 довольно постоянный. Это также то, что мы видим на рисунках выше. Образец 3 очень шумный на всем протяжении, в то время как образец 4 шумный только на нескольких частотах (т.е. Толстые горизонтальные линии). Сейчас мы не будем вдаваться в подробности того, как можно устранить такой шум, поскольку это выходит за рамки данной статьи. Итак, давайте рассмотрим ‘краткий обзор’ того, как мы могли бы удалить такой шум и обрезать звуковые сэмплы. Хотя более ручной подход, с использованием пользовательских функций фильтрации, может быть лучшим подходом для удаления шума из аудиоданных, в нашем случае мы пойдем дальше и используем практичный пакет python noisereduce.
Если вы прослушаете созданные wav-файлы, то сможете услышать, что шум почти полностью исчез. Да, мы также ввели еще несколько артефактов, но в целом мы надеемся, что наш подход к удалению шума принес больше пользы, чем вреда. Для шага обрезки мы можем использовать функцию librosa .effects.trim(). Обратите внимание, что для каждого набора данных может потребоваться другой параметр top_db для обрезки, поэтому лучше всего попробовать несколько версий и посмотреть, что работает хорошо. В нашем случае это top_db=20.
Давайте теперь еще раз взглянем на очищенные данные.
Намного лучше! 3. Извлечение признаков Теперь, когда наши данные чисты, давайте продолжим и рассмотрим несколько специфичных для звука функций, которые мы могли бы извлечь. Но сначала давайте загрузим файл. # Загрузить данные для выборки 1 y, sr = librosa.load("c4_sample-1.wav", sr=16_000) 3.1. Обнаружение начала заболевания Глядя на форму сигнала, librosa может достаточно хорошо определить начало нового произнесенного слова.
В этом аудиосигнале было обнаружено 7 включений 3.2. Продолжительность аудиозаписи Очень сильно с этим связана продолжительность аудиозаписи. Чем длиннее запись, тем больше слов можно произнести. Итак, давайте вычислим длину записи и скорость, с которой произносятся слова.
3.3. Темп Язык - это очень мелодичный сигнал, и у каждого из нас есть уникальная манера и скорость речи. Следовательно, еще одна функция, которую мы могли бы извлечь, - это темп нашей речи, то есть количество ударов, которые могут быть обнаружены в аудиосигнале. # Вычисляет темп аудиозаписи tempo = librosa.beat.tempo(y, sr, start_bpm=10)[0] print(f"Аудиосигнал имеет скорость {tempo:.2f} ударов в минуту.") Скорость аудиосигнала составляет 42,61 ударов в минуту. 3.4. Основная частота Основная частота - это самая низкая частота, на которой появляется периодический звук. В музыке это также известно как высота тона. На графиках спектрограмм, которые мы видели ранее, основная частота (также называемая f0) представляет собой самую низкую яркую горизонтальную полосу на изображении. В то время как повторение полосатого рисунка над этим фундаментальным называется гармониками. Чтобы лучше проиллюстрировать, что именно мы имеем в виду, давайте извлекем основную частоту и нанесем ее на нашу спектрограмму.
Бирюзовые линии, которые вы видите около 100 Гц, являются основными частотами. Итак, похоже, речь идет о записи. Но как мы можем теперь использовать это для разработки функций? Что ж, что мы могли бы сделать, так это вычислить конкретные характеристики этого f0. # Вычисляет среднее, медианное, 5%- и 95%-процентное значение основной частоты f0_values = [np.nanmean(f0), np.nanmedian(f0), np.nanstd(f0), np.nanpercentile(f0, 5), np.nanpercentile(f0, 95), ] печать("""Этот аудиосигнал имеет среднее значение {:.2f}, медиану {:.2f}, std {:.2f}, 5-процентиль в {:.2f} и 95-процентиль в {:.2f}.""".формат(*f0_values)) Этот аудиосигнал имеет среднее значение 81,98, медиану 80,46, std 4,42, 5-процентиль на уровне 76,57 и 95-процентиль на уровне 90,64. Примечание: Конечно, существует еще много методов извлечения звуковых объектов, которые вы могли бы изучить. Для получения краткого изложения некоторых из них ознакомьтесь с musicinformationretrieval.com . 4. Предварительный анализ данных (EDA) по набору аудиоданных Теперь, когда мы знаем, как выглядят аудиоданные и как мы можем их обрабатывать, давайте сделаем еще один шаг и проведем надлежащий EDA для них. Для этого давайте сначала загрузим набор данных. Обратите внимание, что набор данных, который мы будем использовать для этой статьи, был загружен из общего хранилища голоса от Kaggle. Этот большой набор данных объемом 14 ГБ представляет собой лишь небольшой снимок большого набора данных объемом более 70 ГБ от Mozilla. Но не волнуйтесь, для нашего примера здесь мы будем использовать все меньшую подвыборку примерно из ~ 9 000 аудиофайлов. # Загрузите и распакуйте набор данных !wget -qO c4_audio_dataset.zip https://www.dropbox.com/s/3ibn2br901vvtgz/c4_audio_dataset.zip?dl=1 !распаковать архив -q c4_audio_dataset.zip !рм c4_audio_dataset.zip Итак, давайте подробнее рассмотрим этот набор данных и некоторые уже извлеченные функции. импортируйте pandas как pd # Загрузите csv-файл, содержащий уже извлеченные объекты
4.1. Исследование распределения функций 4.1.1. Целевые характеристики Во-первых, давайте посмотрим на распределение по классам наших потенциальных целевых классов по возрасту и полу.
4.1.2. Извлеченные функции В качестве следующего шага давайте подробнее рассмотрим распределение значений извлеченных объектов.
За исключением words_per_second, большинство из этих распределений функций искажены вправо и, следовательно, могут извлечь выгоду из преобразования журнала. Так что давайте позаботимся об этом.
Намного лучше, но что интересно, так это тот факт, что все функции f0, похоже, имеют бимодальное распределение. Давайте построим то же самое, что и раньше, но на этот раз с разделением по полу.
Как и предполагалось, здесь, похоже, присутствует гендерный эффект! Но что мы также можем видеть, так это то, что некоторые показатели f0 (здесь, в частности, у мужчин) намного ниже и выше, чем они должны быть. Потенциально это могут быть выбросы из-за плохого извлечения объектов. Давайте подробнее рассмотрим все точки данных на следующем рисунке.
Учитывая небольшое количество функций и тот факт, что у нас есть довольно приятные на вид дистрибутивы с ярко выраженными хвостами, мы могли бы просмотреть каждый из них и определить пороговое значение выброса для каждой функции. Но чтобы показать вам более автоматизированный способ, давайте вместо этого воспользуемся подходом z-score.
Как вы можете видеть, этот подход сократил наш набор данных примерно на 5%, что должно быть нормально. 4.2. Корреляция признаков В качестве следующего шага давайте посмотрим на корреляцию между всеми функциями. Но прежде чем мы сможем это сделать, давайте продолжим и также закодируем нечисловые целевые объекты. Обратите внимание, что для этого мы могли бы использовать OrdinalEncoder scikit-learn, но это потенциально нарушило бы правильный порядок в функции age. Так что давайте лучше выполним ручное сопоставление. # Сопоставьте возраст с соответствующим числовым значением df.loc[:, "возраст"] = df["возраст"].map({ "подростки": 0, "двадцатые": 1, "тридцатые": 2, "сороковые": 3, "пятидесятые": 4, "шестидесятые": 5}) # Сопоставьте пол с соответствующим числовым значением df.loc[:, "пол"] = df["пол"].map({"мужской": 0, "женский": 1}) Теперь мы готовы использовать функцию pandas .corr() вместе с функцией seaborn's heatmap(), чтобы получить больше информации о корреляции объектов.
Интересно! Что мы можем видеть, так это то, что наши извлеченные функции f0, по-видимому, имеют довольно сильную связь с гендерной целью, в то время как возраст, по-видимому, мало с чем коррелирует. 4.3. Характеристики спектрограммы На данный момент мы не просматривали фактические аудиозаписи во время нашего EDA. Как мы видели ранее, у нас есть много вариантов (например, в форме сигнала или в виде спектрограммы STFT, mel или mfccs). Для этого исследования давайте продолжим и посмотрим на спектрограммы mel. Однако, прежде чем мы сможем это сделать, нам нужно учесть одну вещь: все звуковые сэмплы имеют разную длину, а это означает, что спектрограммы также будут иметь разную длину. Поэтому, чтобы нормализовать все записи, давайте сократим их до длины ровно 3 секунды. Это означает, что слишком короткие образцы будут заполнены, в то время как слишком длинные образцы будут вырезаны.
Теперь, когда все готово, давайте извлекем спектрограммы для всех звуковых сэмплов.
Теперь, когда у нас есть и эти функции спектрограммы, давайте проведем над ними некоторое EDA! И поскольку мы увидели, что "гендер", по-видимому, имеет особое отношение к нашим аудиозаписям, давайте визуализируем среднюю спектрограмму mel для обоих полов отдельно, а также их различия.
Хотя это трудно увидеть на индивидуальном графике, график различий показывает, что у говорящего мужчины в среднем более низкие голоса, чем у женщины. Это можно увидеть по большей силе на более низких частотах (видно в красной горизонтальной области) на графике разницы. 5. Модели машинного обучения Теперь мы готовы к части моделирования. И поэтому у нас есть несколько вариантов. Что касается моделей, мы могли бы … обучаем наши собственные классические (т.е. неглубокие) модели машинного обучения, такие как LogisticRegression или SVC. А что касается данных, мы могли бы использовать … данные из CSV-файла, объедините их с характеристиками "mel strength" из спектрограмм и рассмотрите данные как табличные данные, установите Конечно, существует множество различных подходов и других способов создания набора данных для части моделирования. Для этой статьи давайте кратко рассмотрим один из них. Классическая (т.е. неглубокая) модель машинного обучения Давайте возьмем данные из CSV-файла и объединим их с простой моделью LogisticRegression и посмотрим, насколько хорошо мы можем предсказать возраст говорящего. Итак, для начала давайте загрузим данные и разделим их на обучающий и тестовый наборы.
Теперь, когда данные готовы к обучению, давайте создадим модель, которую мы хотели бы обучить. Для этого давайте используем объект конвейера, чтобы мы могли изучить преимущества определенных процедур предварительной обработки (например, с использованием масштабировщиков или PCA). Кроме того, давайте использовать GridSearchCV для изучения различных комбинаций гиперпараметров, а также для выполнения перекрестной проверки.
96 строк х 7 столбцов В дополнение к приведенному выше выходному кадру данных мы также можем построить график оценки производительности в зависимости от исследованных гиперпараметров. Однако, учитывая, что у нас есть несколько скейлеров и подходов PCA, нам нужно создать отдельный график для каждой отдельной комбинации гиперпараметров.
Выполнение дополнительного шага и визуализация показателей производительности в виде кривых часто дают нам соответствующую дополнительную информацию, которую мы не получили бы, если бы просто смотрели на фрейм данных pandas. На этом графике мы видим, что в целом модели работают одинаково хорошо. Некоторые из них имеют более быстрое "выпадение", когда мы уменьшаем значение C, в то время как другие показывают более широкий разрыв между оценкой train и test (здесь фактически проверка), особенно когда мы не используем PCA. Сказав все это, давайте просто перейдем к модели best_estimator_ и посмотрим, насколько хорошо она работает на удержанном тестовом наборе. # # Вычислить оценку лучшей модели на удержанном тестовом наборе best_cif = model.best_estimator_ best_clf.score(x_te, y_te) 0.4354094579008074 Это уже очень хороший результат. Но чтобы лучше понять, насколько хорошо работает наша классификационная модель, давайте также посмотрим на соответствующую матрицу путаницы. Чтобы сделать это, давайте создадим короткую вспомогательную функцию.
Как вы можете видеть, хотя модель смогла обнаружить больше выборок двадцатых годов, чем другие (левая матрица путаницы), в целом она действительно была лучше в классификации записей подростков и шестидесятников (например, с точностью 59% и 55% соответственно). Резюме В этом разделе мы впервые увидели, как выглядят аудиоданные, в какие различные формы они могут быть преобразованы, как их можно очистить и изучить, а затем использовать для обучения некоторых моделей машинного обучения. Источник: miykael.github.io Комментарии: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||