Как добавить жанр музыки в на python
Перейти к содержимому

Как добавить жанр музыки в на python

  • автор:

Ниже перевод

Я хочу ставить проигрываемую в фоне музыку на паузу и/или продолжать воспроизведение используя питон, нашёл такой вариант, который использует pynput :

from pynput.keyboard import Controller, Key c = Controller() c.press(Key.media_play_pause) 

Но аудио всё равно продолжает проигрываться. Похоже ошибок нет, но оно не работает.

Ответ

Возможно тебе стоит попробовать playerctl, утилита для командной строки, которую можно использовать через:

subprocess.call(("playerctl", "play-pause")) 

Однако, playerctl возможно не установлена в твоей системе, то надо сделать сдедующее:

  • sudo apt install playerctl ,
  • pacman -Syu playerctl ,
  • sudo dnf install playerctl or
  • sudo zypper install playerctl

(в зависимости от дистрибутива)

Таким образом нет необходимости в pynput , вместо него subprocess ( import subprocess ). Если тебе не важны стиль и безопасность, ты можешь, конечно же, использовать os.system(«playerctl play-pause»)

Как добавить жанр музыки в на python

МЕРОПРИЯТИЯ

Всероссийский хакатон по биометрии

Комментарии

Популярные По порядку
Не удалось загрузить комментарии.

ВАКАНСИИ

Преподаватель на курс БД SQL в Proglib.Academy
по итогам собеседования

Методист-педагогический дизайнер в Proglib.Academy
по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

DeepFake-туториал: создаем собственный дипфейк в DeepFaceLab

Рассказываем о технологии DeepFake и шаг за шагом учимся делать дипфейки в DeepFaceLab – нейросетевой программе, меняющей лица в видеороликах.

Пишем свою нейросеть: пошаговое руководство

Отличный гайд про нейросеть от теории к практике. Вы узнаете из каких элементов состоит ИНС, как она работает и как ее создать самому.

Программирование на Python: от новичка до профессионала

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

Анализ музыкальных предпочтений с использованием аудиоаналитики на Python

Музыка, неотъемлемая часть человеческой культуры, всегда отражала дух времени. Однако с наступлением цифровой эры и быстрого развития технологий, музыкальная индустрия столкнулась с революцией, которая изменила не только способы создания и распространения музыки, но и сам способ, которым мы взаимодействуем с ней. Сегодня музыкальные платформы и сервисы предоставляют нам огромный выбор композиций, а важную роль в этом процессе играют технологии аудиоаналитики.

Роль анализа музыкальных предпочтений для понимания аудитории

Что делает песню хитом? Какие элементы музыки заставляют нас нажимать «пропустить» или добавлять трек в свой плейлист? Ответы на эти вопросы лежат в понимании музыкальных предпочтений слушателей. Анализ этих предпочтений — это не только путь к более точным рекомендациям, но и ключ к пониманию наших эмоциональных реакций на музыку. Именно здесь на сцену выходит аудиоаналитика.

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

Возможности аудиоаналитики и Python в данной области

Аудиоаналитика, основанная на данных, предоставляемых музыкальными платформами и сервисами, открывает перед исследователями и индустрией множество перспектив. Однако для эффективного анализа огромных объемов аудиоданных требуется мощный инструментарий. И здесь Python становится незаменимым инструментом благодаря своей простоте, гибкости и богатой экосистеме библиотек.

Библиотека Librosa, например, предоставляет возможности для извлечения аудиофункций из звуковых файлов. Она позволяет анализировать спектрограммы, извлекать характеристики звуков, определять темп и тональность композиций. Такие данные могут служить основой для детального исследования музыкальных паттернов и разнообразия.

Основы аудиоаналитики

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

Важной частью аудиоаналитики является извлечение акустических особенностей, таких как темп, ритм, тембр, тональность и другие музыкальные параметры. Благодаря этим параметрам, можно описать аудиотрек количественно, создавая некий «музыкальный отпечаток» для дальнейшего анализа.

Основные этапы обработки аудиоданных

