LoginSignup
11

More than 5 years have passed since last update.

LINEBOT+Open Jtalkで初音ミクに全力人力でしゃべらせてみた

Last updated at Posted at 2016-12-19

逃げ恥を見ていて、ガッキーがペッパー君と楽しそうに話しているのを見て、ロボット欲しいなと思ったけれども、小遣いでは買えそうにないので、代わりになるものを作ってみた。

構想

入力した内容をそのまま話させる。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...



上記でできた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を利用する。

callback.php
<?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 を設定する。

動作

じんりきみーくの完成。


Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11