Raspberry Piを使ったしゃべるKiosk端末の作り方

# 概要
Raspberry PiのWeb Browser(Midori)をFullscreenで起動してKiosk端末化しました。時計盤は[FlipClock.js](http://flipclockjs.com/)を改造して利用しています。いわゆるLAP(Linux/Apache/PHP)環境です。電源とHDMIとLANのケーブルが刺さっています。OSはRaspbian jessieを使いました。

![fullhd-calendar-oden.jpg](https://qiita-image-store.s3.amazonaws.com/0/129326/2f4cdcfe-bda7-f10e-36f3-a4f76e3c4b7c.jpeg)

## 用意する物
- Raspberry Pi (今回は 1 Model B を使用)
- SDカード8GB
- フルHDディスプレイ
- USBキーボード
- 電源ケーブル
- HDMIケーブル
- LANケーブル

# OSのインストールと設定
OSはRaspbian jessieを使いました。[公式サイト](https://www.raspberrypi.org/downloads/raspbian/)からRASPBIAN JESSIEをダウンロードして、[installation guide](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)に従って、SDカードを作成しました。

Raspberry PiにSDカードを差し込み、ディスプレイやキーボードやLANケーブルを接続して、電源をONすれば起動するはずです。

## 初期設定
起動したら、Ctrl-Alt-F1でtty1（ターミナル画面）へ。

### raspi-config
    $ sudo raspi-config

1. ファイルシステムの容量の拡張
2. タイムゾーン/キーボードの設定
3. ホスト名の変更
4. rootパスワードの変更

### IP固定
    $ sudo vi /etc/dhcpcd.conf

```/etc/dhcpcd.conf
...
interface eth0
static ip_address=192.168.0.39/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8
```

接続テストする。

    $ ping example.com

### アップデート
    $ sudo apt-get update
    $ sudo apt-get upgrade

しばらく時間がかかる。

### ログインユーザーの変更
今回の場合では、ユーザー`pi`から新規ユーザー`oden`に変更した。

    $ sudo adduser oden
    $ sudo usermod -aG adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio oden
    $ sudo visudo
    $ sudo vi /etc/systemd/system/autologin@.service 
    $ sudo vi /etc/lightdm/lightdm.conf
    $ sudo userdel -r pi

# アプリケーションのインストールと設定
インストールしたアプリケーションは次の通りです。

- apache2
- php5
- samba
- midori
- fonts-ipaexfont
- unclutter
- xautomation
- open-jtalk
- open-jtalk-mecab-naist-jdic
- htsengine
- libhtsengine-dev
- hts-voice-nitech-jp-atr503-m001

一度ににインストールするなら

    $ sudo apt-get install apache2 php5 samba midori fonts-ipaexfont unclutter xautomation open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001

しばらく時間がかかる。

## apache2/php5のインストールと設定
    $ sudo apt-get install apache2 php5
    $ sudo chmod 777 /var/www/html
    $ sudo vi /etc/apache2/envvars

```apache:/etc/apache2/envvars
...
#export APACHE_RUN_USER=www-data
export APACHE_RUN_USER=oden
#export APACHE_RUN_GROUP=www-data
export APACHE_RUN_GROUP=oden
...
```

Apache/PHPを介して、ディスプレイのオン/オフや音量調節やOpen JTalkにしゃべらせてみる為に、起動するユーザーを`www-data`から普通のユーザー`oden`に変更しました。

## sambaのインストールと設定
    $ sudo apt-get install samba
    $ sudo vi /etc/samba/smb.conf

```/etc/samba/smb.conf
...
[www]
   comment = Home Directories
   browseable = yes
   read only = no
   path = /var/www/html
   force user = oden
   create mask = 0775
   directory mask = 0775
   valid users = oden
...
```

画面上に表示したいファイルをsambaを介して変更できるようにしました。

## Kiosk端末化

    $ sudo apt-get install midori fonts-ipaexfont unclutter xautomation
    $ vi ~/.config/lxsession/LXDE-pi/autostart

```bash:~/.config/lxsession/LXDE-pi/autostart
#@lxpanel --profile LXDE-pi
#@pcmanfm --desktop --profile LXDE-pi
#@xscreensaver -no-splash
@xset dpms 0 0 0
@xset s 0
@midori -e Fullscreen -a http://localhost/
```

### 画面のリロード
#### シェル
    $ xte -x :0 'key F5'

#### PHP
```php:/var/www/html/api/reload.php
<?php
header('Content-type: text/plain; charset=utf-8');
system("sleep 5; xte -x :0 'key F5'; echo \$?");
```

### 画面のオン/オフと音量調節
#### シェル
    $ amixer -c 0 sset PCM 50% #音量
    $ tvservice -o #画面オフ
    $ tvservice -p; sleep 1; xset -display :0 dpms force on #画面オン

#### PHP
```php:/var/www/html/api/av.php
<?php
header('Content-type: text/plain; charset=utf-8');

if(isset($_GET['a'])) {
  $a = intval($_GET['a']);
  if ($a > 100) $a = 100;
  if ($a < 10) $a = 10;
  $a = (log10($a) - 1)*100;
  system("amixer -c 0 sset PCM $a%");
}

if(isset($_GET['v'])) {
  $v = $_GET['v'];
  if ($v === "off") {
    system("tvservice -o");
  }
  if ($v === "on") {
    system("tvservice -p; sleep 1; xset -display :0 dpms force on");
  }
  system("xset -display :0 -q");
}
```

## Open JTalkのインストールと設定
    $ sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001

### しゃべらせてみる
Meiちゃんをコマンド`jsay [しゃべらせたい言葉]`でしゃべらせてみたい。

    $ sudo mkdir /usr/local/share/hts_voice/mei/
    $ sudo cp [ここにmei_normal.htsvoiceのパスを記入] /usr/local/share/hts_voice/mei/
    $ sudo touch /usr/local/bin/jsay
    $ sudo vi /usr/local/bin/jsay
    $ sudo chmod +x /usr/local/bin/jsay

```bash:/usr/local/bin/jsay
#!/bin/sh

CMDNAME=`basename $0`
if [ $# -lt 1 ]; then
    echo "Usage: ${CMDNAME} [ text ]" 1>&2
    exit 1
fi

TMPFILE=`mktemp /tmp/tmp.XXXXXX.wav`
DIC=/var/lib/mecab/dic/open-jtalk/naist-jdic/
VOICE=/usr/local/share/hts_voice/mei/mei_normal.htsvoice

echo "$1" | open_jtalk \
-x ${DIC} \
-m ${VOICE} \
-ow ${TMPFILE} && \

aplay --quiet ${TMPFILE}
rm -f ${TMPFILE}

exit 0
```

#### シェル
    $ jsay ぽぽぽぽーん

#### PHP
```php:/var/www/html/api/jsay.php
<?php
if(isset($_GET['q'])) {
  $q = $_GET['q'];
  $q = str_replace("'", "\"", $q);
  $q = mb_strimwidth($q, 0, 512, " 以下省略");
  header('Content-type: text/plain; charset=utf-8');
  system("jsay '$q'");
}
```