Процесс аудиоаналитики включает несколько ключевых этапов, каждый из которых играет важную роль в получении полезных результатов:

  1. Предварительная обработка: На этом этапе аудиоданные могут быть нормализованы, фильтрованы и преобразованы в удобный формат для дальнейшего анализа. Важно убедиться, что аудиофайлы имеют схожий уровень громкости и подходящий спектральный диапазон.
  2. Извлечение акустических особенностей: Используя библиотеки, такие как Librosa, Python позволяет извлекать разнообразные акустические характеристики из аудиофайлов. Эти параметры включают в себя мел-частотные кепстральные коэффициенты (MFCC), хроматограммы, темп, ритм и многое другое.
  3. Анализ и визуализация: Полученные акустические характеристики могут быть проанализированы и визуализированы. Например, можно построить спектрограммы для визуализации спектральной структуры звука.
  4. Моделирование и интерпретация: На этом этапе акустические особенности могут быть использованы для построения моделей предпочтений аудитории. Это может включать в себя кластеризацию треков по схожим характеристикам или предсказание жанра музыки на основе акустических данных.
  5. Применение результатов: Результаты аудиоаналитики могут быть использованы для создания более персонализированных музыкальных рекомендаций, оптимизации процессов создания музыки и адаптации контента под интересы аудитории.

Основные признаки аудио

A. Спектральные характеристики

1. Спектрограмма

Спектрограмма – это визуализация спектрального состава аудиосигнала во времени. Она позволяет нам увидеть, какие частоты преобладают в аудиоданных на различных участках трека. С помощью библиотеки Librosa в Python, вы можете легко создать спектрограмму для аудиофайла. Этот инструментарий открывает двери к анализу частотного содержания треков и может быть использован для распознавания музыкальных инструментов или даже выявления аномалий в записи.

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

MFCC — это компактное представление аудиосигнала, которое имитирует способность человеческого слуха различать частоты. Вычисление MFCC включает в себя несколько этапов, включая преобразование Фурье, применение мел-фильтров и логарифмирование амплитуд спектральных компонент. Полученные коэффициенты обычно используются в задачах распознавания речи, но они также могут быть полезными для анализа музыкальных характеристик, таких как тембр и инструментация.

B. Ритмические характеристики

1. Темп

Темп – это скорость, с которой происходит музыкальное произведение. Анализ темпа позволяет понять, насколько быстро или медленно развивается музыка, что может иметь значительное влияние на наше восприятие и настроение. Извлечение темпа из аудиоданных может быть выполнено с использованием алгоритмов, основанных на анализе уровня громкости и выявлении периодических ритмических пульсаций.

2. Ритмограммы

Ритмограммы представляют собой визуальное представление о ритмических характеристиках музыки. Они помогают исследователям и музыкантам определить, какие ритмические структуры присутствуют в музыке, например, акценты на определенных долях времени. Анализ ритмограмм может помочь раскрыть уникальные ритмические паттерны различных жанров или даже идентифицировать авторов музыкальных композиций.

Когда мы объединяем спектральные и ритмические характеристики, мы получаем увлекательный инструментарий для анализа и классификации музыкальных произведений.

Использование Python в аудиоаналитике

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

Обзор библиотек для работы с аудиоданными
  1. Librosa: Это универсальная библиотека для аудиоанализа. Она позволяет извлекать множество аудиофункций, таких как спектрограммы, хромограммы, темп и мел-частотные кепстральные коэффициенты (MFCC). Librosa облегчает извлечение важных характеристик из аудиофайлов и их последующий анализ.
  2. pydub: Эта библиотека обеспечивает простой интерфейс для манипулирования аудиофайлами. Вы можете нарезать, склеивать, изменять громкость, применять фильтры и эффекты к аудиофайлам. pydub упрощает обработку аудио и создание новых аудиоматериалов.
  3. Essentia: Это мощная библиотека для аудиоанализа с открытым исходным кодом. Она предоставляет множество алгоритмов для извлечения акустических характеристик, таких как темп, ритм, тон, спектр и многое другое. Essentia позволяет более глубокий анализ музыкальных данных.

Основные функции библиотек

Библиотека Librosa

Librosa предоставляет разнообразные функции для аудиоанализа и извлечения музыкальных характеристик:

  1. librosa.load(file_path, sr=None) : Загрузка аудиофайла. file_path — путь к аудиофайлу, sr — частота дискретизации (по умолчанию сохраняется из файла).
  2. librosa.feature.mfcc(y=None, sr=22050, n_mfcc=20) : Извлечение мел-частотных кепстральных коэффициентов (MFCC) из аудиоданных. y — временной ряд аудиоданных, sr — частота дискретизации, n_mfcc — количество коэффициентов.
  3. librosa.feature.chroma_stft(y=None, sr=22050) : Извлечение хромограммы из аудиоданных. Позволяет анализировать распределение тональных центров по времени.
  4. librosa.beat.beat_track(y=None, sr=22050) : Определение темпа и битовой доли в аудиоданных.
Библиотека pydub

