Python. Используем PyAudio для записи звука
В этой публикации мы расмотрим как при помощи библиотеки PyAudio записать звук из любого источника, будь то микрофон, микшер или что-то еще. Перед началом работы надо установить библиотеку , для разных ОС существуют разные способы установки:
Работа с PyAudio
PyAudio — это библиотека предоставляет возможность записи аудио(звука) с помощью Python. PyAudio записывает полученный аудио поток в объекты типа bytes. В последующем данные могут быть сохранены в виде файлов WAV с использованием таких библиотек как scipy или wave соответственно. Для того что бы записать звук например с микрофона, нам надо определить идентификатор используемого устройства, в нашем случае микрофона.
Для этого нам надо написать следующий код, который выведет нам весь список доступных устройств и их идентификаторы:
после запуска скрипта мы получим список всех устройств и их идентификаторы:
В полученном списке мы ищем запись "Микрофон" и определяем его идентификатор, который равен 2. Далее этот идентификатор мы будем использовать в настроках PyAudio. Прежде чем использовать библиотеку PyAudio нам надо определить некоторые параметры:
- format — размер семпла и его формат (pyaudio.paInt16, pyaudio.paInt24, pyaudio.paInt8)
- channels — кол-во каналов аудио (обычно 2)
- frames_per_buffer — размер буффера записи
- rate — частота дискритизации 96000, 44100, 22050, 11025, 8000
- input_device_index — идентификатор устройства
- input — вывод True или False
Как будет работать запись: для начала надо будет инициализовать поток PyAudio через параметры. Далее в цикле будем записывать кусками данные в массив, после того как закончиться запись мы запишем все данные в файл.
Пример кода
Пример кода для записи звука:
после выполнения скрипта мы получим wav файл который можно открыть в любом плеере.
Запись аудиофайла в массив байтов
Запись байтов в массив char
Есть переменная типа char ch как можно записать туда числа в таком порядке в какой я хочу, у меня.
Запись звука в массив байтов
Если в кратце, то. то мне нужно получить байты с микрофона и записать из в массив/байтов. Я уже.
Как звуковую волну перегнать из аудиофайла в массив?
Всем привет! У меня такая задачка( не знаю с чего начать): Есть аудиозапись с речью. Нужно.
Получить массив байтов из int32_t
Собственно сабж! Самое элегантное решение, но как мне кажется не совсем безопасное это что-то.
огромное спасибо! буду разбираться)
Добавлено через 25 минут
Сообщение от soon
вот такие ошибки получаются:
IntelliSense: невозможно вывести тип "авто" (требуется инициализатор)
IntelliSense: для ссылки переменная "it" требуется инициализатор
IntelliSense: требуется выражение
может не хватает каких библиотек??
Версия компилятора? Есть подозрение, что он не поддерживает range-based-for
Можете заменить на
soon, вообщемто очень дорогостоящая реализация — допустим файл mp3 5Мб — это 5 * 1024 * 1024 объектов std::bitset — конечно современный комьютер все вытерпит..
Flamе, попробуйте
Сообщение от soon
Версия компилятора? Есть подозрение, что он не поддерживает range-based-for
Можете заменить на
alex_x_x, а разве не 5 * 1024 * 128?
В общем-то да, многовато. Хотя без вывода у меня работает меньше секунды, а с выводом
Сообщение от alex_x_x
Загрузка файла в массив байтов
не подскажите как можно загрузить файл и сохранить его не в файл на пк, а в переменную байтов? т.е.
Перевод массива символов в массив байтов
Допустим читаем из txt набор символов 4e5he56R8G потом превращаем его в байты, таким образом. Два.
Как правильно объявить массив байтов?
Как правильно объявить массив байтов? Надо ли вручную выставлять ему размер после "GetBitmapBits".
Можно ли заполнить массив байтов используя оператор ‘<< ‘ ?
Всем здравствуйте. Есть буфер для приёма байтов, заполняющийся в процессе работы программы.
Преобразование wav файла в массив
Всем привет. Нужно выполнить DFT преобразование wav-файла. Функция имеется, графики строятся(по числовым данным), не понимаю как вытащить данные из wav файла чтобы обработать их. Все вышеописанное реализовано в Qt. Сам Qt не знаю толком, изучаю впопыхах. Помогите реализовать функцию «вытаскивающую» данные из wav файла для построения графика/спектра.
Сначало надо определить формат файла, частоту, битность и количество каналов.
Если PCM — то всё просто. Например для 16 бит, 44кГц стерео:
пропускаешь заголовок файла, потом двигаешь указатель по 32 бита, 16 с однгого канала, 16 с другого. секундный буфер это 44000 раз так передвинуть указатель. Закидываешь это в моно. Например можно проигнорировать второй канал. Я по какойто формуле миксовал 2 канала вместе.
Для моно звука сишным преобразованием типа (int16 *) получаешь данные для формулы DFT.
Если там adpcm, mp3, ac3 или ещё что, то надо протажить это через кодек. Библииотека phonon или vlc поможет.
Аудио сигнал в массив чем записать

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

- Кассетный магнитофон или музыкальный центр с кассетной декой. Если у вас такого нет, у кого-то из знакомых наверняка ещё остался.

