Ich sage euch: man muß noch Chaos in sich haben, um einen tanzenden Stern gebären zu können (“Also sprach Zarathustra”, Friedrich Nietzsche)
Как воспроизводить и записывать аудио на Python
Масса приложений записывает голос и воспроизводит звуки, если вы тоже этого хотите, то попали в нужное место и в нужное время. В этом уроке мы будем использовать разные библиотеки Python для воспроизведения и записи звука на Python.
Давайте установим необходимые библиотеки для этого урока:
Во-первых, начнем с самого простого модуля звукового сопровождения?, playsound:
from playsound import playsound
playsound("audio_file.mp3")
Да, этот модуль нам нужен и это, в основном, чистый Python, кроссплатформенный, однофункциональный модуль. В документации сказано, что работают расширения WAV и MP3, а также есть и другие форматы аудиозаписи.
Функция playsound() воспроизводит звук аудиофайла и блокирует его до тех пор, пока чтение файла не будет завершено. Можете передать block = False для того, что-бы функция работала асинхронно.
Другой альтернативой является использование библиотеки Pydub:
from pydub import AudioSegment
from pydub.playback import play
# читать файл MP3
song = AudioSegment.from_mp3("audio_file.mp3")
# song = AudioSegment.from_wav("audio_file.wav")
# you can also read from other formats such as MP4
# song = AudioSegment.from_file("audio_file.mp4", "mp4")
play(song)
Примечание: на вашем компьютере должен быть установлен ffmpeg, чтобы использовать функцию AudioSegment.from_file(), которая поддерживает все форматы, поддерживаемые ffmpeg.
Pydub — довольно популярная библиотека, поскольку она предназначена не только для воспроизведения звука, вы можете использовать ее для разных целей, таких как преобразование аудиофайлов, нарезка звука, увеличение или уменьшение громкости, и многое другое, просмотрите их репозиторий для получения дополнительной информации.
Если вы хотите воспроизводить аудио с помощью PyAudio, пройдите по этой ссылке.
Диктофон
Для записи голоса воспользуемся библиотекой PyAudio, так как это наиболее удобный подход:
import pyaudio
import wave
# имя файла для записи
filename = "recorded.wav"
# установить размер блока в 1024 сэмпла
chunk = 1024
# образец формата
FORMAT = pyaudio.paInt16
# моно, если хотите стере измените на 2
channels = 1
# 44100 сэмплов в секунду
sample_rate = 44100
record_seconds = 5
# initialize PyAudio object
p = pyaudio.PyAudio()
# открыть объект потока как ввод и вывод
stream = p.open(format=FORMAT,
channels=channels,
rate=sample_rate,
input=True,
output=True,
frames_per_buffer=chunk)
frames = []
print("Recording...")
for i in range(int(44100 / chunk * record_seconds)):
data = stream.read(chunk)
# если вы хотите слышать свой голос во время записи
# stream.write(data)
frames.append(data)
print("Finished recording.")
# остановить и закрыть поток
stream.stop_stream()
stream.close()
# завершить работу объекта pyaudio
p.terminate()
# сохранить аудиофайл
# открываем файл в режиме 'запись байтов'
wf = wave.open(filename, "wb")
# установить каналы
wf.setnchannels(channels)
# установить формат образца
wf.setsampwidth(p.get_sample_size(FORMAT))
# установить частоту дискретизации
wf.setframerate(sample_rate)
# записываем кадры как байты
wf.writeframes(b"".join(frames))
# закрыть файл
wf.close()
Приведенный выше код в основном инициализирует объект PyAudio, а затем мы открываем объект потока, который позволяет нам записывать с микрофона с помощью метода stream.read(). После того, как мы закончили запись, используем встроенный волновой модуль для записи аудиофайла WAV на диск.
Если вы установите input = True в методе p.open(), то сможете использовать stream.read() для записи с микрофона. Кроме того, если вы установите output = True, то сможете использовать stream.write() для воспроизведения через динамик.
Заключение
Хорошо, здесь вы узнали, как воспроизводить аудиофайлы с помощью библиотек playsound, Pydub и PyAudio, а также записывать голос с помощью PyAudio.
Для вас есть большая задача — объединить звук с устройством записи экрана и получите инструмент Python, который одновременно записывает голос и экран. Нужно будет использовать поток, который записывает звук, и другой поток для записи экрана, удачи!