a stray sheep

お仕事周りの雑記帳

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 71日、14290秒
**********************
jsay '千葉県 千葉 の天気 今日の天気は曇時々雨です。 明日の天気は曇りです。
明日 の予想最高気温、28度、予想最低気温、23度です。'

やったー。Webから取ってきた天気予報をしゃべったーー。



さて、次は何をしようかな。

Raspberry Piでしゃべってみる

スピーカーから音を出せたので、今度はラズパイにしゃべらせたいと思います。

参考にしたのはこちら。
途中の「日本語音声合成システム(Open JTalk)のインストール」からやっています。

qiita.com

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スピーカーと接続

Bluetoothバイスの準備

  • 電源を入れる
  • ペアリング状態にする(SRS-X33の場合は、PAIRINGボタン長押し)

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派がかなり多いなぁ・・・。どれが正解なんだ??

こちらに解がありました。

Raspbian(jessie)の固定IPアドレス設定方法


/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

→見事に、日本語になりましたー

f:id:belial6:20170627235412p:plain

 

SSH接続

メニュー→「設定」→「Raspberry Pi の設定」で、設定ウィンドウを開く

インタフェースタブで、以下を選択

  SSH: Disable →Enable

f:id:belial6:20170628000821p:plain

 

IPアドレスを確認したら、「192.168.1.9」でした。

 

そして、ノートからTeraTermで接続

  アドレス: 192.168.1.9

   ユーザ/パスワード: pi/raspberry

→接続できました。

 

 これで、ラズパイをもっと容易に使うことができます。

 

 

Raspberry Piを起動してみた

 

今回は、ラズパイを起動してみたいと思います。

ここらへんは、ラズパイマガジン2017年8月号のP137~に書いてあります。

 

1)まずは、スターターキットのmicroSDカード(16GB)を差し込みます。
OSは書き込み済みなので、そのまま差すだけです。

f:id:belial6:20170627232220p:plain

 

2)続いて、ラズパイにいろいろ差していきます。

  • LANケーブル
  • USBキーボード
  • USBマウス
  • HDMIケーブル(液晶テレビとつなぎました)
  • 電源アダプター

 

3)いよいよ電源を入れます。スイッチオン!!

電源入れた後の画面です。おぉ、何か起動した。そして、OSではない!?

f:id:belial6:20170627232031p:plain

 

4)最初の画面は、NOOBSでした。

「OS書き込み済み」って書いてあったから、てっきりOSインストール済みかと思ったら、OS導入支援ツールの「NOOBS」が書き込み済みとのこと(中の紙に書いてあった・・・)

まぁ、いいや「Raspbian[推奨]」をチェックして、「インストール」をクリック

f:id:belial6:20170627233148p:plain

 

5)インストール完了!

f:id:belial6:20170627234506p:plain

 

f:id:belial6:20170627235231p:plain

 

 次にやりたいのは、SSHでノートPCから操作できるようにすること。トライします。

 

Raspberry Piを買ってみた

前から気になっていたRaspberry Piを買いました。

初めてなので、確実に動くキットがほしかったので、安全そうな日経BP社が販売しているものをチョイス。

itpro.nikkeibp.co.jp

 

 

購入したのは、以下3点で、合計20,190円(税込) です。

  • Pi3カメラケースセット(ラズパイマガジン+Pi 3+新型カメラ+ケース) 11,750円(税込)
  • ラズパイマガジン2017年6月号・8月号電子工作キット 5,200円(税込)
  • ラズパイマガジンが選ぶスターターキット 3,240円(税込)

 

ラズパイ3

f:id:belial6:20170627224951p:plain

f:id:belial6:20170627225407p:plain

ラズパイケース

f:id:belial6:20170627225023p:plain

カメラモジュール

f:id:belial6:20170627225100p:plain

電子工作キットとスターターキット

f:id:belial6:20170627224909p:plain

 

 開封して、外見を触ってみたところで注意点

  • ラズパイケース ・・・かっちりハマりません。ナナメっちゃうんですよねぇ。ハメ方が悪いのか?こんなものなのか?ケースが不良なのか?よくわかりませんが、ケースは買わなくてもいいと思いました。もっといいのがありそうな。
  • 公式タッチディスプレイ ・・・買ってないんですが、中に紙が入っていて、「本ディスプレイの組み立てはかなり複雑ですので、慎重に作業してください。」と書いてあります。自信のない人はちょっと心して買ってください。

 

次回から実際につなげていきます。