pydub упрощает манипулирование аудиофайлами с помощью простого интерфейса. Основные функции:

  1. AudioSegment.from_file(file, format=None) : Загрузка аудиофайла. file — путь к файлу, format — формат файла.
  2. AudioSegment.export(out_f, format=None) : Экспорт аудио в файл. out_f — имя выходного файла, format — желаемый формат.
  3. audio_segment[start:end] : Извлечение сегмента аудио. start и end — временные точки.
  4. audio_segment + other_audio_segment : Склеивание аудио.
  5. audio_segment.fade_in(duration) : Плавное появление звука на начале аудио.
  6. audio_segment.fade_out(duration) : Плавное затухание звука на конце аудио.
Библиотека Essentia

Essentia предоставляет богатый набор алгоритмов для более глубокого аудиоанализа:

  1. ess.MusicExtractor() : Класс для извлечения множества музыкальных характеристик из аудиофайла.
  2. ess.RhythmExtractor() : Класс для извлечения информации о ритме и темпе.
  3. ess.KeyExtractor() : Класс для извлечения информации о тональности.
  4. ess.PitchExtractor() : Класс для извлечения информации о высоте звучания (тональности).
  5. ess.SpectralPeaks() : Алгоритм для извлечения пиков из спектрограммы.
  6. ess.FilteredSpectrum() : Алгоритм для выделения определенных частотных диапазонов из спектрограммы.

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

Сбор данных для анализа музыкальных предпочтений

Сбор и анализ данных стали неотъемлемой частью практически всех сфер, и музыкальная индустрия не является исключением. Анализ музыкальных предпочтений основан на обширных наборах данных, которые позволяют понимать, какие треки, жанры и артисты находятся в центре внимания слушателей. В этом разделе мы рассмотрим важность сбора данных для анализа музыкальных предпочтений, расскажем о различных источниках данных и поделимся методами их подготовки для дальнейшего анализа.

Источники данных: стриминговые платформы, онлайн-радио и другие

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

  1. Стриминговые платформы: Популярные сервисы, такие как Spotify, Apple Music, Deezer и другие, предоставляют огромное количество данных о проигрывании треков, созданных плейлистах и оценках пользователей.
  2. Онлайн-радио и интернет-платформы: Радиостанции, которые транслируют музыку онлайн, также могут собирать данные о том, какие композиции популярны у их слушателей.
  3. Социальные сети: Платформы, такие как YouTube и SoundCloud, предоставляют данные о числе прослушиваний, лайках, комментариях и репостах.
  4. Опросы и анкеты: Исследователи и маркетологи могут проводить опросы, чтобы понять музыкальные вкусы и предпочтения различных аудиторий.
Особенности данных для анализа

Понимание особенностей данных является ключевым шагом для успешного анализа музыкальных предпочтений. Важно учитывать следующие аспекты:

  1. Многообразие форматов: Данные могут быть представлены в разных форматах, включая аудиофайлы, текстовые описания, числовые оценки и даже изображения.
  2. Незавершенные данные: Некоторые пользователи могут начать проигрывание трека, но не дослушать его до конца. Это может повлиять на интерпретацию популярности треков.
  3. Динамическая природа данных: Предпочтения слушателей могут меняться со временем, а новые артисты и треки могут внезапно стать популярными.
Процесс сбора и подготовки аудиоданных для анализа

Сбор и анализ аудиоданных требует предварительной обработки, чтобы получить репрезентативные и полезные результаты. Вот несколько этапов этого процесса:

  1. Сбор и хранение данных: Данные с различных источников собираются, структурируются и сохраняются в удобном формате для дальнейшего использования.
  2. Извлечение характеристик: Из аудиофайлов извлекаются акустические характеристики с помощью библиотеки Librosa или Essentia. Это может быть спектрограмма, MFCC и другие параметры.
  3. Обработка пропусков и выбросов: Данные могут содержать пропущенные значения или выбросы, которые могут исказить анализ. Проводится очистка данных и заполнение пропусков.
  4. Нормализация и масштабирование: Для более точного анализа данные нормализуются или масштабируются, чтобы уровни значений были сопоставимы.
  5. Агрегация данных: Для учета разных временных масштабов данные могут быть агрегированы по дням, неделям или месяцам.

Правильный сбор, обработка и представление данных обогащают наше понимание аудитории и помогают выявить тренды и особенности, которые формируют музыкальную индустрию сегодня и завтра.

Анализ музыкальных характеристик

Извлечение акустических особенностей с помощью библиотеки Librosa

Рассмотрим примеры извлечения спектрограммы, MFCC и хромограммы:

Пример 1: Извлечение и визуализация спектрограммы

