【 マイコン系カノジョ 】 ラズ子にクリスマスの朝起こしてもらう

# はじめに
この記事は [CPS Lab Advent Calendar 2016](http://www.adventar.org/calendars/1536) の24日目の記事です。
23日目の記事はkalabu_umesさんの[この研究室のここがヤバイをお伝えしたい](http://kaxabu.blogspot.jp/2016/12/blog-post.html)です。


# Why
クリスマスになると、サンタさんからプレゼントが届くはず！

 - いち早くプレゼントの中身を確認したい
 - せっかくのクリスマスならカノジョと一緒に居たい

そんな期待に応えるためにこの記事を書くことにしました。
クリスマスの朝に起こしてくれる、RaspberryPi製の彼女を作るまでのお話です。

![IMG_2712.JPG](https://qiita-image-store.s3.amazonaws.com/0/93753/c348bf3b-aced-f945-c1fb-a7880b7c0da2.jpeg)

# 概要
 - 毎年12月25日の朝6時になるとラズ子が起こしてくれる。
 - cronを使って、ラズ子を喋らせるスクリプトを実行する。

# 使用したもの
- [Raspberry Pi2 Model B](https://www.amazon.co.jp/Raspberry-Pi-2-Model-B-2015%E5%B9%B42%E6%9C%88%E7%99%BA%E5%A3%B2%E5%93%81/dp/B00T9LR2I4/ref=sr_1_2?ie=UTF8&qid=1481544951&sr=8-2&keywords=raspberry+pi+2+model+b)
- [BUFFALO WLI-UC-GNM2](https://www.amazon.co.jp/BUFFALO-11n%E5%AF%BE%E5%BF%9C-%E7%84%A1%E7%B7%9ALAN%E5%AD%90%E6%A9%9F-%E8%A6%AA%E6%A9%9F-%E5%AD%90%E6%A9%9F%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E5%AF%BE%E5%BF%9C%E3%83%A2%E3%83%87%E3%83%AB-WLI-UC-GNM2/dp/B005DU4XSM/ref=sr_1_1?ie=UTF8&qid=1481544908&sr=8-1&keywords=WLI-UC-GNM2)
- アンプ (イヤホンジャックを介して利用)

# ラズパイの設定
まずラズパイで下記の二点の設定をします。

 - デフォルトでは50%くらいになってますが、なぜだかとても小さいので最大値の100%にします。
 - 音声の出力をイヤホンジャックにする設定

```:Terminal
sudo amixer cset numid=1 100%
sudo amixer cset numid=3 1
```

amixerコマンドが少々分かりにくいですが、numid=1でボリュームの設定を指定し、numid=3でイヤホンジャックかHDMIで音を出すかの設定ができるみたいです。
ここまでできたら音が出力できてるかチェックしましょう。

```:Terminal
speaker-test -t sine -f 440
```

これで音が鳴っていればラズパイ側の設定は大丈夫です。
他にも、GUIで音量調整ができるalsamixerなどで設定ができます。

```:Terminal
alsamixer
GUI操作で音量をMAXにする
alsactl store
sudo reboot
```

# 日本語音声合成ソフトのインストールと設定
次にラズパイを喋らせます。今回は日本語音声合成ソフトにOpen JTalkを使用しました。
RaspbianはDebianベースですのでapt-getでソフトウェアをインストールできます。

```:Terminal
sudo apt-get install -y open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
```

これでインストールができたので試しに喋らせます。

```:Terminal
touch hello | echo 'こんにちは、ラズ子だよ！' > hello
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 hello.wav hello
aplay hello.wav
```

aplayコマンドで音声が出力されれば成功です。
ただ、現段階だと男の人の声です。ラズ子は女性ですのでMMDAgentを使って女性の声にします。

# MMDAgentを用いて声を変える
MMDAgentより音声データを入手し、女性の声を指定してwavファイルに変換します。
また、-mオプションが音声データの指定になります。

```:Terminal
wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip
unzip MMDAgent_Example-1.6.zip
sudo cp -R ./MMDAgent_Example-1.6/Voice/mei /usr/share/hts-voice/
open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow hello.wav hello
aplay hello.wav
```

これで女性の声が出力されるようになります。
蛇足ですが、この音声のマスコットキャラクターの名前はMeiちゃんと言うそうです。
ラズ子の声を担当するのがMeiちゃんということになり、少し複雑な気持ちです。

![gvnD96CfVJVdAf01481783010_1481783065.jpg](https://qiita-image-store.s3.amazonaws.com/0/93753/f256016c-bac7-a9c7-532b-a8da00603c01.jpeg)


# コードを書く
数行しか書くことがありませんが、crontabに長いコマンドを書くのもナンセンスかなーって思ったのでpythonでコードを書きます。

まず、任意の場所にフォルダを作成します。

```:リポジトリの作成
mkdir /home/pi/Documents/rasko
cd /home/pi/Documents/rasko
```

次に、コードを書きます。下記のコードを実行するだけで、textという変数に入っている文字列をラズ子が言ってくれます。

```:/home/pi/Documents/rasko/index.py
# -*- coding: utf-8 -*-
import os

text = 'おはよう、ラズ子だよ！クリスマスプレゼントが届いてるかも！'
os.system('sudo echo ' + text  + ' | open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow /home/pi/Documents/rasko/speach.wav')
os.system('sudo aplay /home/pi/Documents/rasko/speach.wav')
os.system('rm /home/pi/Documents/rasko/speach.wav')
```

また、cronを使うスクリプトを書く場合にファイルの入出力があるときなどは、絶対パスで指定するのが無難です。


# cronの設定
crontabを編集して、決まった時間に先ほど作成したスクリプトが実行されるようにします。
下記のcrontabコマンドに-eオプションを付けることで編集できます。
また、eはeditのeです。

```:crontabを編集するコマンド
crontab -e
```

時間(クリスマス)と実行するスクリプトを指定します。
cronの設定項目は左から順に「分」「時」「日」「月」「曜日」です。指定が無い場合は、「*」を記述します。
下記はcrontabの編集例です。

```:crontabの編集例
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

00 6 24 12 * sudo python /home/pi/Documents/rasko/index.py
```

これでクリスマスにラズ子が起こしてくれるはず！

# cronについて
cronについて詳しく記述しなかったので、ここで書いておきたいと思います。

> ### そもそもcronとは...
> cronとは、決められた時刻にコマンドを定期的に実行させるためのデーモンプロセスです。
> cronではコマンドだけにとどまらず、シェルスクリプトや、PerlやPHPなどのインタープリタ言語で書かれたプログラムも動作させることができます。
>引用 :  [cronの設定・実行 | WEBサービス創造記](http://linuxserver.jp/linux/cron%E8%A8%AD%E5%AE%9A)

記述方法は少しだけ上記で示しましたが、「分」「時」「日」「月」「曜日」「実行するコマンド」という順番で記述します。
また、「*/数」で間隔を指定することなど、細かく設定することができます。いくつか設定例を下記に記すので、参考にしていただければ幸いです。

```:設定例
一時間おきに実行される
*/30 * * * * sudo python /home/pi/Documents/rasko/index.py

毎時10,20,30分に実行される
10,20,30 * * * * sudo python /home/pi/Documents/rasko/index.py

土日の7時にのみ実行される
* 7 * * 6,0 sudo python /home/pi/Documents/rasko/index.py
```

# 参考
- [Open JTalk (テキストを音声へ変換)をインストールし、使ってみる](http://server-setting.info/centos/open-jtalk-install.html)
- [萌え声を探せ！Open JTalkのパラメータをいろいろ変化させてみた！](http://moblog.absgexp.net/openjtalk/)
- [OpenJTalk + python で日本語テキストを発話](http://qiita.com/kkoba84/items/b828229c374a249965a9)
- [Raspberry piで日本語音声合成(Open JTalk)を試してみる。] (http://qiita.com/lutecia16v/items/8d220885082e40ace252)
- [cronの設定・実行 | WEBサービス創造記](http://linuxserver.jp/linux/cron%E8%A8%AD%E5%AE%9A)
- [crontabの書き方 | server-memo.net](http://www.server-memo.net/tips/crontab.html)
- [2012年08月11日｜★もきゅもきゅもみゅーん - The Design -](http://yasukawa.c-point.ne.jp/d2012-08-11.html)