GoogleHomeからローカルの音声ファイルをRaspberry pi経由で流す
きっかけ
目的としては、定時にVOICEROIDの音声で通知して欲しいという考えのもと、
ブラウザから音声のキャストも出来るんだし、簡単だろうとやり始めたところ、
意外とつまりポイントが多かったので、備忘録がてら残します。
引用引用アンド引用となっているので、元のサイトを確認することを推奨します。
よくある検索結果と問題点
検索するとまず出てくるのが、
「Google Play Musicに手持ちの曲をアップロードすれば流せる」という情報が出てきますが、こちらの情報は今時点では古いです。
Google Play Musicは、現在Youtube Musicへ移行されたのですが、移行先のYoutube Musicにアップロード後、GoogleHomeに曲を流すように話しかけると 「プレミアムへの登録が必要」という返信を貰います。
試してはいないのですが、もしかするとYoutube Music プレミアムに登録するだけでいけるかもしれません。
ですが、今回の目的だけで課金、というのも二の足を踏んでしまうので、今回は使用しません。
そのため、今回は手持ちのRaspberry pi4から流すようにします。
ウェブ上の音声を流すまで
まず、ラズパイから処理を実行するための下準備として環境を最新化します
sudo apt-get update sudo apt-get upgrade
続いて、node.js、npmをインストールします
sudo apt-get install nodejs npm
sudo npm install n -g
その後、一旦再起動を行います。
再度コンソール画面を立ち上げ、必要なものをインストールします。
sudo apt-get install -y vim git-core libnss-mdns libavahi-compat-libdnssd-dev
続いて、GoogleHomeから音声を再生するためのソフトとして、
google-home-notifierをインストールします。
こちらを使うことによって、好きな音楽を流せたり、自由にしゃべらせることが可能です。
github.com
google-home-notifierの設置フォルダを適当に作成します。
mkdir homebot cd homebot
プロジェクトの作成とgoogle-home-notifierをインストール
npm init npm install google-home-notifier
続いて、google-tts-apiのバージョンアップを行います
vim node_modules/google-home-notifier/package.json
"bundleDependencies": false, "dependencies": { "body-parser": "^1.15.2", "castv2-client": "^1.1.2", "express": "^4.14.0", - "google-tts-api": "https://github.com/darrencruse/google-tts/tarball/british-voice", + "google-tts-api": "0.0.6", "mdns": "^2.3.3", "ngrok": "^2.2.4" },
というように修正をします。
併せて、browser.jsも修正します。
vim node_modules/mdns/lib/browser.js
Browser.defaultResolverSequence = [ rst.DNSServiceResolve() -, 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo() +, 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]}) , rst.makeAddressesUnique() ];
続いてこちらを参考に、mp3をGoogleHomeに再生させるスクリプトの作成をします。
scrapbox.io
vim main.js
#!/usr/local/bin/node const home = require('google-home-notifier'); const argv = process.argv; const mp3URL = argv[2]; const device = argv[3] || ''; const msg = 'Say "OK Google, Stop" to stop play music.'; if (mp3URL === undefined) { console.error('usage: play.js <url of mp3> <device id>'); process.exit(1); } home.device(device, 'ja'); home.ip('<GoogleHomeのIPアドレス>'); home.play(mp3URL, () => console.log(msg));
ただ、google-home-notifierを使ったGoogleHomeでの再生は、
google-home-notifierのREADMEにあるとおり、特にGoogleHomeのIPアドレスを指定しなくても起動出来るようなのです。
ただ、私の環境では
Error: getaddrinfo -3008
というエラーが発生するので、こちらを参考に、IPアドレスを指定することでエラーが解消されました。
qiita.com
GoogleHomeのIPアドレスの確認方法は、GoogleHomeアプリから、デバイス情報を確認することでIPアドレスの確認が出来ます。
ファイルに実行権限を付与して、テストで音声を流してみます。
chmod 755 main.js ./main.js 'http://www.ne.jp/asahi/music/myuu/wave/toccata.mp3' Google-Home
音声ストップをする場合には、通常のGoogleHomeと同様にストップなどと言って止めます。
ローカルの音声を流すまで
この段階ではまだ、ウェブ上の音声を流すにとどまるので、
続いて、ラズパイ内の音声ファイルを流せるように、ファイルサーバーをラズパイ上に立てます。
vim mp3server.js
const fs = require('fs'); const path = require('path'); const app = require('express')(); const port = 3000; app.listen(port, console.log('port: ' + port)); app.get('/audio/:file', (req, res) => { const f = req.params.file; const p = path.join('audio', f); fs.readFile(p, (err, data) => { if (err) res.status(400).send(err.toString()); else { res.setHeader('Content-Length', data.length); res.write(data); res.end(); } }); });
ファイルサーバーの稼働確認をします
mkdir audio #音声ファイルの設置フォルダの作成 cp <再生したいMP3のファイル名> audio node mp3server.js
ブラウザから以下のURLにアクセスし、音声が流れるか音声ファイルがダウンロード出来たら成功です。
http://<ラズパイのIP>:3000/audio/<再生したいMP3のファイル名>`
次に、再起動してもファイルサーバーが稼働するようにします。
Ctrl + c #簡易MP3サーバを停止 sudo npm install pm2@latest -g #pm2のインストール pm2 start bin/mp3server.js pm2 startup systemd [PM2] Init System found: systemd [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ??? --hp /home/??? # 表示された指示の通りに、以下のコマンドを実行する $ sudo env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u <あなたのユーザー名> --hp /home/<あなたのユーザー名> $ pm2 save #設定の保存 $ sudo reboot #設定確認のため再起動
ラズパイへの音声ファイル転送はSSHから送るようにします
まず、ラズパイ側から設定を行います
sudo raspi-config
から、設定画面を開き、以下を選択
Interfacting Options → SSH
enabled?は<はい>を選択します。
転送プロトコルは「SFTP」
ホスト名に先に調べておいたIPアドレス
ポートは22
ユーザー名とパスワードは所定のものを入れてログインします。
ラズパイのデフォルトログインユーザーは、
ユーザー:pi
パスワード:raspberry
となっているはずですが、私の場合は変更していないつもりでしたがログインが出来なかったので、
新規でユーザーを管理者権限を付与して作成し、新規ユーザーからログインしました。
sudo adduser testuser
sudo gpasswd -a testuser sudo
ファイル転送後、音声ファイルを先ほどのフォルダにセットし、スクリプトを実行することで、GoogleHomeから音声が流れます。
./main.js 'http://<ラズパイのIP>:3000/audio/<音声ファイル名>' Google-Home
Watson開発入門1
Watsonを使う用ができ、勉強のため、
Watson開発入門の本を買いました
現場で使える! Watson開発入門 Watson API、Watson StudioによるAI開発手法 (AI & TECHNOLOGY)
- 作者: 伊澤諒太,井上研一,江澤美保,佐々木シモン,羽山祥樹,樋口文恵
- 出版社/メーカー: 翔泳社
- 発売日: 2019/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
アウトプット用で、備忘録として、詰まった点とやったことを書いていきます
今日は1-3章まで読了
IBM Cloudアカウントを登録し、curlコマンドを使い、
音声から文章を作成する、といったところまでができました
cURLですが、使用しているOSがWindows10 1903のため
cURLインストールと、PowerShellのエイリアス切り替えを行う必要があるとのこと
記載のリンクから、cURLをダウンロード
https://curl.haxx.se/
適当なフォルダに設置後、環境変数を設定し、コマンド実行ができるようにします
続いてPowerShellの設定
PowerShellにもcurlコマンドが存在するのだが、
Windows独自のcurlとのことで、curlをダウンロードする必要があるとのこと
PowerShellのcurlコマンドをエイリアスから切り替えるには
del alias:curl
このコマンドで切り替えができるそうなのだが、
PowerShellを開き直す度にエイリアスが復活しているため、
プロファイルスクリプトに書き込むのがいいそう
%HOMEPATH%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
に存在するそうだのだが……ない
qiita.com
この内容を見ると、作らないと無いそうなので
プロファイルの存在を確認
Test-Path $profile
無かったので、次のコマンドを実行
New-Item -path $profile -type file -force
作ったプロファイル編集し、
エイリアス切り替えのコマンドを書き込みこれで完了!
……かと思いきや、PowerShell起動時
「このシステムではスクリプトの実行が無効になっているため、……」というエラーが表示される
qiita.com
これも確認してみると、PowerShellのスクリプト実行が実行ポリシーが許可されていないため、とのこと
恒久的に実行で良いので、以下のコマンドを実行
PowerShell Set-ExecutionPolicy RemoteSigned
再度開き直すと、エラーもなく、curlのバージョンもきちんと見れます
ここまできてようやく準備段階が完了
ただ、ここから先は特に詰まることもなく、
音声ファイルをcurlコマンドを使って送信することで、
テキスト化された文言が返ってきました
コマンド一つで出来るなんてすごい
日本語でも出来るとあったので、
適当な音声を作って試してみたい
どのくらい長さまで対応してるんだろうか?
といったところで今日はおしまい
MacからUSBにファイルを移動するときのエラー
これから外出することも多くなるだろうし、ノートPC買うかってな勢いで
MBPを買ったのですが、全然趣味レベルを超えてる気がしない僕です
ただ、さすがというか、ちょっと使いたいときにさっと使えるってのはすごくいいですね
あのソフトが無い、この機能がない(Evernoteの置換機能ってWin版にしか無いのか……)
みたいなのはあるにせよ便利です
ただ、さすがにSSDさんを酷使させすぎるのはなあと
ちょこちょこと溜まり始めたファイル類を、USB経由でWin機に移そうとし
ターミナルでパスを指定する際には
/Volumes
の下にあるディレクトリを指定してあげれば良いというのを調べ
ターミナルでおもむろに
mv *.jpg /Volumes/U/
などと打って見たのですが
[Cross-device link]
なるエラーを吐きました
んん?今まで見たこと無いエラーだなあ
なんかよくわからないから、zipで固めてcpコマンドでもやってみるかと
cp *.zip /Volumes/U/
[No Space Left on Device Error]
なるエラーが
調べてみると、ファイルサイズがでかいというふうに怒られているようなのですが
zipファイルたかだか90M位だぜ?そんなでかいか?
とUSBの情報を見てみると
ああ、そういえば思い出しました
たしかそんなフォーマット昔やった気がします
その時はDOSか何かを入れたんだったけかな?
その後、ファイルを消して、大した活用をしてなかったから全く気が付きませんでした
その後、記事を参考にしながらフォーマットを行い、無事、移動が出来ました
『青春ブタ野郎はプチデビル後輩の夢を見ない』読了
『青春ブタ野郎はプチデビル後輩の夢を見ない』
読み終わりました
前巻の『青春ブタ野郎はバニーガール先輩の夢を見ない 』で、
気になる終わり方をしましたが
前回のテーマが「透明人間モノ」と仮定するなら
今巻のテーマ的には「ループモノ」っていう感じなんですかね
おお、王道SFっぽい感じですね
まあ、今までSFモノ書いてるほうが多かったですし
『さくら荘』は書いてる巻数と期間が長かったですが
前回登場した古賀ちゃんが主役というか、メインヒロインですね
偽装カップルの話はちょいちょいありますが
ここまでガッツリ書いてるのは珍しい気がしますね
メインヒロイン差し置いてデートしまくる話で思い出したのは
『瑠璃色にボケた日常』とかですかね
翠は可愛かったなあ
すごい今更だけど、「カッパ」と「喝破」が掛かってたんだね、多分だけど
『俺と俺の彼女と幼なじみが修羅場すぎる』は、
まあ、話の根幹自体が偽装カップルの話みたいなもんだしなあ
とか思ったり思わなかったり
というか、結構あるかと思ってたら、全然思いつかなくて
慌てて本棚整理しだす有り様
そこまで物覚えがいいわけじゃないので
「あれ?確実に読んでるはずなのに話が全く思い出せない……」
みたいな作品が思いの外多くてビックリしました
読みなおしたほうがいいのかな
話は戻るけど、
なんかこう、年下のこと、何でも言い合える友達、
みたいな関係っていいなあとか素直に思います
ヒロイン準ヒロインが増えていくと、
どうしてもキャラかぶりを防ぐために
年上の先輩として慕ってくれる年下の子、みたいな感じの設定が多くなる傾向にあるのですが
キャラが少ないからこそ、個性的なキャラが出せるのかもしれないですね
まあ、好んでバニーガール姿になりだすのなんて、
桜島先輩か涼宮ハルヒ位なもんだろ
主人公にパンツ渡すのなんか
古賀ちゃんかエリオくらいしか思いつかんし
まあ、それはいいとして
こんだけデートしてる作品ってのもあんまり見たことないかなあ
とか思ってみたり
ありそうなのにね
『デート・ア・ライブ』は、確かに女の子とデートしまくって好感度上げまくる話だけど
なんか想像してるデートと違うんだよなあ……
多分なんか、青春成分かなにかが足りてない気がする
そもそも、学園モノで外出する話が出てくるとか自体すくねえしなあ
昨今のネトゲものブームとかになると余計に
ネトゲと学校もの主体の話だと、外の代わりにバーチャルの世界で事足りるからなあ
それに、メインヒロインが学校の後輩っての時点で少ないのかもしれない
いやまあ、割合が少ないだけでいくらでも出てくるんだろうけどさ
『仮想領域のエリュシオン』とか『変態王子と笑わない猫。』とかさ
……なんかMF多いな、いいんだけど
あと、タイトルの話しだけど
なんか、だいたいに双葉が絡んでる気がするんだよね
「青春ブタ野郎」って言ってるもの双葉だけだし
「ラプラスの悪魔」言い出したのも双葉だし
というかなぜブタ野郎なんだろうか
キャラ画像がアクセル・ワールドのハルユキ位のビジュアルだったら容易にわかるんだけど
- 作者: 鴨志田一,溝口ケージ
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/04/10
- メディア: 文庫
- この商品を含むブログ (4件) を見る
- 作者: 鴨志田一,溝口ケージ
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/08/09
- メディア: 文庫
- この商品を含むブログ (1件) を見る