import librosa import librosa.display import matplotlib.pyplot as plt # Загрузка аудиофайла audio_path = "sample_track.wav" y, sr = librosa.load(audio_path) # Вычисление спектрограммы spectrogram = librosa.feature.melspectrogram(y=y, sr=sr) # Визуализация спектрограммы plt.figure(figsize=(10, 6)) librosa.display.specshow(librosa.power_to_db(spectrogram, ref=np.max), y_axis='mel', x_axis='time') plt.colorbar(format='%+2.0f dB') plt.title("Спектрограмма") plt.show()
Анализ тембра, темпа, мелодичности и других параметров

Продолжим анализировать полученные акустические характеристики, чтобы раскроить тембр, темп и мелодичность музыки:

Пример 2: Извлечение и анализ MFCC

import librosa import numpy as np # Загрузка аудиофайла audio_path = "sample_track.wav" y, sr = librosa.load(audio_path) # Извлечение MFCC mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13) # Средние значения MFCC по времени mean_mfccs = np.mean(mfccs, axis=1) print("Средние значения MFCC:") print(mean_mfccs)
Визуализация аудиоданных и характеристик треков

Визуализация играет важную роль в анализе музыкальных данных. Она позволяет наглядно представить характеристики треков:

Пример 3: Визуализация хромограммы

import librosa import librosa.display import matplotlib.pyplot as plt # Загрузка аудиофайла audio_path = "sample_track.wav" y, sr = librosa.load(audio_path) # Вычисление хромограммы chromagram = librosa.feature.chroma_stft(y=y, sr=sr) # Визуализация хромограммы plt.figure(figsize=(10, 6)) librosa.display.specshow(chromagram, y_axis='chroma', x_axis='time') plt.colorbar() plt.title("Хромограмма") plt.show()

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

Примеры задач

Автоматическое распознавание жанров

Библиотека Librosa в сочетании с машинным обучением позволяет создать модель для распознавания жанров музыки. Например, вы можете использовать набор аудиофайлов разных жанров, извлечь характеристики с помощью Librosa и обучить модель классификации.

import librosa import numpy as np from sklearn.model_selection import train_test_split from sklearn.svm import SVC # Загрузка и извлечение характеристик аудиофайлов data, labels = [], [] for file_path in jazz_audio_files: y, sr = librosa.load(file_path) mfccs = librosa.feature.mfcc(y=y, sr=sr) data.append(np.mean(mfccs, axis=1)) labels.append('jazz') # Аналогично для других жанров # Разделение данных на тренировочный и тестовый наборы X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2) # Обучение модели классификации model = SVC() model.fit(X_train, y_train) # Оценка точности модели accuracy = model.score(X_test, y_test) print(f"Точность модели: ")
Поиск схожих треков

С помощью вычисления музыкальных характеристик и метрик сходства, вы можете создать функциональность поиска похожих треков на основе аудиоданных. Здесь мы используем библиотеку Essentia для извлечения характеристик и SciPy для вычисления косинусного сходства.

import essentia.standard as ess from scipy.spatial.distance import cosine # Извлечение характеристик аудиофайла с помощью Essentia extractor = ess.MusicExtractor() features = extractor('sample_track.mp3') # Характеристики для сравнения query_features = [features['rhythm.bpm'], features['tonal.key'], features['tonal.tuning']] similar_tracks = [] # Поиск схожих треков в базе данных for track in database: similarity = 1 - cosine(query_features, track['features']) if similarity > 0.8: similar_tracks.append(track['title']) print("Схожие треки:") for track in similar_tracks: print(track)
Определение темпа и изменение скорости

Иногда требуется изменить темп или скорость трека, сохраняя при этом качество аудио. С библиотекой pydub это можно сделать легко:

from pydub import AudioSegment # Загрузка аудиофайла audio = AudioSegment.from_file("input_track.wav", format="wav") # Увеличение скорости на 10% new_speed = 1.1 new_audio = audio.speedup(playback_speed=new_speed) # Сохранение нового аудиофайла new_audio.export("output_track_speed_up.wav", format="wav")
Анализ мелодичности и настроения

С помощью библиотеки Librosa можно провести анализ музыкальной мелодичности и определить характерное настроение композиции. Например, мы можем извлечь MFCC коэффициенты для трека, а затем используя статистические методы, определить, является ли трек более позитивным или скорее грустным.

import numpy as np # Загрузка аудиофайла audio_file = 'sample_track.mp3' y, sr = librosa.load(audio_file) # Извлечение MFCC коэффициентов mfccs = librosa.feature.mfcc(y=y, sr=sr) # Вычисление среднего коэффициента для анализа настроения mean_mfccs = np.mean(mfccs, axis=1) # Определение настроения на основе среднего значения mood = 'позитивное' if mean_mfccs[2] > mean_mfccs[9] else 'грустное' print(f"Настроение трека: ")
Идентификация ритмических особенностей

