Play sounds on raspberry

Воспроизведение звуков на Raspberry Pi с помощью библиотеки PyGame

В данной статье мы рассмотрим как с помощью библиотеки PyGame (PyGame Library) и платы Raspberry Pi воспроизводить звуки. В этом проекте мы к контактам Raspberry Pi подсоединим несколько кнопок – при нажатии этих кнопок плата будет воспроизводить аудиофайлы, записанные в ее памяти. Аудиофайлы можно будет воспроизводить как последовательно, один за другим, так и совместно. То есть если мы нажмем одну кнопку, то плата Raspberry Pi будет воспроизводить один аудиофайл, а если нажмем несколько кнопок, то плата Raspberry Pi будет воспроизводить сразу несколько аудиофайлов. Более подробно все эти процессы можно посмотреть на видео, приведенном в конце статьи.

Схема расположения контактов ввода/вывода (GPIO) на плате Raspberry Pi показана на следующем рисунке. Более подробно об этих контактах вы можете прочитать в статье про мигание светодиода с помощью Raspberry Pi.

Каждый из 17 универсальных контактов ввода/вывода (GPIO) может выдерживать ток до 15mA. А суммарный ток от всех контактов ввода/вывода не должен превышать 50mA – таким образом, в среднем на каждый контакт будет приходиться ток примерно 3mA. В этом проекте мы будем использовать резисторы для ограничения тока через контакты платы Raspberry Pi.

Необходимые компоненты

  1. Плата Raspberry Pi (купить на AliExpress).
  2. Громкоговоритель.
  3. Резистор 1 кОм – 6 шт. (купить на AliExpress).
  4. Кнопка – 6 шт.
  5. Конденсатор 1000 мкФ (купить на AliExpress).
  6. Источник питания.
  7. Макетная плата.
  8. Соединительные провода.

Объяснение работы проекта

В этом проекте мы будем воспроизводить звуки (аудиофайлы) при помощи нажатия кнопок, подключенных к плате Raspberry Pi. Мы будем использовать 6 кнопок для воспроизведения 6 аудиофайлов. При желании, вы можете увеличить количество кнопок и проигрываемых аудиофайлов в этом проекте.

Для реализации данного проекта, прежде всего, выполните следующую последовательность шагов:

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

2. Создайте новую папку на рабочем столе Raspberry Pi OS и назовите ее “PI SOUND BOARD”.

3. Распакуйте скачанный архив с аудиофайлами в эту папку.

4. Откройте окно терминала в Raspberry Pi OS и введите там следующую команду:

Источник

Playing sounds with Python on a Raspberry Pi

Today I needed to play back an MP3 or WAV file through a USB audio device on a Raspberry Pi, in a Python script. «Should be easy!» I thought!

Well, a couple hours later I decided to write this blog post to document the easiest way to do it, since I had to take quite a journey to get to the point where sound actually plays through the USB audio output.

The problem is most guides, like this simple one from Raspberry Pi’s project site, assume two things:

  1. Your Raspberry Pi has a default sound device (e.g. 0 ) that works already
  2. You’re running code interactively or in some way that it magically works without understanding how the underlying APIs work

The problem is, in my case, running a USB sound device off a headless Raspberry Pi Zero, neither of those assumptions were true.

Getting USB Audio working

The first step is to detect the USB audio device, and to tell your system to use it as the default audio device. There are other ways to detect and/or choose a specific device in the Python code itself, but it’s easiest if you can just set the default system-wide and let Python use that default.

First, you need to make sure your sound device (in my case a little $9 Vantec NBA-120U adapter) is recognized. Run the following command, and you should see it listed as the device with ‘USB’ in the name:

Some Pi models will also show a 0 for a built-in device (e.g. the sound output on a model B version). By default, the ALSA (Advanced Linux Sound Architecture) audio system will try to use device 0 , no matter what. To tell it to use device 1 (the snd_usb_audio device), you can configure either the global /etc/asound.conf file, or a user-local

Inside one of those two files (I chose to configure the Pi user’s

/.asoundrc file), put the following contents:

This tells ALSA to default to card 1 , the USB device. Now, to test that it’s working, plug headphones or speakers into the output, and run:

You should start hearing sounds like «front left» and «front right» through your speakers or headphones.

Playing back sound with pygame.mixer

I had a simple «ding.wav» file that was the sound of a bell dinging, for my Raspberry Pi Bell Slapper project. I wanted to set it up so the Pi would not only ding a physical bell with a solenoid connected to the Pi’s GPIO, but it also a ding sound through speakers so someone could hear the ding in another room.

Here’s the minimal Python code required to play the file using pygame :

This requires pygame , which can be installed with pip3 install pygame . Pygame will also fail without the required mixer libraries, so you also need to run apt-get install libsdl2-mixer-2.0-0 .

Once you’ve done that, you should be able to run the script ( python3 play-sound.py ), and it should play the file.

