8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

image.png

はじめに

長年、英語のリスニング力が低くく、既存ツールでは学習を習慣化できませんでした。また夏休みに入り、子供たちは長い朝を自堕落に満喫していました。これらの課題に対し、毎朝6:00に子供たちが自然に目覚められるよう、Rapsberry Piを用いて、英会話ラジオの聞き逃し配信をAmazon Echo(2019)から予約再生しました。
IMG_2024.JPG
特別なメッセージで出迎える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
    スクリーンショット 2026-08-10 22.00.24.png

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. 技術選定

スクリーンショット 2026-08-17 20.57.40.png

2026-08-13_21.44.40.png

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週間が経ち、子供たちが朝早くから目覚めるきっかけになりました。不愉快そうな顔をしていますが、リスニング力は少しずつ上がってそうで何よりです。

参考文献・購入品リンク

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?