Python для творческих. Звук на твоей стороне

- -
- 100%
- +
Третье. Вам не нужно становиться программистом. Вы не будете писать код с нуля. Вы будете копировать готовые скрипты, подставляя в них название своего файла. И запускать. Всё. Постепенно вы начнете понимать, что именно происходит в коде, и сможете его менять под свои нужды. Но это произойдет естественно, без насилия над мозгом.
Четвертое. Я проверил эту методику на живых людях. Моя жена — филолог, она до знакомства со мной никогда не открывала командную строку. Сейчас она обрабатывает свои аудиозаписи для языковых курсов с помощью скриптов, которые я ей когда-то настроил. Через месяц она уже сама поправила в них пару параметров. Через три — написала свой первый мини-скрипт для обрезки тишины в начале и конце файла. Если смогла она — сможете и вы. Филолог победил код. Код не такой страшный, как кажется.
Как пользоваться книгой: три сценария
У людей разные цели и разный стиль обучения. Я спроектировал эту книгу так, чтобы она работала для трех типов читателей. Выберите свой сценарий.
Сценарий «Дай готовое».
Вы хотите просто решить проблему со звуком и не вдаваться в детали. Отлично. Откройте нужную главу. Найдите раздел «Код». Скопируйте скрипт целиком. Подставьте название своего файла. Запустите. Результат готов. Раздел «За кулисами» пропускайте без зазрения совести. Вы пришли за инструментом — берите инструмент. Никто не заставляет вас изучать устройство дрели, чтобы просверлить дырку в стене.
Сценарий «Хочу понимать».
Вы хотите не просто применять готовые решения, но и понимать, что именно происходит. Тогда читайте главу целиком. Раздел «За кулисами» для вас — основной. После каждой главы вы будете не просто уметь чинить звук, но и понимать, почему этот метод работает, а другой нет. Через несколько глав вы начнете соединять приемы в собственные цепочки обработки. Вы будете не просто пользователем, а мастером.
Сценарий «Хочу углубиться».
Вам мало того, что в книге. Вы хотите экспериментировать, ломать и чинить, создавать свои инструменты. Тогда ваша любимая часть — «Творческий практикум» в конце каждой главы. Там я даю идеи, которые выводят за пределы основного материала. Что будет, если применить шумоподавление дважды? А если сначала изменить голос, а потом убрать шум — результат изменится? А можно ли соединить два скрипта в один конвейер? Дерзайте. Код из этой книги — ваш полигон для экспериментов.
Независимо от выбранного сценария, помните главное: вы не обязаны проходить книгу от корки до корки. Глава 4 не требует прочтения Глав 1–3. Каждая глава самодостаточна. Захотелось прямо сейчас сделать радио-голос — открыли Главу 9 и сделали. Потом понадобилось убрать шум — вернулись к Главе 4. Книга — это набор инструментов, а не роман с сюжетом. Используйте ее как удобно.
Глава 1. Знакомимся со звуком через Python
«Твой голос заслуживает того, чтобы звучать профессионально. Даже если ты записываешь на кухне с воющим холодильником»
О чём эта глава
Вы когда-нибудь открывали аудиофайл в программе и видели перед собой волны, пики и провалы? Вы смотрите на них и, возможно, думаете: «Красиво, но что с этим делать?» В этой главе мы научимся не просто смотреть на звук, а понимать его. Мы загрузим аудиофайл в Python, разберём его на составные части и узнаем о нём то, что невозможно узнать ушами. Мы узнаем его точную длительность, громкость, количество тишины и речи. А главное — мы поймём, как компьютер представляет звук внутри себя. Это фундамент, на котором строится вся дальнейшая работа. Без этого фундамента нельзя двигаться дальше, как нельзя строить дом без знания того, из чего сделан фундамент. Мы начнём с самых основ, и я обещаю: если вы никогда в жизни не писали код, через час вы напишете свой первый работающий скрипт и он сделает что-то полезное.
Что такое звук для компьютера
Давайте начнём с простого вопроса. Вы слышите музыку, голос, шум улицы. Это всё — звук. Но что такое звук для компьютера? Компьютер не имеет ушей. Он не слышит так, как слышим мы с вами. Для компьютера звук — это просто очень длинный список чисел. Представьте себе линейку, на которой вы отмечаете высоту волны в каждый момент времени. Или представьте, что вы фотографируете поверхность воды в озере много тысяч раз в секунду. Каждая фотография показывает вам одно число: насколько высоко поднялась вода в этой точке. Сложите все эти числа в ряд — и вы получите цифровое представление звука.
Этот ряд чисел называется аудиосигналом. Когда вы записываете голос на телефон, микрофон телефона колеблется от вашего голоса. Специальная электронная схема измеряет положение микрофона много тысяч раз в секунду и записывает каждое измерение в виде числа. Чем чаще происходят измерения, тем точнее запись. Стандартное значение — сорок четыре тысячи сто измерений в секунду для музыки и двадцать две тысячи пятьдесят для речи. Это называется частотой дискретизации. Звучит сложно, но суть простая: это просто количество чисел, которое компьютер сохраняет за одну секунду звука. Двадцать две тысячи чисел в секунду для речи — это более чем достаточно. Человеческий голос не забирается так высоко по частоте, как музыка, поэтому речь можно записывать с меньшей плотностью чисел, и качество не пострадает.
Почему именно такие числа, а не круглые двадцать тысяч или пятьдесят тысяч? Тут есть интересная история. Существует правило, открытое инженерами Найквистом и Шенноном: чтобы точно записать звук определённой высоты, нужно делать измерения как минимум вдвое чаще, чем колеблется сам звук. Человеческое ухо слышит звуки примерно до двадцати тысяч колебаний в секунду. Значит, чтобы записать всё, что слышит человек, нужно не менее сорока тысяч измерений в секунду. На аудиодисках используется сорок четыре тысячи сто — это чуть больше сорока тысяч, взятое с запасом. А двадцать две тысячи пятьдесят — это ровно половина от дискового стандарта, чего вполне хватает для голоса. Голос редко поднимается выше восьми тысяч колебаний в секунду, поэтому двадцати двух тысяч измерений более чем достаточно. Такой выбор экономит место на диске и ускоряет обработку. Одна минута речи в таком качестве занимает около двух с половиной мегабайт — сущий пустяк для современного компьютера.
Теперь давайте представим сам список чисел. Каждое число в этом списке — это значение громкости в конкретный момент. Обычно эти числа лежат в диапазоне от минус единицы до плюс единицы. Минус один — это максимальная громкость в отрицательном направлении, когда мембрана динамика уходит назад. Плюс один — максимальная громкость вперёд. Ноль — это тишина, положение покоя. Реальный звук колеблется вокруг нуля: то в плюс, то в минус, то снова в плюс. Если вы посмотрите на эти числа, то увидите, как они танцуют вокруг нуля. Громкий звук — это большие числа, близкие к единице или минус единице. Тихий звук — это маленькие числа, близкие к нулю. Тишина — это почти ноль. Шум — это много маленьких случайных чисел, которые немного отклоняются от нуля, но не уходят далеко.
Установка всего необходимого
Прежде чем мы начнём работать со звуком, нам нужно подготовить инструменты. Это как перед приготовлением обеда: сначала достаём кастрюли и продукты, потом готовим. Нам понадобится Python — это язык программирования, на котором мы будем писать наши инструкции для компьютера. И нам понадобятся несколько библиотек — это готовые наборы инструментов для работы со звуком, которые другие программисты уже написали за нас. Мы не будем изобретать велосипед, а воспользуемся их трудом.
Установка Python — это очень просто. Идите на сайт python.org. Прямо на главной странице вы увидите большую кнопку «Download Python» с номером версии. Смело нажимайте её. Скачается установщик. Запустите его. На первом экране установщика обязательно поставьте галочку внизу, которая называется «Add Python to PATH». Эта галочка говорит компьютеру: «Запомни, где лежит Python, чтобы я мог запускать его из любой папки». Если пропустите эту галочку, потом придётся немного повозиться с настройками. Ничего страшного, просто переустановите Python ещё раз и на этот раз галочку поставьте. Дальше нажимайте «Install Now» и ждите минуту. Всё, Python на вашем компьютере.
Теперь проверим, что Python работает. Откройте программу «Командная строка», если у вас Windows — нажмите клавишу Windows, начните вводить слово «cmd», нажмите Enter. Если у вас Mac или Linux, откройте «Терминал». В появившемся чёрном окошке введите команду python --version и нажмите Enter. Если Python установился, вы увидите что-то вроде «Python 3.12.1» — номер версии. Если видите ошибку, скорее всего, вы не поставили ту самую галочку при установке. Переустановите Python, галочку поставьте, и всё получится.
Следующий шаг — установка библиотек. Библиотеки в Python — это как дополнительные кухонные приборы. Сам по себе Python умеет многое, но для работы со звуком ему нужны специальные инструменты. К счастью, установка библиотек делается одной командой. В той же командной строке введите по очереди три команды, нажимая Enter после каждой:
pip install librosa
pip install soundfile
pip install sounddevice
Каждая команда скачает из интернета нужную библиотеку и установит её. Вы увидите бегущие строчки с процентами — это нормально. Когда установка закончится, командная строка снова будет ждать вашего ввода. Это значит, всё прошло успешно.
Что делает каждая библиотека? librosa — это наш главный инструмент для работы со звуком. Она умеет загружать аудиофайлы, анализировать их, извлекать из них информацию. soundfile умеет сохранять обработанный звук обратно в файл. sounddevice умеет проигрывать звук прямо из кода, чтобы мы могли быстро проверить результат. Все три библиотеки бесплатны и созданы сообществом программистов со всего мира.
Теперь создайте на рабочем столе папку с любым названием, например audio_book. В этой папке мы будем хранить все наши скрипты и аудиофайлы. Порядок на компьютере — это важно. Когда все файлы лежат в одной папке, их легко найти и с ними удобно работать.
Ваш первый скрипт: загружаем аудио
Настал момент написать наш первый код. Не пугайтесь слова «код». Код — это просто инструкция для компьютера, записанная на особом языке. Если вы можете объяснить другому человеку, как сделать бутерброд, вы можете написать код. Это такое же пошаговое описание действий, только адресованное не человеку, а машине.
Откройте любой текстовый редактор. На Windows можно использовать Блокнот, но я рекомендую скачать бесплатную программу Visual Studio Code — она удобнее, потому что подсвечивает код разными цветами и помогает не ошибаться. Создайте новый файл и сохраните его в нашей папке с именем first_script.py. Расширение .py говорит компьютеру, что это программа на Python. Это важно: если вы сохраните файл как .txt, Python не поймёт, что это код.
Теперь впишите в файл следующие строчки. Не обязательно понимать прямо сейчас каждую из них — мы разберём всё по шагам сразу после того, как запустим. Просто напечатайте их внимательно, соблюдая все отступы и знаки препинания. В Python регистр букв имеет значение: Print и print — это разные слова для компьютера. Пишите всё маленькими буквами, как в примере.
python
import librosa
y, sr = librosa.load('my_voice.wav')
print("Файл загружен!")
print(f"Частота измерений: {sr} раз в секунду")
print(f"Длина записи: {len(y) / sr:.2f} секунд")
print(f"Всего чисел в файле: {len(y)}")
Нажмите «Сохранить». Теперь вернитесь в командную строку. Нам нужно перейти в папку, где лежит наш скрипт. В командной строке введите команду cd Desktop/audio_book и нажмите Enter. cd означает «change directory», то есть «сменить папку». Теперь командная строка находится внутри нашей рабочей папки.
Прежде чем запускать скрипт, нам нужен аудиофайл. Если у вас уже есть запись голоса в формате WAV, скопируйте её в папку audio_book и переименуйте в my_voice.wav. Если нет — не беда. Откройте диктофон на телефоне, наговорите минуту любого текста — например, прочитайте вслух рецепт борща или опишите, что вы видите за окном. Перекиньте файл на компьютер, положите в папку audio_book и назовите my_voice.wav. Формат WAV обязателен: librosa лучше всего работает именно с WAV-файлами. Если ваш файл в другом формате, например MP3 или M4A, вы можете конвертировать его в WAV с помощью бесплатной программы Audacity или онлайн-конвертера. В следующих главах я покажу, как конвертировать форматы прямо в коде, а пока — пусть будет WAV.
Всё готово. В командной строке введите python first_script.py и нажмите Enter. Если всё сделано правильно, вы увидите на экране что-то вроде:
text
Файл загружен!
Частота измерений: 22050 раз в секунду
Длина записи: 58.34 секунд
Всего чисел в файле: 1286397
Поздравляю! Вы только что написали и запустили свою первую программу на Python. Она сделала полезное дело: загрузила аудиофайл и рассказала о нём главное. Теперь давайте разберём, что именно произошло.
Разбор кода: строка за строкой
import librosa — этой строкой мы говорим Python: «Достань с полки инструмент под названием librosa, он нам понадобится». В языке Python все дополнительные возможности хранятся в библиотеках. Чтобы воспользоваться библиотекой, её нужно сначала импортировать — то есть подключить. Это как включить кухонный комбайн в розетку перед использованием. Без этой строчки Python не будет знать, что мы вообще собираемся работать со звуком.
y, sr = librosa.load('my_voice.wav') — это главная строка скрипта. Она делает сразу несколько вещей. Во-первых, она ищет файл с именем my_voice.wav в той же папке, где лежит скрипт. Во-вторых, она считывает его содержимое и превращает в те самые списки чисел, о которых мы говорили. В-третьих, она возвращает нам два значения. Первое значение — это массив чисел y. Каждое число в этом массиве — одно измерение громкости. Второе значение — частота дискретизации sr, то есть сколько раз в секунду делались эти измерения. Мы сохраняем эти два значения в две переменные с короткими именами y и sr, чтобы потом было удобно к ним обращаться. Переменная — это просто коробочка с именем, в которую можно положить значение и потом достать его, когда понадобится.
print("Файл загружен!") — выводит сообщение на экран. Функция print — это способ Python поговорить с нами. Всё, что внутри скобок и кавычек, появится на экране. Это полезно для того, чтобы понимать, что скрипт работает и дошёл до определённой точки.
print(f"Частота измерений: {sr} раз в секунду") — здесь мы используем особый вид строк, который называется f-строка. Буква f перед открывающей кавычкой говорит Python: «Внутри этой строки могут быть фигурные скобки, и всё, что в них, нужно заменить на значения переменных». Python видит фигурные скобки {sr}, смотрит, что в переменной sr лежит число 22050, подставляет это число в строку, и на экране мы видим «Частота измерений: 22050 раз в секунду». Удобно и читаемо.
print(f"Длина записи: {len(y) / sr:.2f} секунд") — здесь мы считаем длительность записи. len(y) — это функция, которая возвращает длину массива y, то есть общее количество чисел в нём. Делим это количество на частоту дискретизации sr и получаем длительность в секундах. Двоеточие и .2f в конце говорят Python: «Покажи результат с двумя знаками после запятой, не нужно больше». Если файл длится почти минуту, мы увидим «58.34 секунд», а не «58.3412345...» с кучей лишних цифр.
print(f"Всего чисел в файле: {len(y)}") — просто показываем общее количество измерений в файле. Для минутной записи это число будет больше миллиона. Представляете, сколько данных? Миллион точек только для того, чтобы описать одну минуту речи. А теперь представьте, что компьютер обрабатывает этот миллион точек за доли секунды. Именно поэтому программирование — это мощный инструмент.
Продолжаем знакомство: измеряем громкость
Теперь, когда мы умеем загружать файл и узнавать его базовые характеристики, давайте научимся измерять громкость. Это пригодится нам во всех следующих главах. Дополните ваш скрипт новыми строками:
python
import numpy as np
max_volume = np.max(np.abs(y))
min_volume = np.min(y)
avg_volume = np.mean(np.abs(y))
print(f"Самая большая громкость: {max_volume:.4f}")
print(f"Самая маленькая громкость: {min_volume:.4f}")
print(f"Средняя громкость: {avg_volume:.4f}")
Сначала мы импортируем ещё одну библиотеку — numpy. Это библиотека для работы с массивами чисел. Она умеет делать вычисления над целыми массивами быстро и удобно. np — это короткое имя, которое мы даём библиотеке при импорте, чтобы не писать numpy каждый раз полностью. Сокращение np — общепринятое, все программисты его используют.
np.max(np.abs(y)) — здесь мы делаем три вещи за один раз. Сначала np.abs(y) берёт весь массив y и превращает все отрицательные числа в положительные, не трогая уже положительные. Минус ноль пять становится плюс ноль пять. Плюс ноль три остаётся плюс ноль три. Это нужно потому, что громкость нас интересует без знака: неважно, вперёд идёт мембрана динамика или назад, она в обоих случаях создаёт звуковое давление. Затем np.max находит самое большое число в получившемся массиве. Это и есть пиковая громкость — самый громкий момент записи.
np.min(y) находит самое маленькое число в оригинальном массиве, без взятия модуля. Обычно это отрицательное число, близкое к минус единице. Интересно посмотреть на него и сравнить с максимумом: если они примерно равны по модулю, значит, запись симметрична, что хорошо. Если максимум сильно отличается от модуля минимума, возможно, с записью что-то не так — например, микрофон был смещён.
np.mean(np.abs(y)) считает среднюю абсолютную громкость. Мы снова берём модуль каждого числа, чтобы отрицательные и положительные не гасили друг друга, и затем вычисляем среднее арифметическое. Это число говорит нам, насколько запись громкая в целом, а не только в пиках. Две записи могут иметь одинаковую пиковую громкость, но совершенно разную среднюю. Первая может быть плотной и насыщенной, вторая — тихой с редкими громкими выкриками. Средняя громкость лучше отражает то, как человек воспринимает громкость на слух.
Слушаем аудио прямо из кода
Смотреть на числа интересно, но звук хочется ещё и слышать. Давайте научимся проигрывать аудиофайл прямо из Python-скрипта. Для этого мы используем библиотеку sounddevice, которую установили ранее. Добавьте в конец скрипта:
python
import sounddevice as sd
print("Сейчас вы услышите запись...")
sd.play(y, sr)
sd.wait()
print("Воспроизведение закончено.")
sd.play(y, sr) говорит компьютеру: «Возьми массив чисел y и отправь его в динамики, воспроизводя с частотой sr измерений в секунду». Компьютер начинает проигрывать звук и в этот же момент продолжает выполнять следующие строчки кода. Поэтому следующая строка критически важна: sd.wait() говорит компьютеру: «Стой здесь и жди, пока воспроизведение не закончится». Если убрать эту строку, скрипт запустит проигрывание и тут же закроется, музыка оборвётся через долю секунды. Мы этого не хотим, поэтому ждём.
Теперь у вас есть полноценный инструмент для первичного анализа аудиофайлов. Вы можете загрузить любой WAV-файл, узнать его длительность, частоту дискретизации, пиковую и среднюю громкость, а затем прослушать его. Сохраните этот скрипт — мы будем использовать его на протяжении всей книги для быстрой проверки результатов.
Находим тишину в записи
Следующий важный навык — умение отличать речь от тишины. В любой записи, сделанной без подготовки, есть паузы: между предложениями, между словами, иногда просто потому что вы задумались или отвлеклись. Слушатель не обязан ждать, пока вы соберётесь с мыслями. Слушатель хочет получать информацию плотно и без проволочек. Поэтому нам нужно уметь находить тишину. Сначала — чтобы измерить её количество, а в следующих главах — чтобы её сократить.
Библиотека librosa содержит удобную функцию для поиска тишины. Она называется split и делает ровно то, что нам нужно: находит в аудио непрерывные участки, где есть значимый звук. Всё, что между этими участками — тишина. Давайте напишем скрипт для анализа тишины:
python
import librosa
import numpy as np
y, sr = librosa.load('my_voice.wav')
intervals = librosa.effects.split(y, top_db=30)
total_speech = 0
for start, end in intervals:
duration = (end - start) / sr
total_speech += duration
total_length = len(y) / sr
silence = total_length - total_speech
print(f"Общая длина записи: {total_length:.2f} секунд")
print(f"Длина речи: {total_speech:.2f} секунд")
print(f"Длина тишины: {silence:.2f} секунд")
print(f"Тишина занимает {silence / total_length * 100:.1f} процентов записи")
Давайте разберём, что здесь происходит. librosa.effects.split(y, top_db=30) — это функция, которая сканирует весь массив y и ищет участки, где громкость достаточна, чтобы считать это речью. Параметр top_db=30 задаёт порог чувствительности. Число 30 означает, что всё, что тише самого громкого места в записи на 30 децибел, считается тишиной. Это довольно чувствительный порог, он хорошо работает для записей в тихой комнате. Если у вас шумно, можно уменьшить число до 20 или даже 15 — тогда детектор станет менее чувствительным и не будет принимать слабый шум за речь.
Функция возвращает список интервалов. Каждый интервал — это два числа: начало и конец участка речи, измеренные в количестве измерений от начала файла. В цикле 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 вне конкуренции.



