みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

Raspberry Piでスピーカーを鳴らす~Pythonから再生

Raspberry Piにはヘッドホンジャックがついていて、ヘッドホンやスピーカーを接続できます。 GUIから音楽を流したり設定をするのは簡単なので説明不要かと思います。

今回はRaspberry Pi OS Lite版 (GUIなし)で、コマンドラインから音🎶を鳴らしてみましょう。 ヘッドホンジャックから鳴らすのが一番簡単でお手軽です。

f:id:kimura_khs:20201017171715j:plain

ヘッドホンジャックに、ダイソー300円スピーカーを接続してみました。このスピーカーは電源をUSBから取ります。

電源だけUSBから取って、音声はヘッドホンジャックから取る製品です。USBオーディオデバイスではありません🙅のでお間違いなきように。

音を鳴らす仕組み

LinixにはALSAがあるさ!

f:id:kimura_khs:20201017174659p:plain

Raspberry Pi OS Lite版の場合はデフォルトでALSAを使って音を鳴らすようになっています。 ALSAはサウンドデバイスを直接的に制御するのですが、同時に複数のアプリからサウンドデバイスを扱うことはできません。

複数のアプリから音を出す(音楽を再生しながら、別のアプリが時々通知音を鳴らすなど)ために、ふつうはPulseAudioを使います。 PulseAudioが間に入ることで、音声をミキシングしたりして、複数のアプリから音が鳴らせます。

ですが今回は単純に、PulseAudioを使わずにALSAのみで音を鳴らしてみます😅

音を鳴らしてみよう

音声出力先変更

デフォルトではHDMIになにも接続されていなければ、ヘッドホンジャックから音が出るようになっているはずです。 HDMIに何か繋いでいる場合で、ヘッドホンジャックから音声を出したい場合は、raspi-configで出力先を変更できます。

$ sudo raspi-config

7 Advanced OptionsA4 Audioと進むと、次のような画面になります。

f:id:kimura_khs:20201017172149p:plain

Force 3.5mm jackを選択すると、HDMIの接続の有無にかかわらず、イヤホンジャックから音が出ます。

音声再生

イヤホンジャックにスピーカーを接続して、次のコマンドを実行してみましょう。 最初から入っているテスト用のwavファイルを使います。

$ aplay /usr/share/sounds/alsa/Front_Center.wav

このaplayコマンドはALSA付属のコマンドで、WAVファイルの再生ができます。 「Front Center」という声が流れればOKです。出ない場合は、音量が小さいのかもしれません。

音量調整

音量調整はalsamixerコマンドで行うのが簡単です。

f:id:kimura_khs:20201017172014p:plain

上下キーで音量の調整ができます。F6で設定する出力先(ヘッドホンジャック、HDMIなど)の変更ができます。 Mボタンを押すと、ミュート/ミュート解除の切り替えができます。ESCで終了です。

MP3再生

MP3を再生するには、何らかの音楽再生ソフトをインストールしましょう。 コマンドラインで使えるものとしては、mpg321などが良いでしょう。

$ sudo apt install mpg321

これで、何か音楽ファイルをダウンロードして再生してみましょう。何でも良いです。

$ wget https://dl.espressif.com/dl/audio/gs-16b-2c-44100hz.mp3
$ mpg321 gs-16b-2c-44100hz.mp3

音楽が鳴れば成功です。

Pythonで音楽再生

やっぱりプログラムから音楽を再生したいところです。Pythonで試してみました。

WAVファイルの再生

いろいろな方法がありますが、simpleaudioライブラリを使うのが一番簡単そうです。

pypi.org

このライブラリはWAVファイルの再生ができます。ALSAがあれば再生でき、依存ライブラリが無いのでお手軽です。

$ sudo apt-get install -y python3-pip libasound2-dev
$ pip3 install simpleaudio

次のファイルを作成し、play.pyとして保存します。

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file("/usr/share/sounds/alsa/Front_Center.wav")
play_obj = wave_obj.play()
play_obj.wait_done()

再生してみましょう。

$ python3 play.py

音が鳴れば成功です。

MP3ファイルの再生

Pydubというライブラリを使うと簡単に再生できます。ただし、FFmpegのインストールが必要です。

pydub.com

FFmpegをインストールしておけば、pydubでMP3やAACなどFFmpegが対応する音声ファイルが再生できます。 次のようにインストールします。

$ sudo apt install python3-pip ffmpeg
$ sudo pip3 install pydab

次のファイルを作成し、play_mp3.pyとして保存します。

from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_mp3("gs-16b-2c-44100hz.mp3")
play(sound)

再生してみましょう。

$ python3 play_mp3.py

音が鳴れば成功です。

これでPythonを使ってセンサーをトリガーにしたり、スケジュールで目覚まし時計を作ったり、いろんな音声アプリが作れますね!🥰