はじめに
長年、英語のリスニング力が低くく、既存ツールでは学習を習慣化できませんでした。また夏休みに入り、子供たちは長い朝を自堕落に満喫していました。これらの課題に対し、毎朝6:00に子供たちが自然に目覚められるよう、Rapsberry Piを用いて、英会話ラジオの聞き逃し配信をAmazon Echo(2019)から予約再生しました。

特別なメッセージで出迎えるAmazon Echo。
今回はAmazon公式Bluetooth機能を拝借しています。
NOT_SUPPORTED はメタデータ未送信によるもので、正常動作です。
1. Material and Method
1.0 Windowsでなく、ラズパイになった理由
当初は、いつもspotifyを子供部屋に飛ばしているようにWindowsからchromecastで接続すればいいと舐めていて、AI agentにトライさせたら後述のように4連敗した挙句、暴走しました。
そこでWi-Fiをやめて、Bluetoothを選択しました。
日中Windowsのスピーカーは別音源で頑張っているため、BluetoothでEchoに繋ぐには毎回繋ぎ直す必要がありました。そもそもWirePlumberのような設定ファイルをWindowsは触れず、この「繋ぎ直しの手間」を自動化で越えられず、Linux(ラズパイ)にシフトします。
釈迦に説法ですが、WSL2からBluetoothハードウェアへのアクセス権はWindows側が握ったままなので、ラズパイのような実機Linuxが必要でした。Mac様なら可能ですが、ラジオを飛ばすためだけには手が出ません。
1.1 環境・機材
- Windows PC(Python 3.14.4)
- Raspberry Pi 4 Model B(2GB、13,400円。)
- Amazon Echo Show 5(2019年製、Bluetooth A2DP接続)
- OS: Raspberry Pi OS Bookworm、PipeWire/WirePlumber 0.4.13
1.2 Raspberry Pi環境構築
ブラウザ自動操作(Selenium・chromedriver)、Bluetooth接続(bluez)、画面なし動作(xvfb)に必要な一式をまとめてインストール。終始モニター直結操作です。
sudo apt install -y chromium-chromedriver
pip install selenium --break-system-packages
sudo apt install -y bluez
sudo apt install -y xvfb
1.3 Bluetooth接続設定
Echoに「アレクサ、ペアリングして」と話しかけ、待受状態に。
GUI:画面右上のBluetoothアイコンから、表示されたEcho Showを選択。
CLI:
bluetoothctl
power on
agent on
default-agent
scan on
Echo Showの名前が一覧に表示されたらscan offし、そのMACアドレスを使って以下を実行(XX:XX:XX:XX:XX:XXは実際のMACアドレスに置き換える)。
pair XX:XX:XX:XX:XX:XX
trust XX:XX:XX:XX:XX:XX
connect XX:XX:XX:XX:XX:XX
exit
trustしておくと、再起動後も自動的に再接続される。
1.4 cron自動化設定
平日朝6時に自動実行。時刻を変えたい場合はcrontabの1行目(分 時 * * 曜日)を編集ください。(run_nhk_echo.sh)
1.5 ディスプレイなし運用(Xvfb)
cron実行時には画面情報(DISPLAY)がない状態で運用し、そのままではChromeが起動できません。Xvfb(仮想ディスプレイ)を導入し、モニターなしでも安定動作するようにしました(インストールは1.2参照)。(run_nhk_echo.sh)
1.6 再生の仕組み
スクレイピングではなく、NHKの聞き逃しページを毎回「再生」ボタンクリックします。(nhk_radio_echo.py)
→ 詳しい実装は GitHub を参照
| ファイル | 内容 |
|---|---|
README.md |
はじめに |
nhk_radio_echo.py |
Echo 出力用の本体スクリプト(Selenium再生+デバッグ用スクリーンショット) |
nhk_radio_wired.py |
有線スピーカー出力用の本体スクリプト(未運用) |
run_nhk_echo.sh |
cronから呼ばれるラッパースクリプト(Bluetooth出力先設定・音量設定・Selenium実行) |
wireplumber-bluetooth-config.lua |
Echo が「Audio Gateway」に固定される問題を解消するWirePlumber設定ファイル |
.env.example |
Bluetooth Sink名・ユーザー名など環境依存値のテンプレート |
.gitignore |
.envやログファイルなど、公開しない対象の除外設定 |
version-before-upgrade.txt |
OSSへのIssue対応で確認した、アップグレード前のパッケージバージョン記録 |
2. 技術選定
3. トラブルシューティング
1. Windows版構築時のエラーと、Copilot Agentの暴走
NHKの対象URL特定にあたり、Copilot Agentがトップページやジャンル一覧を何度もフェッチし、同じ確認を繰り返すループに沼りました。ヒトが正しいURLを直接指定しました。
また、「最新放送は一覧の一番上ではなく一番下に表示される」仕様に気づかず、当初は古い回を再生してました。表示順を踏まえて選択ロジックを修正しました。
試行錯誤の途中、Copilot AgentがWindows Bluetooth APIのドキュメントを延々とフェッチし続ける「暴走」が発生。目的から外れた探索が続いたため、Stop操作で強制停止した。
2. スマートスピーカーへの自動キャスト、4連敗(Windows)
| 手法 | 結果 | 原因 |
|---|---|---|
| pychromecast直接キャスト | X | NHKのHLS(m3u8)配信をChromecastが再生不可 |
| Chrome DevTools ProtocolのCast.getSinks | X | 使用バージョンで未サポート |
| pyautoguiによる座標クリック | X | 座標ズレにより誤操作 |
| chrome://cast直接操作 | X | 対象デバイスを検出できず |
3. Bluetooth出力先が認識されない(Raspberry Pi)
ペアリング後、音声出力先の一覧にEcho Showが表示されなかった。プロファイルが常に「Audio Gateway」に固定され、「A2DP Sink」が頑なに選択できなかった。
「主従関係が逆」という仮説を検証したが変化なし。Echo Show本体の「設定→Bluetooth」画面は実は逆方向(Echoから外部スピーカーへ出力する)の設定であることが判明し、正しい待受コマンドは「アレクサ、ペアリングして」だった。
それでもまだ解決せず、pactl list cardsで直接確認したところ、「a2dp-sink」という選択肢自体がそもそも存在していなかった。原因はWirePlumberの設定で、Amazon Echoシリーズは Linux(BlueZ/PipeWire)接続時に「Audio Gateway」役割が自動選択される既知の事象があった。設定ファイルにbluez5.rolesを追記して解決した。
4. cron自動化のトラブル集
| 症状 | 原因 | 対処 |
|---|---|---|
| 音声システム接続拒否 | cron実行環境にXDG_RUNTIME_DIRが用意されない | ラッパースクリプト冒頭で明示的にexport |
| Chrome起動不可 | cronにDISPLAY(画面情報)がない | 後述のXvfb導入で解決 |
| ページ読み込みタイムアウト | セッション復元ダイアログの疑い | ChromeOptionsに--disable-session-crashed-bubble等を追加 |
5. ディスプレイなし運用への移行(Xvfb)と、限界
ヘッドレスモードは音声出力が不安定になる懸念があったため採用を見送り、Xvfb(仮想ディスプレイ)を導入した。モニター無しでも安定動作するようになった。
一方で、Xvfb導入後も実モニターにChromiumのウィンドウが描画されてしまう問題が未解決のまま残っている。原因はデスクトップ環境がWayland(X11向けのXvfbとは異なる描画経路)であるためと推定される。ChromeOptionsに--ozone-platform=x11を追加したが効果はなかった。音声再生自体には実害がないため、深追いはせず保留している。
6. 物理音量ボタンによる接続不安定
Echo Showの物理音量ボタンを再生中に押す、Bluetooth接続が切断した。journalctlのBluetoothログをみると、同一デバイスへの接続確立が39秒間隔で2回記録されており、タイミングがボタン操作と一致していた。AVRCP(Bluetoothのリモコン制御プロトコル)経由の信号が、再生中のA2DPストリームに干渉したと推定される。対策として、Echo Show本体のボタン操作をやめ、Raspberry Pi側(wpctl set-volume)で音量制御する運用に変更した。
この事象について類似報告が見当たらなかったため、WirePlumberのIssueトラッカーに報告した。開発者からは、使用中のバージョン(0.4.13)が古いため、最新版での再現有無を確認してほしいとの返信を受けました🙏Raspberry Pi OS標準リポジトリでは新しいバージョンを入手できず、backports導入も404で失敗した。ソースビルドやOS移行はシステム破損リスクの観点から見送っている。
現状、根本的な解決にはRaspberry Pi OS自体のアップグレードが必要だが、手元の環境では対応できていない。Issueはクローズせずopenのまま維持しており、今後のWirePlumber側の対応で改善されるかもしれない。
4. まとめ
毎朝6時からNHKラジオビジネス英語が、家の中心から爆音で流れるようになって1週間が経ち、子供たちが朝早くから目覚めるきっかけになりました。不愉快そうな顔をしていますが、リスニング力は少しずつ上がってそうで何よりです。
参考文献・購入品リンク
- ラジオビジネス英語番組ページ: https://www.nhk.jp/p/radio-bizeigo/rs/368315KKP8/
- 聞き逃し一覧ページ(実装で使用): https://www.nhk.or.jp/radio/ondemand/detail.html?p=368315KKP8_01
- 秋月電子通商 Raspberry Pi 4 Model B 2GBスターターキット: https://akizukidenshi.com/catalog/g/g115297/
- Amazon Customer Service「スマートフォンまたはBluetoothスピーカーとお使いのスクリーン付きEchoデバイスをペアリングする」
https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GVHHFCDQPQ7VEK9Y - work.log「Amazon EchoをRaspberry PiのBluetoothスピーカーとして利用する」: https://worklog.be/archives/3600
- teratail「BluetoothスピーカーとしてRaspberry Pi→Echo Dotに出力したい」: https://teratail.com/questions/164227
- Zumi blog「Raspberry Pi Zero WHでAmazon Echo Flexから音を出す」: https://www.zumid.net/entry/raspberry-pi-amazon-echo-bluetooth-speaker/
- からあげ氏のブログ: https://karaage.hatenadiary.jp/entry/2018/03/05/073000
- WirePlumber Issue投稿: https://gitlab.freedesktop.org/pipewire/wireplumber/-/work_items/978
- Qiita「Mac miniとAmazon Echoを連動して...」: https://qiita.com/what/items/8e1d78572f8f11f6dae9
- GitHub blueutil(macOS Bluetooth CLI): https://github.com/toy/blueutil
- GitHub switchaudio-osx(macOS音声出力切替CLI): https://github.com/jwoglom/switchaudio-osx
- ひゃまだのblog「Raspberry Piにラジオになってもらうよ」(SSHによるリモート運用の実装例): https://hymd3a.hatenablog.com/entry/2022/01/21/201012
- ラジオアーカイブ自動化ソース:https://github.com/kazec-m/nhk-radio-automation


