気の向くままに辿るIT/ICT/IoT
webzoit.net
IoT・電子工作

Raspberry Pi 3 Model B+自作スマートスピーカーにラジオを追加

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Raspberry Piって?

Raspberry Pi 3 Model B+自作スマートスピーカーにラジオを追加

Raspberry Pi 3 Model B+自作スマートスピーカーにラジオを追加

2018/12/20

 以前、作ったRaspberry Pi 3 Model B+とJulius、Open JTalkベースの自作スマートスピーカー...というか、機能追加する気満々なので作っているというべきか。

 その際、加えて赤外線リモコン付きの家電(テレビやエアコン等)をWiFi制御すべく、ESP8266/ESP-WROOM-02/ESP-WROOM-32/ESP32による自作スマートリモコンを追加し、機能拡張した。

 また、自作スマートコンセント(スマートプラグ)も作ったので赤外線リモコンに対応しない電気製品もこの自作スマートスピーカで操作することも可能。

 更に曜日を含めた日付時刻、Web API(Weather Hacks)を介して今日、明日の天気予報、気温(2018/12/22明後日の天気追加)なども教えてくれるようにしてある。

radiko/らじるらじる/サイマルラジオ/ICECAST等ラジオ機能の追加

 今回は、更にradiko、らじるらじる、サイマルラジオ、ICECAST等のラジオ局を声で再生、停止させる機能を加えることにした。

 これから述べる通り、他にも事前にいくつかやることはあるが、メインの作業となる部分としては、radikoについては、Raspberry Piインターネットラジオの通り、radiko.shパッチを当てる形で、そのリンク先にあるmplayer -playlistを使う方法でサイマルラジオの.asxファイル、ICECASTの.m3uファイルを、「らじる☆らじる」をHLS経由ででプロトコルの変遷を眺めつつ、らじるらじる配信の最新プロトコルであるHLS対応のURIのあるconfig_web.xmlで必要なm3u8(M3U UTF-8)のURLを指定しつつ、前回作った自作スマートスピーカ用のスクリプトvoicerecive.plへの追記。

追加インストール

$ sudo apt install mplayer rtmpdump swftools libxml2-utils
$

 今回の実装に伴い、Debianを使っている自身の環境では、mplayer、rtmpdump、swfextractを得るべく、swftools、xmllintを得るべく、libxml2-utilsパッケージを追加インストールしておく必要があった。

事前準備

$ curl -O http://radiko.jp/apps/js/flash/myplayer-release.swf
$ swfextract myplayer-release.swf -b 12 -o authkey.png
$ vi sound/radio/radiko.sh
...
#wkdir='/var/tmp'
wkdir="$HOME/var/tmp"
...
$ mkdir -p ~/var/tmp/
$ cp authkey.png ~/var/tmp/
$

 また、radikoタイムフリー保存方法にあるようにradiko.sh用に、予め、myplayer-release.swfをダウンロード、swfextractコマンドからauthkey.pngと命名した認証ファイルを抽出、radiko.shwkdirに置いておく必要があった。

 このwkdir、デフォルトの/var/tmpにするならchownなりしておく必要があるだろうが、/home/xxx/以下にしておく方が、無難と判断、radiko.shを編集し、今回はそうした。

 尚、radiko.sh再生時のオプション[-p]の引数となる値は、radiko番組表xml取得APIにあるように全放送局一覧から得られる内の[id]タグの値。

Juliusオリジナル辞書の編集

$ awk '{print $1}' mysmartspeaker.list > dummy.list
$ vi dummy.list
TBSラジオ    てぃーびーえすらじお
ニッポン放送        にっぽんほうそう
ラジオ日本    らじおにっぽん
ラジオNIKKEI第1    にっけいだいいち
ラジオNIKKEI第2      にっけいだいに
NACK5        なっくふぁいぶ
$ iconv -f utf8 -t eucjp dummy.list | ../../../julius/julius-kits/grammar-kit/bin/linux/yomi2voca.pl > iconv -f eucjp -t utf8 dummy.list.out.utf8
$ cat dummy.list.out.utf8 >> mysmartspeaker.list
$ vi mysmartspeaker.list
$ ...
$ iconv -f utf8 -t eucjp mysmartspeaker.list > mysmartspeaker.eucjp
$

 独自辞書に追記した際、[TBS]ラジオ、[ニッポン]放送、ラジオ[日本]、[日経]、[NACK]5のローマ字表記が思い当たらず、適当に書いたら、やはり、エラーになった。

 そこで、これらのみ抜き出してタブ区切りで平仮名をあてたファイルを作り、実行権限を与えた(sudo chmod u+xした)yomi2voca.plで変換、出力された結果を反映させたところ、うまく機能した。(そのためのスクリプトなのだが。)

$ cat config_file
-w mysmartspeaker.eucjp
-v model/lang_m/bccwj.60k.htkdic
-h model/phone_m/jnas-tri-3k16-gid.binhmm
-hlist model/phone_m/logicalTri
-n 5
-output 1
-input mic
-input alsa
-rejectshort 600
-charconv euc-jp utf8
-lv 1500
$

 後にjuliusをモジュールモード(-module)で起動する際に-Cオプションで指定するdictation kitの構成ファイルconfig_fileにおいて独自に作った辞書は、-wオプション付きで指定できる。

 この中でmysmartspeaker.eucjp以外の言語モデルや音響モデルは、Julius標準のものを使っているだけ。

 尚、input値については、ラズパイで使えるよう前回追記の通り、OSSではなく、ALSAを使うべく、一連の作業を行ないつつ、明示的に./configure --with-mictype=alsaしたので-input alsaとしてある。