The while loop at the end is important—without it, the script will exit before the sound even gets a chance to play! That was the last bit that was missing from all the ‘play sound with Python’ tutorials I was seeing, and it’s thanks to user1509818 that I found it.

Источник

Распределенный музыкальный плейер на Raspberry Pi


Давно собирался написать этот пост, но прогресс шел медленно. К ускорению темпа подтолкнул этот вопрос, где я имел неосторожность обмолвиться, что пишу такой пост, в результате чего он вызвал живой интерес, поэтому мне ничего не оставалось делать, как выполнять данное обещание, за что выражаю отдельную благодарность автору вопроса M03G, с чьей подачи и был получен мной этот ускоряющий пендель. А так как пост, похоже, увидит свет в пятницу, я позволил себе довольно вольный (извините, вышел каламбур невольный) стиль изложения. Надеюсь, все останутся довольны.

(Да, пост во многом пересекается с постом Распределенный аудиоплеер на Odroid U2, но чуть проще в настройке)

Пролог

Я начал мечтать о подобной системе году в 2003-м, как только начал жить в квартире с количеством комнат >1, и вопрос музыки на кухне (да и вообще по всей квартире) встал во весь рост. Ситуация усугублялась тем, что квартира была построена согласно архитектурному гению Никиты Сергеевича Хрущева, а компьютер помещался в “дальней” комнате, так что на кухне слышно было чуть более, чем совсем никак.

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

Предыстория

К тому моменту, как в широком доступе оказались замечательные одноплатные компьютеры Raspberry Pi, я сменил 3 места проживания, такое же количество работ, а также страну проживания, поэтому из-за обилия происходящего мечта не подала голоса даже слабого голоса, давно уснув летаргическим сном в пыльном чулане на задворках памяти. Малинку я, однако, все равно заказал. Зачем – еще сам не понимал, но устоять не смог: соотношение цена/потенциальные возможности все решило. “Это же в перспективе и NAS, и веб-сервер для экспериментов, и куча всего остального”, — думал я (ну, на NAS, как выясняется, она не тянет, но даже если бы я это тогда знал, меня бы все равно это не остановило).

Однако после того, как “малинка” таки попала ко мне в руки, у меня как раз организовался завал и на работе, и с личными проектами, поэтому “ягодка” легла на полку и пролежала несколько месяцев, так и не вкусив электричества.

Но однажды все изменилось.

Завязка

“Оба на, да у меня же вот чего есть!”

“Ну что, будем что-нибудь делать или как?”

План созрел быстро: в usb-порт втыкаем внешний винт с музыкой, к аудиовыходу подключаем колонки, на малину ставим MPD и получаем отличный музыкальный плейер, доступный для контроля с любого компьютера в доме (благо клиентов полно под любую ОС). Итак, малинке наконец-то нашлось применение, она весело замигала разноцветными светодиодами, и это было хорошо.

“Хе, есть же такая замечательная вещь, как Icecast2, который превосходно ладит с MPD и стримит музыку в сеть!”

“А кто тебе мешает взять еще пару-тройку малинок, написать простейшую софтину, которая по команде из сети включает/выключает тот же mplayer на проигрывание заданного URL (того самого, куда вещает Icecast2 с первой малины), и выпустить уже меня отсюда в конце концов??”

“Так, стоп, да это же вроде та самая хреновина, которая потенциально умеет воспроизводить по сети? А может мне и не нужно городить огород с Icecast2 и самописной включалкой/выключалкой?”

Так и вышло… А шкаф так и остался неразобранным.

Поехали!

Итак, поехали. Исходный материал: две или больше Raspberry Pi (одна будет сервером, на котором крутится MPD, остальные клиентами), такое же количество колонок для воспроизведения звука, чуть-чуть знания Linux, и вечер свободного времени. Ну и, разумеется, музыкальная коллекция с правильно прописанными тегами, т.к. MPD оперирует именно ими. Все это у меня в наличии было, поэтому я заранее известил жену о том, что ближайшим вечером меня нет, я заболел, изчез из дома, уехал в Ванкувер, и вообще эмигрировал нафиг с этой планеты, и что вернусь завтра к обеду, и с головой погрузился в гугл. Гугл не подвел.

Подготовительный этап (одинаковый для сервера и клиентов)

Я не буду детально описывать процесс установки системы на Raspberry Pi, инструкций в интернете полно. Оговорюсь лишь, что я, как любитель Debian с 8-летним стажем, использовал Raspbian, поэтому все инструкции будут даны для него. В общем, качаем образ, прошиваем, втыкаем карту, грузимся. Первоначальная настройка тоже стандартна, перечислю то, что сделал я:

  • задал пароль (разумеется)
  • активировал ssh-сервер
  • задал таймзону
  • убрал загрузку иксов
  • выставил объем видеопамяти на минимум (16 мегабайт), ибо незачем ее зря расходовать за неимением иксов.

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

