ラズパイで音声を再生してみた

スポンサーリンク

ラズパイ上で音声を再生してみたので、その記録です。
再生方法はコマンドや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
https://wiki.ubuntulinux.jp/UbuntuStudioTips/Setup/UbuntuSoundSystem?action=AttachFile&do=get&target=soundStructure-PulseAudio.png
Ubuntuだけど、Linuxサウンドの概要がわかりやすかった画像

Pythonでサウンドを扱う
ここで書いた以外にも色々な再生方法を紹介してくれている

Linux の Audio 機能をコマンドラインで設定
さっぱり理解できてないけど、Linuxのオーディオ周りも複雑だということはわかった。

UbuntuのSoundTroubleshooting

pydub
pydubのドキュメント
simpleaudioのドキュメント