Raspberry Piで天気予報をしゃべる
ラズパイがしゃべってくれたので、今度はWebから天気予報を取得してしゃべってもらいたいと思います。
全体はこちらを参考にしました。
raspi.seesaa.net
jsayコマンドの作成は、上記リンク内のこちらを参考にしました。
raspi.seesaa.net
jsayコマンドの作成
スクリプト作成
$ sudo vi /usr/local/bin/jsay #!/bin/sh CMDNAME=`basename $0` sleep 1 if [ $# -lt 1 ]; then echo "Usage: ${CMDNAME} [ text ]" 1>&2 exit 1 fi # 定数定義(出力ファイル名、辞書の場所、音声データの場所) TMPFILE=`mktemp /tmp/tmp.XXXXXXXX.wav` DIC=/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.08/ VOICE=/usr/share/hts-voice/mei/mei_normal.htsvoice ### こちらでも良いです #DIC=/var/lib/mecab/dic/open-jtalk/naist-jdic # 音声データ生成 echo "$1" | open_jtalk \ -x ${DIC} \ -m ${VOICE} \ -ow ${TMPFILE} && \ # 生成した音声データを再生する aplay --quiet ${TMPFILE} # 生成した音声データを削除する rm -f ${TMPFILE} # 終了 exit 0
しゃべる
$ sudo chmod +x /usr/local/bin/jsay $ jsay こんにちは
しゃべった!OK!
天気予報をしゃべるスクリプト作成
スクリプト作成
$ sudo vi talk_weather.py #!/usr/bin/env python # -*- coding:utf-8 -*- import shlex import subprocess from datetime import datetime import urllib2 import json CMD_SAY = 'jsay' def main(): say_datetime() say_weather() return def say_datetime(): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) text = CMD_SAY + ' ' + text print '**********************' print text print '**********************' proc = subprocess.Popen(shlex.split(text)) #proc = subprocess.Popen(shlex.split(text), shell=True) proc.communicate() return def say_weather(): city = '120010' json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' weather_text = u'%sの天気は%sです。' temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。' try: r = urllib2.urlopen('%s?city=%s' % (json_url, city) ) obj = json.loads( unicode(r.read()) ) title = obj['title'] forecasts = obj['forecasts'] # TODAY cast = forecasts[0] today_w_txt = weather_text % (cast['dateLabel'], cast['telop']) # TOMMOROW cast = forecasts[1] temperature = cast['temperature'] tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop']) tommorow_t_txt = temperature_text % (cast['dateLabel'], temperature['max']['celsius'], temperature['min']['celsius']) # SAY weather_str = title + ' ' + today_w_txt + ' ' + tommorow_w_txt + ' ' + tommorow_t_txt weather_str = weather_str.encode('utf-8') text = '''%s '%s' ''' % (CMD_SAY, weather_str) print text proc = subprocess.Popen(shlex.split(text)) #proc = subprocess.Popen(shlex.split(text), shell=True) proc.communicate() finally: r.close() return ### Execute if __name__ == "__main__": main()
実行
$ python talk_weather.py ********************** jsay 7月1日、14時29分0秒 ********************** jsay '千葉県 千葉 の天気 今日の天気は曇時々雨です。 明日の天気は曇りです。 明日 の予想最高気温、28度、予想最低気温、23度です。'
やったー。Webから取ってきた天気予報をしゃべったーー。
さて、次は何をしようかな。
Raspberry Piでしゃべってみる
スピーカーから音を出せたので、今度はラズパイにしゃべらせたいと思います。
参考にしたのはこちら。
途中の「日本語音声合成システム(Open JTalk)のインストール」からやっています。
Open JTalkのインストール
Open JTalk本体のインストール
$ sudo apt-get install open-jtalk パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: libhtsengine1 提案パッケージ: open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001 以下のパッケージが新たにインストールされます: libhtsengine1 open-jtalk アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。 187 kB のアーカイブを取得する必要があります。 この操作後に追加で 542 kB のディスク容量が消費されます。 続行しますか? [Y/n] Y 取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main libhtsengine1 armhf 1.08-1 [38.0 kB] 取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main open-jtalk armhf 1.07-2 [149 kB] 187 kB を 1秒 で取得しました (148 kB/s) 以前に未選択のパッケージ libhtsengine1 を選択しています。 (データベースを読み込んでいます ... 現在 112429 個のファイルとディレクトリがインストールされています。) .../libhtsengine1_1.08-1_armhf.deb を展開する準備をしています ... libhtsengine1 (1.08-1) を展開しています... 以前に未選択のパッケージ open-jtalk を選択しています。 .../open-jtalk_1.07-2_armhf.deb を展開する準備をしています ... open-jtalk (1.07-2) を展開しています... man-db (2.7.0.2-5) のトリガを処理しています ... libhtsengine1 (1.08-1) を設定しています ... open-jtalk (1.07-2) を設定しています ... libc-bin (2.19-18+deb8u10) のトリガを処理しています ...
提案パッケージのインストール
$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが新たにインストールされます: hts-voice-nitech-jp-atr503-m001 open-jtalk-mecab-naist-jdic アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。 10.9 MB のアーカイブを取得する必要があります。 この操作後に追加で 68.2 MB のディスク容量が消費されます。 取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main open-jtalk-mecab-naist-jdic all 1.07-2 [10.1 MB] 取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/contrib hts-voice-nitech-jp-atr503-m001 all 1.05-1 [764 kB] 10.9 MB を 2秒 で取得しました (4,331 kB/s) 以前に未選択のパッケージ open-jtalk-mecab-naist-jdic を選択しています。 (データベースを読み込んでいます ... 現在 112445 個のファイルとディレクトリがインストールされています。) .../open-jtalk-mecab-naist-jdic_1.07-2_all.deb を展開する準備をしています ... open-jtalk-mecab-naist-jdic (1.07-2) を展開しています... 以前に未選択のパッケージ hts-voice-nitech-jp-atr503-m001 を選択しています。 .../hts-voice-nitech-jp-atr503-m001_1.05-1_all.deb を展開する準備をしています ... hts-voice-nitech-jp-atr503-m001 (1.05-1) を展開しています... open-jtalk-mecab-naist-jdic (1.07-2) を設定しています ... hts-voice-nitech-jp-atr503-m001 (1.05-1) を設定しています ...
Open JTalkを使用する
テキストファイルを音声ファイルに変換して、音声を出力します。
テキストファイル作成
$ vi voice.txt こんにちは
音声ファイルに変換
$ open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001 /nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow test.wav voice.txt
音声ファイルを実行
$ aplay test.wav
おー、しゃべった!すごい!!
スクリプト化
$ jsay.sh TMP=/tmp/jsay.wav echo "$1" | open_jtalk \ -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow $TMP && \ aplay --quiet $TMP rm -f $TMP //権限付与 $ chmod 755 jsay.sh //実行 $ ./jsay.sh こんにちは
女性の声に変えてみる
音声ファイルを取得する
最新版は1.7でした。
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip --2017-06-25 10:41:29-- http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip downloads.sourceforge.net (downloads.sourceforge.net) をDNSに問いあわせています... 216.34.181.59 downloads.sourceforge.net (downloads.sourceforge.net)|216.34.181.59|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 302 Found 場所: https://jaist.dl.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip [続く] --2017-06-25 10:41:29-- https://jaist.dl.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip jaist.dl.sourceforge.net (jaist.dl.sourceforge.net) をDNSに問いあわせています... 2001:df0:2ed:feed::feed, 150.65.7.130 jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)|2001:df0:2ed:feed::feed|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 12650627 (12M) [application/octet-stream] `MMDAgent_Example-1.7.zip' に保存中 MMDAgent_Example-1. 100%[=====================>] 12.06M 4.25MB/s 時間 2.8s 2017-06-25 10:41:32 (4.25 MB/s) - `MMDAgent_Example-1.7.zip' へ保存完了 [12650627/12650627] //解凍 $ unzip MMDAgent_Example-1.7.zip //meiフォルダ配下を/usr/share/hts-voice/にコピー $ sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/
jsay.shを修正して、jsay_w.shを作成
$ jsay_w.sh TMP=/tmp/jsay.wav echo "$1" | open_jtalk \ -m /usr/share/hts-voice/mei/mei_happy.htsvoice \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow $TMP && \ aplay --quiet $TMP rm -f $TMP //実行 $ ./jsay_w.sh こんにちは
メイちゃんの声に変わりました!
Bluetoothスピーカーから音を出す
Bluetoothスピーカーとつなぐ
ラズパイマガジン 2017年8月号の「Raspberry Piで楽しむPCオーディオ」を参考にしました。
今回はとくにスマホからの操作をしたいわけではないので、途中の手順は飛ばしてます。
スピーカーは、SonyのSRS-X33を使います。
パッケージとファームウェアの更新
$ sudo apt update $ sudo apt upgrade $ sudo apt install rpi-update $ sudo rpi-update
Bluetoothの設定
音を出すだけなら、PulseAudio関係の設定はいらないですね、きっと。
BlueZとpulseaudio-module-bluetoothをインストール
$ sudo apt install bluez pulseaudio-module-bluetooth
PulseAudioのsystemdサービス化
ラズパイ起動時にPulseAudioが起動するよう、サービス化の設定
$ sudo vi /etc/systemd/system/pulseaudio.service [Unit] Description=Pulse Audio [Services] Type=simple ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disable-shm [Install] WantedBy=multi-user.target
PulseAudioサービスのポリシー設定
PulseAudioとBlueZの通信を許可するポリシーを設定
$ sudo vi /etc/dbus-1/system.d/pulseaudio-bluetooth.conf <busconfig> <policy user="pulse"> <allow send_destination="org.bluez"/> </policy> </busconfig>
PulseAudioのモジュール設定
Bluetooth関連のサービスを読み込む設定をファイルの最後に追加
$ sudo vi /etc/pulse/system.pa ... ### Automatically load driver modules for Bluetooth hardware .ifexists module-bluetooth-policy.so load-module module-bluetooth-policy .endif .ifexists module-bluetooth-discover.so load-module module-bluetooth-discover .endif
PulseAudioの起動・有効化
$ sudo systemctl start pulseaudio.service $ sudo systemctl enable pulseaudio.service
piユーザをPulseAudioで音声を出力するためのグループに追加
$ sudo usermod -a -G pulse,pulse-access pi
Bluetoothスピーカーと接続
Bluetoohデバイスとペアリング
$ sudo bluetoothctl [NEW] Controller XX:XX:XX:XX:XX:XX raspberrypi [default] [NEW] Device YY:YY:YY:YY:YY:YY W01_********* [NEW] Device ZZ:ZZ:ZZ:ZZ:ZZ:ZZ SRS-X33 [bluetooth]# agent on #エージェント有効 Agent registered [bluetooth]# default-agent #エージェントリクエスト発行 Default agent request successful [bluetooth]# scan on #デバイス探索開始 Discovery started [CHG] Controller XX:XX:XX:XX:XX:XX Discovering: yes [CHG] Device YY:YY:YY:YY:YY:YY RSSI: -96 [CHG] Device ZZ:ZZ:ZZ:ZZ:ZZ:ZZ RSSI: -38 #デバイス探索で見つかったデバイスとペアリング [bluetooth]# pair ZZ:ZZ:ZZ:ZZ:ZZ:ZZ #発見したデバイスとペアリング Attempting to pair with ZZ:ZZ:ZZ:ZZ:ZZ:ZZ Failed to pair: org.bluez.Error.AlreadyExists [CHG] Device ZZ:ZZ:ZZ:ZZ:ZZ:ZZ Connected: yes [DEL] Device YY:YY:YY:YY:YY:YY W01_************ [NEW] Device YY:YY:YY:YY:YY:YY W01_************ [bluetooth]# trust ZZ:ZZ:ZZ:ZZ:ZZ:ZZ #デバイスをtrustして、次回以降自動接続する Changing ZZ:ZZ:ZZ:ZZ:ZZ:ZZ trust succeeded [bluetooth]# connect ZZ:ZZ:ZZ:ZZ:ZZ:ZZ #ペアリングしたデバイスを接続 Attempting to connect to ZZ:ZZ:ZZ:ZZ:ZZ:ZZ Connection successful #これが出ると、PAIRINGボタンが点滅から点灯に変わる [bluetooth]# exit Agent unregistered [DEL] Controller ZZ:ZZ:ZZ:ZZ:ZZ:ZZ raspberrypi [default]
音声テスト
$ cd /usr/share/sounds/alsa $ ls ront_Center.wav Noise.wav Rear_Right.wav Front_Left.wav Rear_Center.wav Side_Left.wav Front_Right.wav Rear_Left.wav Side_Right.wav $ aplay Noise.wav 再生中 WAVE 'Noise.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
スピーカーから音が出ました。成功!!
Raspberry Piのアドレス固定化
毎回アドレスが変わると面倒なので、IPを固定化しておきます。
/etc/network/interfaces
$ sudo vi /etc/network/interfaces
...
## iface eth0 inet manual //ここはコメントアウト
auto eth0
iface eth0 inet static
address 192.168.1.9
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
...
繋がりますね。が、しかし、ネットを見てみると /etc/dhcpcd.conf派がかなり多いなぁ・・・。どれが正解なんだ??
こちらに解がありました。
/etc/network/interfaceの中身を改めてみてみます。
Please note that this file is written to be used with dhcpcd
For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
静的IPは、/etc/dhcpcd.conf を調べてね、って言ってる。
man dhcpcd.conf
たくさん書いててちょっと読む気になれないので、一部を抜粋
static value
interface eth0
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
どうやらこの設定を追加しれみればいいっぽい。ネットでも同様です。
/etc/dhcpcd.conf
ファイルの一番最後に追加
$ sudo vi /etc/dhcpcd.conf ... interface eth0 static ip_address=192.168.1.9/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1
/etc/network/interfacesの設定は戻して、rebootする。
繋がりました。
Raspberry Piの日本語化とSSH接続
いろいろ設定してみます。
日本語化
メニュー→「Preferences」→「Raspberry Pi Configuration」で、設定ウィンドウを開く
Localizationタブ
- Locale
Language: ja (Japanese)
Country: JP (Japan) - TImezone
Area: Japan - Keyboard
Japna/Japanese - WiFi Country
Japan
を設定して、reboot
→見事に、日本語になりましたー
SSH接続
メニュー→「設定」→「Raspberry Pi の設定」で、設定ウィンドウを開く
インタフェースタブで、以下を選択
SSH: Disable →Enable
IPアドレスを確認したら、「192.168.1.9」でした。
そして、ノートからTeraTermで接続
アドレス: 192.168.1.9
ユーザ/パスワード: pi/raspberry
→接続できました。
これで、ラズパイをもっと容易に使うことができます。
Raspberry Piを起動してみた
今回は、ラズパイを起動してみたいと思います。
ここらへんは、ラズパイマガジン2017年8月号のP137~に書いてあります。
1)まずは、スターターキットのmicroSDカード(16GB)を差し込みます。
OSは書き込み済みなので、そのまま差すだけです。
2)続いて、ラズパイにいろいろ差していきます。
3)いよいよ電源を入れます。スイッチオン!!
電源入れた後の画面です。おぉ、何か起動した。そして、OSではない!?
4)最初の画面は、NOOBSでした。
「OS書き込み済み」って書いてあったから、てっきりOSインストール済みかと思ったら、OS導入支援ツールの「NOOBS」が書き込み済みとのこと(中の紙に書いてあった・・・)
まぁ、いいや「Raspbian[推奨]」をチェックして、「インストール」をクリック
5)インストール完了!
次にやりたいのは、SSHでノートPCから操作できるようにすること。トライします。
Raspberry Piを買ってみた
前から気になっていたRaspberry Piを買いました。
初めてなので、確実に動くキットがほしかったので、安全そうな日経BP社が販売しているものをチョイス。
購入したのは、以下3点で、合計20,190円(税込) です。
- Pi3カメラケースセット(ラズパイマガジン+Pi 3+新型カメラ+ケース) 11,750円(税込)
- ラズパイマガジン2017年6月号・8月号電子工作キット 5,200円(税込)
- ラズパイマガジンが選ぶスターターキット 3,240円(税込)
ラズパイ3
ラズパイケース
カメラモジュール
電子工作キットとスターターキット
開封して、外見を触ってみたところで注意点を
- ラズパイケース ・・・かっちりハマりません。ナナメっちゃうんですよねぇ。ハメ方が悪いのか?こんなものなのか?ケースが不良なのか?よくわかりませんが、ケースは買わなくてもいいと思いました。もっといいのがありそうな。
- 公式タッチディスプレイ ・・・買ってないんですが、中に紙が入っていて、「本ディスプレイの組み立てはかなり複雑ですので、慎重に作業してください。」と書いてあります。自信のない人はちょっと心して買ってください。
次回から実際につなげていきます。