はじめに
この記事は CPS Lab Advent Calendar 2016 の24日目の記事です。
23日目の記事はkalabu_umesさんのこの研究室のここがヤバイをお伝えしたいです。
Why
クリスマスになると、サンタさんからプレゼントが届くはず!
- いち早くプレゼントの中身を確認したい
- せっかくのクリスマスならカノジョと一緒に居たい
そんな期待に応えるためにこの記事を書くことにしました。
クリスマスの朝に起こしてくれる、RaspberryPi製の彼女を作るまでのお話です。
概要
- 毎年12月25日の朝6時になるとラズ子が起こしてくれる。
- cronを使って、ラズ子を喋らせるスクリプトを実行する。
使用したもの
- Raspberry Pi2 Model B
- BUFFALO WLI-UC-GNM2
- アンプ (イヤホンジャックを介して利用)
ラズパイの設定
まずラズパイで下記の二点の設定をします。
- デフォルトでは50%くらいになってますが、なぜだかとても小さいので最大値の100%にします。
- 音声の出力をイヤホンジャックにする設定
sudo amixer cset numid=1 100%
sudo amixer cset numid=3 1
amixerコマンドが少々分かりにくいですが、numid=1でボリュームの設定を指定し、numid=3でイヤホンジャックかHDMIで音を出すかの設定ができるみたいです。
ここまでできたら音が出力できてるかチェックしましょう。
speaker-test -t sine -f 440
これで音が鳴っていればラズパイ側の設定は大丈夫です。
他にも、GUIで音量調整ができるalsamixerなどで設定ができます。
alsamixer
GUI操作で音量をMAXにする
alsactl store
sudo reboot
日本語音声合成ソフトのインストールと設定
次にラズパイを喋らせます。今回は日本語音声合成ソフトにOpen JTalkを使用しました。
RaspbianはDebianベースですのでapt-getでソフトウェアをインストールできます。
sudo apt-get install -y open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
これでインストールができたので試しに喋らせます。
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オプションが音声データの指定になります。
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ちゃんということになり、少し複雑な気持ちです。
コードを書く
数行しか書くことがありませんが、crontabに長いコマンドを書くのもナンセンスかなーって思ったのでpythonでコードを書きます。
まず、任意の場所にフォルダを作成します。
mkdir /home/pi/Documents/rasko
cd /home/pi/Documents/rasko
次に、コードを書きます。下記のコードを実行するだけで、textという変数に入っている文字列をラズ子が言ってくれます。
# -*- 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 -e
時間(クリスマス)と実行するスクリプトを指定します。
cronの設定項目は左から順に「分」「時」「日」「月」「曜日」です。指定が無い場合は、「*」を記述します。
下記は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サービス創造記
記述方法は少しだけ上記で示しましたが、「分」「時」「日」「月」「曜日」「実行するコマンド」という順番で記述します。
また、「*/数」で間隔を指定することなど、細かく設定することができます。いくつか設定例を下記に記すので、参考にしていただければ幸いです。
一時間おきに実行される
*/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