逃げ恥を見ていて、ガッキーがペッパー君と楽しそうに話しているのを見て、ロボット欲しいなと思ったけれども、小遣いでは買えそうにないので、代わりになるものを作ってみた。
構想
入力した内容をそのまま話させる。INはなんでも良いが、一般人でもイメージしやすいようにLINEがベター。
LINEからの入力はSSL証明書が用意されたサーバが必要で、普段はVPSかAWSに無料のLetsEncryptを設定して対応しているが、今回はその方法ではうまくいかない。
なぜならサーバから音声を出したいので、ローカルでサーバを運用する必要があるからだ。
環境は ノートPC(windows10)にのせたvirtualbox+vagrantで行うこととした。
キーワード
ググってみたところ、入力した文字を音声化するのとローカルサーバをSSLで外部公開できるライブラリが見つかった。
- Open Jtalk(入力した日本語を音声化する)
- ngrok(ローカル環境をテンポラリで外部公開する)
Open Jtalk環境構築
centosにOpen Jtalkをインストールする。Oopen Jtalkを利用するには当該ライブラリ以外にhts_engine APIと辞書ファイル、音声ファイルが必要となってくるのでインストールする。
hts_engine APIのインストール
$wget http://downloads.sourceforge.net/hts-engine/hts_engine_API-1.09.tar.gz
...
$tar zxvf hts_engine_API-1.09.tar.gz
...
$cd hts_engine_API-1.09
$./configure
...
config.status: creating Makefile
$make
...
$make install
...
$which hts_engine
usr/local/bin/hts_engine
Open Jtalkのインストール
$wget http://downloads.sourceforge.net/open-jtalk/open_jtalk-1.09.tar.gz
...
$tar zxvf open_jtalk-1.09.tar.gz
...
$cd open_jtalk-1.09
$./configure
...
config.status: creating Makefile
$make
...
$make install
...
$which open_jtalk
/usr/local/bin/open_jtalk
辞書のインストール
Open Jtalkで使う辞書のインストールを行う。
$mkdir /usr/local/share/open_jtalk
$wget http://sourceforge.net/projects/open-jtalk/files/Dictionary/open_jtalk_dic-1.07/open_jtalk_dic_utf_8-1.07.tar.gz
...
$tar zxvf open_jtalk_dic_utf_8-1.07.tar.gz
...
$su -
$mv open_jtalk_dic_utf_8-1.07 /usr/local/share/open_jtalk/
初音ミク音声をOpen Jtalkで
Open Jtalkでは音声サンプルがいくつか用意されているが、今回はそれらを利用せず、個人が作っている初音ミクの音声を利用させていただく。
.htsvoice形式までの作り方はいかが参考になる。
Open JTalkで初音ミクの声でおしゃべりさせる@Mac/Linux/Raspberry Pi - karaage. [からあげ]
Voice.htsvoice... |
$mkdir /usr/local/share/hts_voice/miku
$mv Voice.htsvoice /usr/local/share/hts_voice/miku/miku.htsvoice
以上でOpen Jtalkの環境ができたのでテストをしてみよう。
Open Jtalkのテスト
$echo '今日は晴れです' | /usr/bin/tr -d '\n' | open_jtalk \
-m /usr/local/share/hts_voice/miku/miku.htsvoice \
-ow /tmp/output.wav -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.09
$sudo aplay /tmp/output.wav
無事PCから音声が流れたらOKだ。出ない場合は僕も引っかかったがvirtualboxの設定でオーディオが無効になっている可能性があるので、一度vagrantを落としてオーディオを有効にしてから試してほしい。
プログラム
LINEからメッセージを受信して、Open Jtalkを話すプログラムを書いてみよう。
今回はPHPを選択する。LINEが提供するSDKからLINEBotTinyを利用する。
<?php
require_once('./LINEBotTiny.php');
$channelAccessToken = 'YOUR_ACCESS_TOKEN';
$channelSecret = 'YOUR_SECRET';
$client = new LINEBotTiny($channelAccessToken, $channelSecret);
foreach ($client->parseEvents() as $event) {
switch ($event['type']) {
case 'message':
$message = $event['message'];
switch ($message['type']) {
case 'text':
$client->replyMessage(array(
'replyToken' => $event['replyToken'],
'messages' => array(
array(
'type' => 'text',
'text' => 'きちんと話したよ'
)
)
));
// DB
$mongo = new Mongo();
$db = $mongo->selectDB("mikubot");
$coll = $db->selectCollection("messages");
$coll->insert( (array('message' => $message['text'], 'ts' => new MongoDate() )) );
// open_jtalk
exec("sudo /usr/local/bin/line_talk \"". $message['text']. "\"");
break;
default:
error_log("Unsupporeted message type: " . $message['type']);
break;
}
break;
default:
error_log("Unsupporeted event type: " . $event['type']);
break;
}
};
?>
基本はecho_bot.phpを真似しただけだが、このPHPでは追加で2つの要素が入っているので追記しておく。
一つ目はmongdbに話したい内容をためることにした。今はLINEから入力した内容のみを話す人力知能だけれども、いつか人工知能になってくれることを祈って。
二つ目はexecの部分だ。
line_talk コマンドの中身を書いておく。
$ cat line_talk
/bin/sh
echo $1 | /usr/bin/tr -d '\n' | open_jtalk \
-m /usr/local/share/hts_voice/miku/miku.htsvoice \
-ow /tmp/output.wav -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.09/
sudo aplay /tmp/output.wav
上記PHPをapacheなり、nginxなり、php -S localhost:8080なりでローカルサーバをたてて配置する。
このときhttpsの設定は必要なくhttpの事だけ考えてよい。
LINE Messaging APIをvagrantから利用する
LINE Messaging APIの設定
初めてだと少しわかりづらいがQiitaなどに沢山情報が落ちているので検索してみよう。
ngrokの設定
ngrokをインストールする。
$npm i -g ngrok
ngrokの起動
$nngrok http 80
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Version 2.1.18
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://xxxxxxx.ngrok.io -> localhost:80
Forwarding https://xxxxxxx.ngrok.io -> localhost:80
https://xxxxxxx.ngrok.io をコピー。
webhook
LINE Messaging API のWebhook URLにhttps://xxxxxxx.ngrok.io/XXXX/callback.php を設定する。
動作
じんりきみーくの完成。
じんりきみーく pic.twitter.com/RJlIJc5qR3
— momochan_qiita (@momochan_qiita) 2016年12月19日