$ pwd
/home/xxx/sound/
$ vi ./voicerecieve.pl
#!/usr/bin/env perl
...
      # 【radiko】
      when("ラジオ日本"){
       system("~/sound/radio/radiko.sh -p JORF &");
      }
      when("JWAVE"){
       system("~/sound/radio/radiko.sh -p FMJ &");
      }
      when("放送大学"){
       system("~/sound/radio/radiko.sh -p HOUSOU-DAIGAKU &");
      }
 ...
      # 【らじるらじる by radiko】
      when("東京NHK第1"){
      # system("mplayer -playlist https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8 &");
       system("~/sound/radio/radiko.sh -p JOAK &");
      }
      when("東京NHK第2"){
      # system("mplayer -playlist https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8 &");
       system("~/sound/radio/radiko.sh -p JOAB &");
      }
      when("東京NHK第 FM"){
      # system("mplayer -playlist ://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8 &");
       system("~/sound/radio/radiko.sh -p JOAK-FM &");
      }
 ...
      # 【ICECAST】
      when("JAZZ"){
       system("mplayer -playlist http://dir.xiph.org/listen/212037/listen.m3u &");
      }
 ...
      # 【ラジオ停止】
      when("ラジオ停止"){
       system("~/sound/jsay ラジオを停止します");
       system("pkill -f rtmpdump");
       system("pkill -f mplayer");
      }
 ...
 

 これらを踏まえ、自作スマートスピーカー用スクリプトvoicerecieve.plに適宜追記。

 ラジオを止める場合、rtmpdumpしているradiko.sh、mplayer、何れで再生していようがいまいが、両方とも強制的にpkillすることにした。

 コマンドラインから実行した限りにおいては、rtmpdumpを止めても即終了せず、タイムラグがあったが、スマートスピーカー実装後は、なぜか、このタイムラグがなくなった。

 尚、らじる★らじるは、mplayerで再生すると10秒以内程度の周期で更新がかかり、その都度、途切れるが、幸い、試験的で年度をまたぐと若干聴取できない期間が生じがちな模様もradiko対応している為、これを利用するとよい。

 なぜか全国版にはNHK第2がなかったので先のリンクから、地域別、例えば東京ならJP13.xmlにある通り、NHK第1なら[JOAK]、NHK第2なら[JOAB]、NHK FMなら[JOAK-FM]というidで先の例のように[radiko.sh -p]の引数としてこれらidを渡してradikoで再生すれば、途切れることなく、良好に聴取できる。

$ pwd
/home/xxx/julius/julius-kits/dictation-kit-v4.4
$ julius -C config_file -C am-gmm.jconf -module
...

 あとは、検証中なら、例えば、端末からこのようにJuliusをモジュールモードで実行しておき...

$ pwd
/home/xxx/sound/
$ ./voicerecieve.pl
...

 他の端末でスマートスピーカ用スクリプトを実行...

 スクリプトの手順に沿って独自辞書に登録したワードを発すれば、今回新たに追加したラジオを再生できるはず。

注意

 自動起動する際などroot起動の可能性を考えると$HOMEなどをも使わず、[~/sound/jsay]などは、省略せずに[/home/xxx/sound/jsay]などとした方が賢明かと。

備考

 とても良好に機能している。

 ただ、課題がなくもない。

 1つは、ラジオ局を複数再生できてしまい、その場合、混線状態となること。

 ただ、日付時刻や天気などラジオ局再生中でも確認できるのは、特に音楽鑑賞中は、意外と重宝する為、ラジオ局再生が複数重ならないように何か工夫が必要かとも思うが、停止をかければ全て止まるし、誤動作でない限りは、そもそも再生中に重複指示しなければよく、運用でなんとかなるとも言える。

 これは課題というのか、現状、スピーカースクリプトにラジオの音量調整機能はなく、必要ならスピーカーZ120のボリューム調整つまみでなら調整できる状態だが、ソフト的な音量調整を実装するか、スピーカーのつまみでの運用を前提にするか...。

 WiFi経由で赤外線リモコン操作するテレビなどについては、音量調整も搭載するが、スマートスピーカ自体の音量も声で操作できた方がいいのかな...。

追記

$ pwd
/home/xxx/sound/
$ vi ./voicerecieve.pl
#!/usr/bin/env perl
...
      when("ABCAustraliaNews"){
       system("~/sound/jsay ABCニュース");
       system("mplayer -playlist http://abc.net.au/res/streaming/audio/aac/news_radio.pls &");
      }
      when("BBCNews"){
       system("~/sound/jsay BBCワールドニュース");
       system("mplayer http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-eieuk &");
      }
 ...
 
2019/01/15

 Mplayer, Radio Station, TUNE-IN Plugin available?を参考に英語系ニュースラジオ・ライブとしてオーストラリア放送ABC Newsと英国放送BBC World Newsを追加。

 何れもmplayerでいけるが、BBCの方は、-playlistオプションは不要な点に注意。

$ cd path/to/dictation-kit-v4.4
$ vi mysmartspeaker.list
...
ABCニュース    [ABCAustraliaNews]    e: b i: sh i: ny u: s u
BBCニュース    [BBCWorldNews]    b i: b i: sh i: ny u: s u
...
$ iconv -f utf8 -t eucjp mysmartspeaker.list > mysmartspeaker.eucjp
$

 Julius独自辞書に追記、ファイルエンコーディングをUTF-8からEUC-JPに変換。

 構成ファイル変更の反映については、systemd/systemctlならsystemd自動起動設定参照。

関連リンク

ウェブ造ホーム前へ次へ