Обязательный пункт: назначьте каждой “малинке” статический адрес в настройках вашего роутера (или в ее собственных сетевых настройках, без разницы) – впоследствии очень пригодится.

Ну что ж, приступим:

1. Первым делом обновим систему до свежего состояния и установим PulseAudio. Вообще, мы сейчас много чего будем делать от рута, поэтому перейдите под его учетку любимым вами способом (выбирайте на свой вкус):

2. Т.к. предполагается, что работать все будет сразу же после загрузки, в идеале – без иксов и логина юзера, нам нужно, чтобы PulseAudio работал в общесистемном режиме. Для этого отредактируем файл /etc/default/pulseaudio следующим образом:

3. Далее, чтобы все работало, нужно добавить юзера pi в группу pulse-access:

4. Теперь разрешим прием звука по сети. Для этого в файл /etc/pulse/system.pa добавим строку

Здесь мы авторизуем как “самого себя”, так и все устройства из локальной сети с адресами 192.168.1.* (если у вас диапазон адресов другой, поправьте соответствующим образом). В принципе, первая часть нужна только для сервера (чтобы играть на самом себе), а вторая — для клиентов (чтобы принимать из сети), но мы сделаем и то, и другое, чтобы в случае чего малинки были взаимозаменяемы с минимальными телодвижениями.

4. Собственно, запускаем сервис pulseaudio

На этом общая часть заканчивается. Перейдем к настройкам клиентов и сервера.

Клиент

Возможно, кому-то это покажется странным, но “клиент уже готов”, и дополнительной настройки не требуется, поэтому далее двигаемся строго на сервер порядка 50 метров займемся сервером.

Сервер

В первую очередь на сервер нужно установить MPD, и заодно консольный клиент (для первоначальной настройки):

Теперь редактируем конфиг /etc/mpd.conf. Он, как и многие другие конфиги в линуксе, отлично прокомментирован, поэтому я обозначу лишь основные необходимые правки:

Указываем путь к коллекции

Биндим на любой сетевой интерфейс:

На стандартный порт:

Авто-апдейтить коллекцию при изменении файлов:

И самое главное – конфигурируем аудиовыходы. Здесь мы создаем по одному выходу на каждую из клиентских “малин”, плюс один для самого сервера – он тоже будет выступать в роли равноправного клиента. Вот тут-то и пригодятся нам статические IP-адреса, которые мы назначили каждой из малин.

(и так далее, по количеству имеющихся клиентов)

Ну что ж, перезапустим MPD. Рутовую сессию на этом можно закончить.

Просканируем коллекцию для создании базы данных (это займет некоторое время, в зависимости от размера коллекции):

Собственно, на этом — все.

Рулим!

Осталось всего ничего: как всем этим делом управлять. Тут ничего сложного, в нашем распоряжении вагон и маленькая тележка клиентов под всевозможные ОС. При выборе обязательно обращайте внимание на то, умеет ли клиент переключать выходные каналы (или, как они еще называются, Output Devices) – собственно, это именно та фича, которая позволяет включать/выключать того или иного клиента. Под Маком я остановился на Theremin, под Линуксом – на Gmpc, клиентами под Windows пользоваться не приходилось, поэтому ничего посоветовать не могу.

Кульминация

“Ура. Вот то, о чем я мечтал 10 лет. ”

Дополнительные градусы душевного тепла генерировались от осознания факта, что никакой «rocket science» задействовано не было, и все было собрано буквально за вечер из «подручных материалов», и даже без единого куска синей изоленты. Я прислушался — из офиса наверху тоже доносился звук! Я залез в меню и снял галку с «Living Room» — звук из колонок в зале пропал, и остался только в офисе.

Эпилог

Уже через несколько минут внутренний перфекционист потребовал унификации интерфейса между девайсами и ОСями, и поэтому в голове тут же мелькнула безумная мысль “А вот хочу веб-интерфейс, да чтобы со всеми необходимыми функциями!” Беглый осмотр интернета оставил печальное ощущение: “Этот вроде ничего, но куцый. Этот вроде фичастый, но ставится через опу. Этот вообще заброшен.” Ну и так далее. Не говоря уже о том, что все они обладали одним фатальным недостатком. В общем, самые догадливые читатели уже все поняли: я решил написать свой, “с нотными партиями и пианистками”. Тем более, что веб-разработкой я никогда толком не занимался, но всегда хотелось попробовать страшного зверя jQuery, да и вообще оценить, насколько далеко ушли веб-технологии с тех пор, как я последний раз написал и забросил свой “хомяк” на narod.ru, с джаваскриптами и крутящимися менюшками. Поэтому за три будних вечера и один выходной день на свет родилось вот такое чудо:

(скриншот снят с экрана BlackBerry PlayBook)

Источник

Adblock
detector