С помощью анализа темпа и ритма, можно определить жанр и стиль музыкальной композиции. Библиотека Librosa предоставляет функциональность для извлечения темпа и битовой доли, что позволяет более глубоко понять ритмические характеристики трека.

# Извлечение темпа и битовой доли tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr) print(f"Темп трека: BPM") 
Создание аудиофайлов с эффектами

С использованием библиотеки pydub, вы можете создавать новые аудиофайлы с различными эффектами. Допустим, вы хотите создать эхо эффект для аудиозаписи:

from pydub import AudioSegment from pydub.effects import reverb # Загрузка аудиофайла audio = AudioSegment.from_file("input_track.wav", format="wav") # Применение эхо эффекта audio_with_reverb = reverb(audio, reverberance=50) # Сохранение нового аудиофайла audio_with_reverb.export("output_track_with_reverb.wav", format="wav")

Построение модели предпочтений

Построение модели предпочтений — это шаг, который превращает собранные аудиоаналитические данные в ценные инсайты о музыкальных вкусах слушателей.

Создание признакового описания треков на основе аудиоаналитики

Создание признаков — ключевой этап, который преобразует аудиоаналитические данные в численные характеристики, понятные для модели машинного обучения. Для этого мы используем библиотеку Librosa для извлечения акустических особенностей, таких как MFCC, хромограммы и другие.

import librosa import numpy as np def extract_features(audio_path): y, sr = librosa.load(audio_path) # Извлечение MFCC, хромограммы и спектрального центроида mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13) chroma = librosa.feature.chroma_stft(y=y, sr=sr) spectral_centroid = librosa.feature.spectral_centroid(y=y, sr=sr) # Создание признакового вектора путем объединения характеристик features = np.concatenate((np.mean(mfccs, axis=1), np.mean(chroma, axis=1), np.mean(spectral_centroid))) return features # Пример вызова функции для одного трека audio_path = "sample_track.wav" track_features = extract_features(audio_path) print("Признаки трека:") print(track_features)
Выбор метода анализа и построения модели

Выбор метода зависит от конкретных целей анализа. Для примера рассмотрим построение модели классификации на основе данных аудиоаналитики с использованием библиотеки Scikit-Learn. Мы будем классифицировать треки на жанры музыки.

from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score # Подготовка данных (features_list - список признаков треков, labels_list - метки жанров) X = np.array(features_list) y = np.array(labels_list) # Разделение на обучающую и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Нормализация данных scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # Обучение модели model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(X_train_scaled, y_train) # Предсказание y_pred = model.predict(X_test_scaled) # Оценка точности accuracy = accuracy_score(y_test, y_pred) print("Точность модели:", accuracy)
Обучение модели предпочтений на основе данных аудиоаналитики

Обучение модели предпочтений — это процесс, который находит закономерности между аудиоаналитическими признаками и предпочтениями слушателей.

Рассмотрим пример обучения модели предпочтений на основе данных аудиоаналитики с использованием библиотеки Scikit-Learn. В данном примере мы будем использовать метод классификации на основе алгоритма случайного леса. Мы предполагаем, что у нас есть набор признаков X и соответствующие метки предпочтений y .

from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score # Подготовка данных (X - признаки, y - метки предпочтений) # Замените X и y на свои данные # Разделение на обучающую и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Создание и обучение модели model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(X_train, y_train) # Предсказание на тестовых данных y_pred = model.predict(X_test) # Оценка точности модели accuracy = accuracy_score(y_test, y_pred) print("Точность модели:", accuracy)
  1. Разделили данные на обучающую и тестовую выборки, чтобы проверить эффективность модели на независимых данных.
  2. Создали модель классификации на основе случайного леса с помощью RandomForestClassifier .
  3. Обучили модель на обучающих данных, используя метод fit .
  4. Предсказали значения на тестовых данных с помощью метода predict .
  5. Оценили точность модели, сравнив предсказанные значения с фактическими метками, используя accuracy_score .

Учтите, что в реальном сценарии подбор гиперпараметров и более сложная обработка данных могут потребоваться для достижения наилучших результатов.

Заключение

От создания признаковых векторов до обучения моделей, Python предоставляет инструменты для того, чтобы заложить основу индивидуальных исследований и практических решений в мире музыки. Не ограничивайте себя только извлечением акустических характеристик — дополните анализ данными о настроении, тексту и даже социальными взаимодействиями. Ваше творчество и инновационный подход могут открыть новые горизонты для понимания того, что делает музыку особенной и значимой.

