Node-REDにOpen Jtalkを組み込んでText to Speech !


ホームディレクトリを、/home/user1 とします。
Open Jtalkは、名古屋工業大学開発の日本語音声合成ソフトウェアです。
今回は、ローカルのLinux環境に構築したNode-REDにOpen Jtalkを組み込み、テキストデータを音声で読み上げてみたいと思います。スマートスピーカーを作る上で、音声合成は必須です。

Open-Jtalkのインストール

Node-REDはローカル環境のLinux上に構築してあり、Ubuntu16.04ベースのものを使っていますから、Ubuntu向けのパッケージのおかげでインストールは非常に楽です。

先ずはOpen-Jtalkをインストールします。
$ sudo apt-get update
$ sudo apt-get install open-jtalk

インストール時に、下記提案パッケージが表示されますので、こちらもインストールします。
$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

Node-REDで呼び出すシェルスクリプトの作成

Open-Jtalkのインストールは完了です。 標準出力のものをテキストから音声に変換する処理を行いますので、テキストファイルを作成します。
- ホームディレクトリ内に、voice.txt を作成 --> $ nano /home/user1/voice.txt
- こんにちは、せかい と記述

execノードで実行するシェルスクリプト

$ nano jtalk.sh

#!/bin/sh

cat /home/user1/voice.txt | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow /home/user1/jtalk.wav
play /home/user1/jtalk.wav
rm -f /home/user1/jtalk.wav

$ chmod a+x jtalk.sh

Node-REDで、execノードを使用する際に、|(パイプ)でコマンドをつなぐとエラー起きるため、シェルスクリプトとしてまとめています。
このシェルスクリプトは、Open-Jtalkを用いてテキストファイル内の文章をjtalk.wavに変換し、jtalk.wavを再生、再生後は、jtalk.wavを破棄という流れです。
Node-RED内のノードから出力されたテキストデータをテキストファイルとして一度保存する工程にしておけば、別に作っておいた天気予報やチャットボットと組み合わせ易くなります。

Node-REDに組み込み

作成したシェルスクリプトを「exec」ノードに組み込み、「inject」ノード(下図のtimestampと表示されているノード)と、「file in」ノード(voice.txtと表示)、debugノードで線でつなぎます。あるいは、Node-RED画面右上の「三」→「読み込み」→「クリップボード」にて、サンプルフローを読み込みます。

サンプルフロー

[{"id":"5182ef17.5027f","type":"tab","label":"Open Jtalk","disabled":false,"info":""},{"id":"4b2e227b.1625ec","type":"file in","z":"5182ef17.5027f","name":"voice.txt","filename":"/home/user1/voice.txt","format":"utf8","chunk":false,"sendError":false,"x":273,"y":44,"wires":[["a9f80fce.6ca6"]]},{"id":"f120b0e9.f651f","type":"inject","z":"5182ef17.5027f","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":108,"y":45,"wires":[["4b2e227b.1625ec"]]},{"id":"a9f80fce.6ca6","type":"exec","z":"5182ef17.5027f","command":"/home/user1/jtalk.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"open-jtalk","x":457.5,"y":43.5,"wires":[[],[],["9a7d5b65.81d768"]]},{"id":"9a7d5b65.81d768","type":"debug","z":"5182ef17.5027f","name":"","active":true,"console":"false","complete":"false","x":668,"y":58,"wires":[]}]

実装後、先頭の「inject」ノードの左端をクリックすると音声で「こんにちはせかい」と聞こえるはずです。「inject」ノードの編集画面を呼び出すと定期的に実行する処理を設定することができます。

まとめ

Open-Jtalkを使用することで、Text to Speechをローカル環境に実装することができました。ただ、Open Jtalkは日本語専用で「ひらがな」「カタカナ」「漢字」「数字」を理解して読み上げます。アルファベットは、たとえばHello Worldでは、エイチイーエルエルオー ダブリューオーエルディー と読み上げます。日本語と英単語が混在するような文章については、無料枠がある「Watson Text to Speech」の方がまだまだ優秀です。
今回の「Open Jtalk」は、スマートスピーカー利用者に音声で伝える際に、「ひらがな」「カタカナ」「漢字」「数字」で構成された文章であれば使いどころがあるでしょう。

関連コンテンツ