Александр Иванов – Python для творческих. Звук на твоей стороне. (страница 6)
Функция возвращает список интервалов. Каждый интервал — это два числа: начало и конец участка речи, измеренные в количестве измерений от начала файла. В цикле for start, end in intervals мы проходим по всем найденным речевым фрагментам. Для каждого вычисляем его длительность в секундах: (end - start) / sr. Разницу между концом и началом делим на частоту дискретизации и получаем секунды. Все эти длительности суммируем в переменную total_speech.
Затем общую длину файла в секундах вычисляем как len(y) / sr. Время тишины получаем вычитанием: всё, что не речь — тишина. Выводим результаты на экран.
Если вы запустите этот скрипт на необработанной записи, то, скорее всего, увидите, что от двадцати до сорока процентов времени занимает тишина. Это нормально для живого человека, но ненормально для качественного контента. Сорок процентов — это почти половина. Представьте: ваш слушатель тратит почти половину времени на то, чтобы слушать ничто. Это то, что мы будем исправлять в следующих главах.
Работа с разными форматами аудио
Мир аудиофайлов не ограничивается форматом WAV. Существуют десятки форматов: MP3, M4A, FLAC, OGG, WMA и многие другие. Каждый формат имеет свои особенности, преимущества и недостатки. Нам, как людям, которые работают со звуком через код, полезно понимать разницу между ними.
WAV — это формат без сжатия. Это значит, что каждое измерение громкости сохраняется как есть, без каких-либо упрощений и выбрасывания данных. Файл получается большим, но зато при каждом открытии и сохранении качество остаётся неизменным. WAV — идеальный формат для промежуточной работы. Все обработки мы будем делать именно в WAV, потому что это исключает накопление искажений. Представьте, что вы каждый раз сжимаете и разжимаете фотографию — после десяти таких операций от качества ничего не останется. Так и со звуком. Поэтому правило простое: работаем в WAV, а финальный результат можно сконвертировать в MP3 для публикации.
MP3 — это формат со сжатием и с потерями качества. Алгоритм MP3 анализирует звук и выбрасывает те частоты, которые человеческое ухо всё равно плохо слышит. За счёт этого размер файла уменьшается в десять и более раз по сравнению с WAV. Для финальной публикации это отлично: слушатель не заметит потери качества, а файл будет маленьким и быстрым для скачивания. Для промежуточной обработки MP3 не подходит, потому что при каждом сохранении потери накапливаются.
M4A — это формат, похожий на MP3, но с более эффективным сжатием. При том же размере файла качество M4A немного выше, чем у MP3. FLAC — это сжатие без потерь. Файл меньше, чем WAV, но больше, чем MP3, и при этом качество остаётся идеальным. Для архивного хранения FLAC — отличный выбор. Для нашей работы в Python — WAV вне конкуренции.
Если у вас есть файлы в других форматах, librosa может не справиться с их загрузкой без дополнительных инструментов. На этот случай есть библиотека pydub, которая умеет работать практически со всеми форматами. Установите её командой pip install pydub, и вы сможете конвертировать что угодно в WAV одной строкой кода. Но для простоты в этой книге мы будем исходить из того, что все исходные файлы уже в формате WAV.
Что мы узнали о звуке
Давайте подведём промежуточный итог. Мы начали с нуля — и теперь у нас есть работающий инструмент для анализа аудиофайлов. Мы знаем, что звук для компьютера — это просто длинный список чисел, измеряющих громкость много тысяч раз в секунду. Мы умеем загружать этот список в Python, измерять его длину, находить пиковую и среднюю громкость, отличать речь от тишины. Мы понимаем, почему формат WAV лучше для работы, а MP3 — для публикации. Мы написали несколько скриптов, каждый из которых делает полезную работу.
Это может показаться скромным началом, но не недооценивайте его. Вы только что освоили фундамент, на котором стоит вся обработка звука. Всё, что мы будем делать дальше — вырезать куски, склеивать, убирать шум, выравнивать громкость, — строится на этом фундаменте. Зная, как устроен звук внутри компьютера, вы сможете управлять им с точностью, недоступной ни одному графическому редактору. В следующих главах мы начнём это управление, и я обещаю: будет интересно.
Творческое задание
Прежде чем перейти к следующей главе, попробуйте применить полученные знания на практике. Проанализируйте несколько своих записей с помощью написанных скриптов. Найдите самую длинную и самую короткую запись. Найдите запись с самым большим процентом тишины. Найдите запись с самой высокой и самой низкой средней громкостью. Сравните цифры. Есть ли закономерности? Может быть, записи, сделанные утром, тише, чем вечерние? Или записи на определённую тему содержат больше пауз? Такое исследование собственного материала — первый шаг к тому, чтобы стать профессионалом. Вы начинаете видеть в звуке не просто шум, а структуру. И это видение останется с вами навсегда.
Также попробуйте записать один и тот же текст в разных условиях: в тихой комнате, при открытом окне, с работающим телевизором на фоне. Прогоните все три записи через скрипт анализа тишины и сравните результаты. Вы увидите, как шум влияет на способность детектора отличать речь от тишины. Это понимание пригодится нам в главе про шумоподавление.
И последнее: не бойтесь экспериментировать с кодом. Поменяйте параметр top_db с 30 на 20, на 40, на 10. Посмотрите, как меняется результат. Добавьте в вывод свои метрики — например, количество найденных речевых фрагментов. Чем больше вы играетесь с кодом, тем быстрее он становится для вас естественным языком, как родная речь. Код — это не магия, это навык. И как любой навык, он развивается практикой.
Чек-лист главы
Вы освоили первую главу, если: знаете, что звук внутри компьютера — это список чисел, измеряющих громкость; понимаете, что такое частота дискретизации и почему она равна 22050 для речи; умеете устанавливать Python и библиотеки через pip; можете загрузить WAV-файл в Python с помощью librosa.load; умеете измерять длительность записи, пиковую и среднюю громкость; можете проиграть аудио из кода через sounddevice; умеете находить участки речи и тишины с помощью librosa.effects.split; понимаете разницу между форматами WAV, MP3, FLAC и знаете, какой для чего использовать; написали и запустили свои первые Python-скрипты для анализа звука. В следующей главе мы перейдём от анализа к действию: научимся резать, склеивать и собирать аудиофайлы, как детали конструктора.
Глава 2. Учимся резать и склеивать звук
О чём эта глава
В предыдущей главе мы смотрели на звук и изучали его свойства. Мы были как учёные, которые исследуют образец под микроскопом. Теперь пришло время стать ремесленниками. Мы возьмём аудиофайлы в руки и начнём с ними работать: отрезать лишнее, соединять нужное, переставлять куски местами. Всё то, что обычно делается мышкой в программах вроде Audacity, мы будем делать кодом. Почему кодом, а не мышкой? Потому что код можно запустить повторно. Потому что код не устаёт и не ошибается от усталости. Потому что код может обработать сто файлов за время, которое вы тратите на ручную обработку одного. В этой главе мы напишем инструменты, которые превратят монтаж аудио из утомительной рутины в быстрое и приятное занятие. Мы научимся вырезать фрагменты из аудио, склеивать несколько файлов в один, добавлять паузы нужной длины, выравнивать громкость разных фрагментов и собирать полноценный эпизод подкаста из заготовок. К концу главы у вас будет скрипт, который делает всю черновую работу по монтажу за вас.
Как резать аудио в коде
Начнём с самого простого действия: отрезать кусок от начала или конца записи. Представьте, что вы записали подкаст. Вы начали запись, проверили микрофон, сказали «раз-раз, меня слышно?», потом выпили воды, прокашлялись и только через три минуты начали говорить по делу. Эти три минуты не должны попасть в финальную версию. Более того, в конце записи вы, скорее всего, скажете что-то вроде «Всё, выключаю запись. Ой, она ещё пишет? Ну всё, пока». Эти последние десять секунд тоже нужно убрать. В графическом редакторе вы бы выделили ненужный фрагмент мышкой и нажали Delete. В коде мы сделаем то же самое, только вместо мышки у нас будут индексы массива.
Вспомним, что наш аудиофайл — это массив чисел y. Каждое число имеет свой порядковый номер, или индекс. Первое число имеет индекс ноль, второе — индекс один, сотое — индекс девяносто девять. В Python мы можем взять любую часть массива, указав начальный и конечный индекс в квадратных скобках через двоеточие. Это называется срез. Если мы хотим убрать первые три минуты, нам нужно выбросить все числа с нулевого индекса до индекса, соответствующего трём минутам. А этот индекс мы вычисляем умножением: три минуты — это сто восемьдесят секунд, умножаем на частоту дискретизации 22050, получаем около четырёх миллионов. Значит, нам нужны все числа начиная с индекса четыре миллиона и до конца массива.
Вот как это выглядит в коде:
python
import librosa
import soundfile as sf
y, sr = librosa.load('long_record.wav')
# Сколько секунд отрезать от начала
cut_seconds = 180
cut_samples = cut_seconds * sr
# Берём всё, начиная с cut_samples и до конца