Другие аспекты аналитики и актуальные инструменты можно в короткие сроки изучить на онлайн-курсах по аналитике в Отус. Также пара слов про открытые уроки, которые пройдут 11 сентября:

1) Рассмотрим понятие архитектура предприятия и ее связь с задачами бизнес-анализа, определим точки роста бизнес-аналитика и важность задачи проектирования бизнес-архитектуры. Регистрация на странице курса «Бизнес-аналитик в IT».

2) Загрузим и проанализируем учебный набор данных с помощью Pandas. Очистим данные от пропусков и дубликатов для повышения их качества. И, наконец, используем различные методы трансформации данных: группировка, транспонирование строк или столбцов и другие. Регистрация на странице курса «BI-аналитика».

  • музыка
  • анализ данных
  • аудиоаналитика

Введение

Аудиоанализ — область, включающая автоматическое распознавание речи (ASR), цифровую обработку сигналов, а также классификацию, тегирование и генерацию музыки — представляет собой развивающийся поддомен приложений глубокого обучения. Некоторые из самых популярных и распространенных систем машинного обучения, такие как виртуальные помощники Alexa, Siri и Google Home, — это продукты, созданные на основе моделей, извлекающих информацию из аудиосигналов.

Обзор аудиофайлов

Аудио фрагменты представлены в формате .wav. Звуковые волны оцифровываются путем выборки из дискретных интервалов, известных как частота дискретизации (как правило, 44,1 кГц для аудио с CD-качеством, то есть 44 100 семплов в секунду).

Каждый семпл представляет собой амплитуду волны в определенном временном интервале, где глубина в битах (или динамический диапазон сигнала) определяет, насколько детализированным будет семпл (обычно 16 бит, т.е. семпл может варьироваться от 65 536 значений амплитуды).

В обработке сигналов семплинг — это преобразование непрерывного сигнала в серию дискретных значений. Частота дискретизации — это количество семплов за определенный фиксированный промежуток времени. Высокая частота дискретизации приводит к меньшей потере информации, но к большим вычислительным затратам.

Приложения по обработке звука

К ним можно отнести:

  • Индексирование музыкальных коллекций согласно их аудиопризнакам.
  • Рекомендация музыки для радиоканалов.
  • Поиск сходства для аудиофайлов (Shazam).
  • Обработка и синтез речи — генерирование искусственного голоса для диалоговых агентов.

Обработка аудиоданных с помощью Python

Звук представлен в форме аудиосигнала с такими параметрами, как частота, полоса пропускания, децибел и т.д. Типичный аудиосигнал можно выразить в качестве функции амплитуды и времени.

Некоторые устройства могут улавливать эти звуки и представлять их в машиночитаемом формате. Примеры этих форматов:

  • wav (Waveform Audio File)
  • mp3 (MPEG-1 Audio Layer 3)
  • WMA (Windows Media Audio)

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

Аудио библиотеки Python

Мы будем использовать две библиотеки для сбора и воспроизведения аудио:

1. Librosa

Это модуль Python для анализа звуковых сигналов, предназначенный для работы с музыкой. Он включает все необходимое для создания системы MIR (поиск музыкальной информации) и подробно задокументирован вместе со множеством примеров и руководств.

Установка:

pip install librosa
или
conda install -c conda-forge librosa

Для повышения мощности декодирования звука можно установить ffmpeg, содержащий множество аудио декодеров.

2. IPython.display.Audio

С помощью IPython.display.Audio можно проигрывать аудио прямо в jupyter notebook.

Сюда загружен случайный аудиофайл. Попробуем передать его в консоль jupyter.

Загрузка аудиофайла:

import librosa
audio_data = '/../../gruesome.wav'
x , sr = librosa.load(audio_data)
print(type(x), type(sr))
# print(x.shape, sr)#(94316,) 22050

Этот фрагмент возвращает звуковой временной ряд в качестве массива numpy с частотой дискретизации по умолчанию 22 кГц моно. Это поведение можно изменить с помощью повторного семплинга на частоте 44,1 кГц.

librosa.load(audio_data, sr=44100)

Повторный семплинг также можно отключить:

librosa.load(audio_path, sr=None)

Частота дискретизации — это количество аудио семплов, передаваемых в секунду, которое измеряется в Гц или кГц.

Проигрывание аудио:

С помощью IPython.display.Audio можно проигрывать аудио в jupyter notebook.

import IPython.display as ipd
ipd.Audio(audio_data)

Этот фрагмент возвращает аудиовиджет:

Визуализация аудио:

С помощью librosa.display.waveplot можно построить график массива аудио:

%matplotlib inline
import matplotlib.pyplot as plt
import librosa.display
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)

