ラズパイ上で音声を再生してみたので、その記録です。
再生方法はコマンドやPythonを使っています。
主な材料、環境
ハード: Raspberry Pi 3 model B OS: Raspberry Pi OS (32bit)
家にあった適当なUSBオーディオ変換アダプタ
特価で250円ぐらいで買ったスピーカー
デバイスの確認と設定
デバイス確認
ラズパイ上でどのように認識するか確認。
「C-Media Electronics, Inc. Audio Adapter (Unitek Y-247A)」と表示される。
$ lsusb Bus 001 Device 006: ID 0d8c:0014 C-Media Electronics, Inc. Audio Adapter (Unitek Y-247A) Bus 001 Device 005: ID 046d:c21f Logitech, Inc. F710 Wireless Gamepad [XInput Mode] Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones] Subdevices: 7/8 Subdevice #0: subdevice #0 省略 Subdevice #7: subdevice #7 card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: vc4hdmi [vc4-hdmi], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0] Subdevices: 1/1 Subdevice #0: subdevice #0
音声の出力先を設定
$ sudo raspi-config
1 System Options > S2 Audio で USB Audioを選択
再生時の音量を調整
$ alsamixer
上下キーで音量調整
F6で設定する出力先
Mボタンでミュート/ミュート解除
ESCで終了
コマンドで音声を再生
WAV再生
ラズパイに入っているWAVファイルを再生
$ aplay /usr/share/sounds/alsa/Front_Left.wav
MP3再生
再生アプリをインストール
$ sudo apt install mpg123
mp3ファイルを用意するため、効果音ラボさんからダウンロード
$ wget https://soundeffect-lab.info/sound/anime/mp3/jajean1.mp3
mp3を再生
$ mpg123 jajean1.mp3
pythonで音声を再生
pygame.mixer.Soundでwav再生
pygame.mixer.Soundの特徴
・OGGファイルや非圧縮形式のWAVファイルを扱える
詳細は公式マニュアル参照
下記プログラムを保存して実行
import pygame.mixer pygame.mixer.init() wav_sound = pygame.mixer.Sound('/usr/share/sounds/alsa/Front_Left.wav') wav_sound.play() while pygame.mixer.get_busy(): pass
pygame.mixer.musicでmp3再生
pygame.mixer.musicの特徴
・ストリーミング再生
・一度に一つしか再生できない
・環境によってはMP3ファイルのサポートに制限がある
必要に応じてパッケージインストール
pip install pygame
下記プログラムを保存して実行
import pygame.mixer import time pygame.mixer.init(frequency = 44100) pygame.mixer.music.load('jajean1.mp3') pygame.mixer.music.play(1) # 再生(再生回数1回) time.sleep(2) pygame.mixer.music.stop()
pydubでmp3を読み込み、pydubで再生 (再生が終わるまで待つ)
必要に応じてパッケージインストール
pip install pydub simpleaudio
下記プログラムを保存して実行
再生はpydubにお任せ。pydubのplay内部では simpleaudio, pyaudio, ffplay(ffmpegにバンドル)の順に再生を試みている。pydubによると、おすすめはsimpleaudioとのこと。
from pydub import AudioSegment from pydub.playback import play audio_data = AudioSegment.from_mp3('jajean1.mp3') play(audio_data)
pydubでmp3を読み込み、simpleaudioで再生 (再生が終わるまで待たない)
必要に応じてパッケージインストール
pip install pydub simpleaudio
下記プログラムを保存して実行
再生はsimpleaudio。
from pydub import AudioSegment from pydub.playback import play import simpleaudio import time seg = AudioSegment.from_mp3('jajean1.mp3') simpleaudio.play_buffer( seg.raw_data, num_channels=seg.channels, bytes_per_sample=seg.sample_width, sample_rate=seg.frame_rate ) time.sleep(3) # プログラムが終わると再生も終わるので、少し待つ
pydubでmp3を読み込み、pyaudioで再生
必要に応じてパッケージインストール
pip install pydub pyaudio
下記プログラムを保存して実行
import pyaudio from pydub import AudioSegment from pydub.utils import make_chunks audio_data = AudioSegment.from_mp3('jajean1.mp3') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(audio_data.sample_width), channels=audio_data.channels, rate=audio_data.frame_rate, output=True) for chunk in make_chunks(audio_data, 500): stream.write(chunk._data) stream.stop_stream() stream.close() p.terminate()
参考
UbuntuSoundSystem
Ubuntuだけど、Linuxのサウンドの概要がわかりやすかった画像
Pythonでサウンドを扱う
ここで書いた以外にも色々な再生方法を紹介してくれている
Linux の Audio 機能をコマンドラインで設定
さっぱり理解できてないけど、Linuxのオーディオ周りも複雑だということはわかった。