- Звуковой кабель AUX. С одной стороны — 3,5 мм аудио-разъём (mini-jack), а со второй — 2 RCA («тюльпаны», композитные, «колокольчики», AV-разъёмы). Спросите в магазине «миниджек на два тюльпана» — вас поймут

- Ищем на магнитофоне/музыкольном центре «Line out» выходы, подключаем к ним тюльпаны.

- Другой стороной втыкаем кабель в линейный вход звуковой карты нашего компьютера. Напомню, обычно он синего цвета.

Как прочитать данные из файла WAV в массив
Мне нужно получить все образцы wav файла в массив (или два, если вам нужно сделать это, чтобы сохранить стерео), чтобы я мог применить к ним некоторые изменения. Мне было интересно, легко ли это сделать (желательно без внешних библиотек). У меня нет опыта чтения в звуковых файлах, поэтому я мало знаю об этом.
7 ответов
Файлы WAV (по крайней мере, несжатые) довольно просты. Там заголовок, затем данные следуют за ним.
Этот код должен сделать трюк. Он преобразует волновой файл в нормализованный двойной массив (от -1 до 1), но он должен быть тривиальным, чтобы вместо него сделать int/short array (удалить бит /32768.0 и добавить 32768 вместо этого). Массив right[] будет установлен равным null, если найденный wav файл будет моно.
Я не могу утверждать, что он полностью пуленепробиваемый (потенциальные ошибки «один за другим» ), но после создания массива выборок 65536 и создания волны от -1 до 1 ни один из образцов, похоже, не переходит «через», потолок или пол.
Предполагая, что ваш WAV файл содержит 16-битный PCM (который является наиболее распространенным), вы можете использовать NAudio, чтобы прочитать его в массив байтов, а затем скопируйте его в массив из 16-битных целых чисел для удобства. Если это стерео, образцы будут чередоваться влево, вправо.
Я знаю, что вы хотели избежать сторонних библиотек, но если вы хотите быть уверенным, что справляетесь с WAV файлами с дополнительными фрагментами, я предлагаю избегать таких подходов, как просто поиск 44 байта в файл.
В момент написания никто не обращался к 32-битным или 64-битным кодированным WAV.
Следующий код обрабатывает 16/32/64 бит и моно/стерео:
http://hourlyapps.blogspot.com/2008/07/open-source-wave-graph-c-net-control.html
Здесь находится элемент управления, отображающий спектр Wav файла, который также обслуживает байт [] декодированного Wav File, в котором вы можете играть и/или изменять свои значения.
Просто загрузите элемент управления, и это очень хорошо подходит для работы с файлами WAV.
Преобразование wav файла в массив
Всем привет. Нужно выполнить DFT преобразование wav-файла. Функция имеется, графики строятся(по числовым данным), не понимаю как вытащить данные из wav файла чтобы обработать их. Все вышеописанное реализовано в Qt. Сам Qt не знаю толком, изучаю впопыхах. Помогите реализовать функцию «вытаскивающую» данные из wav файла для построения графика/спектра.
Сначало надо определить формат файла, частоту, битность и количество каналов.
Если PCM — то всё просто. Например для 16 бит, 44кГц стерео:
пропускаешь заголовок файла, потом двигаешь указатель по 32 бита, 16 с однгого канала, 16 с другого. секундный буфер это 44000 раз так передвинуть указатель. Закидываешь это в моно. Например можно проигнорировать второй канал. Я по какойто формуле миксовал 2 канала вместе.
Для моно звука сишным преобразованием типа (int16 *) получаешь данные для формулы DFT.
Если там adpcm, mp3, ac3 или ещё что, то надо протажить это через кодек. Библииотека phonon или vlc поможет.
Как преобразовать аудио в массив в python?
Добрый день. У меня есть аудиофайл, который нужно представить в виде массива чисел. Не могу найти решение на python.
Аудиофайл — массив — аудиофайл.
- Вопрос задан более двух лет назад
- 1856 просмотров
- Вконтакте

Мало данных. Если ваш аудиофайл в WAV формате, то это уже фактически массив данных, который вам нужен. Достаточно отрезать от него «шапку», посмотреть в шапке битрейт и число каналов и соответственно интерпретировать как массив сэмплов нужной битности.
Если файл закодирован кодеком (mp3, ogg, и т.д.), то сперва надо декодировать файл, а потом уже смотри, как говорится, первый пункт.
Как именно это будет выгядеть в коде зависит от того, какой формат, какие библиотеки для работы с массивами анных используете. Конкретизируйте, пожалуйста.
Это три перые ссылки в гугле. Если вы это найти не смогли, то прочь из профессии.
- Вконтакте
Вот именно как сделать
«отрезать от него «шапку», посмотреть в шапке битрейт и число каналов и соответственно интерпретировать как массив сэмплов нужной битности.»

Это три перые ссылки в гугле. Если вы это найти не смогли, то прочь из профессии.

Если ты хочешь работать со звуком — то свой mp3 (или любой другой сжатый формат) надо вначале перевести в wav.
А дальше для работы со звуком есть библиотека wave — там можно получить биты.