Ниже представлен график управления амплитудой формы волны:

Cпектрограмма

Спектрограмма — это визуальный способ представления уровня или “громкости” сигнала во времени на различных частотах, присутствующих в форме волны. Обычно изображается в виде тепловой карты.

X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
plt.figure(figsize=(14, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()

.stft() преобразует данные в кратковременное преобразование Фурье. С помощью STFT можно определить амплитуду различных частот, воспроизводимых в данный момент времени аудиосигнала. Для отображения спектрограммы используется .specshow .

На вертикальной оси показаны частоты (от 0 до 10 кГц), а на горизонтальной — время. Поскольку все действие происходит в нижней части спектра, мы можем преобразовать ось частот в логарифмическую.

librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log')
plt.colorbar()

Создание аудиосигнала:

import numpy as np
sr = 22050 # частота дискретизации
T = 5.0 # секунды
t = np.linspace(0, T, int(T*sr), endpoint=False) # переменная времени
x = 0.5*np.sin(2*np.pi*220*t) # чистая синусоидная волна при 220 Гц
# проигрывание аудио
ipd.Audio(x, rate=sr) # загрузка массива NumPy
# сохранение аудио
librosa.output.write_wav('tone_220.wav', x, sr)

Извлечение признаков из аудио сигнала

Каждый аудиосигнал состоит из множества признаков. Мы будем извлекать только те характеристики, которые относятся к решаемой нами проблеме. Этот процесс называется извлечением признаков. Рассмотрим некоторые из них подробнее.

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

Указывает, на какой частоте сосредоточена энергия спектра или, другими словами, указывает, где расположен “центр масс” для звука. Схож со средневзвешенным значением:

где S(k) — спектральная величина элемента разрешения k, а f(k) — частота элемента k.

librosa.feature.spectral_centroid вычисляет спектральный центроид для каждого фрейма в сигнале:

import sklearn
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shape
(775,)
# Вычисление временной переменной для визуализации
plt.figure(figsize=(12, 4))
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# Нормализация спектрального центроида для визуализации
def normalize(x, axis=0):
return sklearn.preprocessing.minmax_scale(x, axis=axis)
# Построение спектрального центроида вместе с формой волны
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='b')

.spectral_centroid возвращает массив со столбцами, равными количеству фреймов, представленных в семпле.

В начале спектрального центроида можно заметить подъем.

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

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

librosa.feature.spectral_rolloff вычисляет частоту спада для каждого фрейма в сигнале:

spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
plt.figure(figsize=(12, 4))
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='r')

3. Спектральная ширина

Спектральная ширина определяется как ширина полосы света на половине максимальной точки (или полная ширина на половине максимума [FWHM]) и представлена двумя вертикальными красными линиями и λSB на оси длин волн.

spectral_bandwidth_2 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr)[0]
spectral_bandwidth_3 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr, p=3)[0]
spectral_bandwidth_4 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr, p=4)[0]
plt.figure(figsize=(15, 9))
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_bandwidth_2), color='r')
plt.plot(t, normalize(spectral_bandwidth_3), color='g')
plt.plot(t, normalize(spectral_bandwidth_4), color='y')
plt.legend(('p = 2', 'p = 3', 'p = 4'))

4. Скорость пересечения нуля

Простой способ измерения гладкости сигнала — вычисление числа пересечений нуля в пределах сегмента этого сигнала. Голосовой сигнал колеблется медленно. Например, сигнал 100 Гц будет пересекать ноль 100 раз в секунду, тогда как “немой” фрикативный сигнал может иметь 3000 пересечений нуля в секунду.

Более высокие значения наблюдаются в таких высоко ударных звуках, как в металле и роке. Теперь визуализируем этот процесс и рассмотрим вычисление скорости пересечения нуля.

x, sr = librosa.load('/../../gruesome.wav')
# Построение графика сигнала:
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)
# Увеличение масштаба:
n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()
n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()

Здесь примерно 16 пересечений нуля. Проверим это с помощью Librosa.

zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))#16

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

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

mfccs = librosa.feature.mfcc(x, sr=fs)
print(mfccs.shape)
(20, 97)
# Отображение MFCC:
plt.figure(figsize=(15, 7))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')

6. Цветность

Признак или вектор цветности обычно представлен вектором признаков из 12 элементов, в котором указано количество энергии каждого высотного класса в сигнале. Используется для описания меры сходства между музыкальными произведениями.

librosa.feature.chroma_stft используется для вычисления признаков цветности.

chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=hop_length)
plt.figure(figsize=(15, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')

Мы разобрались, как работать с аудиоданными и извлекать важные функции с помощью python. Теперь переходим к использованию этих функций и построению модели ANN для классификации жанров музыки.

Классификация жанров музыки с помощью ANN

Набор данных состоит из 1000 звуковых треков, длина каждого составляет 30 секунд. Он содержит 10 жанров, каждый из которых представлен 100 треками. Все дорожки — это монофонические 16-битные аудиофайлы 22050 Гц в формате .wav.

Жанры, представленные в наборе:

Для работы с нейронными сетями мы будем использовать Google Colab — бесплатный сервис, предоставляющий GPU и TPU в качестве сред выполнения.

План:

В первую очередь нужно преобразовать аудиофайлы в изображения формата PNG (спектрограммы). Затем из них нужно извлечь значимые характеристики: MFCC, спектральный центроид, скорость пересечения нуля, частоты цветности, спад спектра.

После извлечения признаки можно добавить в файл CSV, чтобы ANN можно было использовать для классификации.

  1. Извлекаем и загружаем данные в Google Drive, а затем подключаем диск в Colab.

2. Импортируем все необходимые библиотеки.

import librosa
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import os
from PIL import Image
import pathlib
import csv
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
import keras
from keras import layers
from keras import layers
import keras
from keras.models import Sequential
import warnings
warnings.filterwarnings('ignore')

3. Теперь конвертируем файлы аудиоданных в PNG или извлекаем спектрограмму для каждого аудио.

cmap = plt.get_cmap('inferno')
plt.figure(figsize=(8,8))
genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
for g in genres:
pathlib.Path(f'img_data/').mkdir(parents=True, exist_ok=True)
for filename in os.listdir(f'./drive/My Drive/genres/'):
songname = f'./drive/My Drive/genres//'
y, sr = librosa.load(songname, mono=True, duration=5)
plt.specgram(y, NFFT=2048, Fs=2, Fc=0, noverlap=128, cmap=cmap, sides='default', mode='default', scale='dB');
plt.axis('off');
plt.savefig(f'img_data//.png')
plt.clf()

Спектрограмма семпла песни в жанре блюз:

Преобразование аудиофайлов в соответствующие спектрограммы упрощает извлечение функций.

Создание заголовка для файла CSV.

header = 'filename chroma_stft rmse spectral_centroid spectral_bandwidth rolloff zero_crossing_rate'
for i in range(1, 21):
header += f' mfcc'
header += ' label'
header = header.split()

5. Извлекаем признаки из спектрограммы: MFCC, спектральный центроид, частоту пересечения нуля, частоты цветности и спад спектра.

file = open('dataset.csv', 'w', newline='')
with file:
writer = csv.writer(file)
writer.writerow(header)
genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
for g in genres:
for filename in os.listdir(f'./drive/My Drive/genres/'):
songname = f'./drive/My Drive/genres//'
y, sr = librosa.load(songname, mono=True, duration=30)
rmse = librosa.feature.rmse(y=y)
chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
zcr = librosa.feature.zero_crossing_rate(y)
mfcc = librosa.feature.mfcc(y=y, sr=sr)
to_append = f' '
for e in mfcc:
to_append += f' '
to_append += f' '
file = open('dataset.csv', 'a', newline='')
with file:
writer = csv.writer(file)
writer.writerow(to_append.split())

6. Выполняем предварительную обработку данных, которая включает загрузку данных CSV, создание меток, масштабирование признаков и разбивку данных на наборы для обучения и тестирования.

data = pd.read_csv('dataset.csv')
data.head()
# Удаление ненужных столбцов
data = data.drop(['filename'],axis=1)
# Создание меток
genre_list = data.iloc[:, -1]
encoder = LabelEncoder()
y = encoder.fit_transform(genre_list)
# Масштабирование столбцов признаков
scaler = StandardScaler()
X = scaler.fit_transform(np.array(data.iloc[:, :-1], dtype = float))
# Разделение данных на обучающий и тестовый набор
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

7. Создаем модель ANN.

model = Sequential()
model.add(layers.Dense(256, activation='relu', input_shape=(X_train.shape[1],)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

8. Подгоняем модель:

classifier = model.fit(X_train, 
y_train,
epochs=100,
batch_size=128)

После 100 эпох точность составляет 0,67.

Заключение

На этом первая часть подходит к концу. Мы провели анализ аудиоданных, извлекли важные признаки, а также реализовали ANN для классификации музыкальных жанров.

Во второй части попробуем выполнить то же самое с помощью сверточных нейронных сетей на спектрограмме.

  • Максимальная производительность Pandas Python
  • Продвинутые методы и техники списков в Python
  • Автоматизация работы с Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *