日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

Raspberry pi 2をOpen JTalkを使って喋らせよう(途中まで成功)

Open JTalkというフリーソフトがあります。音声合成によってコンピュータを喋らせようという試みです。
最近手に入れたRaspberry pi 2 Model Bを使ってこれを試してみました。

依存関係について

HTK

Hidden Markov Model Toolkitというもので、音声認識のために作られたライブラリとのこと。今回はVersion 3.4.1をダウンロード。ダウンロードにはメールアドレスの登録が必要。
HTK Speech Recognition Toolkit

HDecode

上と同じサイトで配布されている。HTKと同じディレクトリに追加してからコンパイルする。喋らせるのにこれが必要らしい。こちらもVersion 3.4.1をダウンロードした。

HTS

こちらは日本の人たちが作った物で、日本語を喋らせるには必要らしい。HTKとHDecodeに対してパッチの形で適用してからコンパイルする。
Home - HMM-based speech synthesis system (HTS)

HTS Engine API

HTSを呼び出すためのAPI。open_jtalkコマンドはこのAPIを呼び出しているらしい。
hts_engine API

Open JTalk

これが最終目的。open_jtalkコマンドは入力されたテキストファイルを解析して日本語で喋る。
Open JTalk

MeCab

日本語テキストを単語に分解するためのソフトウェア。Open JTalkと一緒にインストールされるのかもしれないが、今回私は先にapt-get install mecabしていたので単に使われただけかも。

ほかに必要なものはスピーカー(HDMIの音声出力ができているならそれで足りるはず)。

辞書(Dictionaryファイル)

喋らせるには辞書ファイルと音声ファイルも必要みたい。Open JTalkのサイトからUTF-8版を入手。
自分の環境はenvコマンドでLANGの項目を見ればよいでしょう。

順番にインストール

HTK + HDecode + HTS

アーカイブを解凍してINSTALLファイルに書いてある通りに実行。同じhtkというディレクトリに展開される。

% tar -zxvf HTK-3.4.1.tar.gz
% tar -zxvf HDecode-3.4.1.tar.gz

HTSはpatchコマンドで適用する。アーカイブを解凍するとHTS-2.2_for_HTK-3.4.1.patchファイルが作成されるので、昔懐かしのpatchコマンドでこれを適用する。

% cd hts
% patch -p1 -d . < ../HTS/HTS-2.2_for_HTK-3.4.1.patch

普通にコンパイルしてみる。が、Xlib.hがないと言われてコンパイルできず。

% make
:
:
:
HGraf.c:118:77: fatal error: X11/Xlib.h: そのようなファイルやディレクトリはありません

調べたところ、Xlib.hはxorg-devというパッケージに含まれているそうだ。

% sudo apt-get install xorg-dev

これでHTSがmakeできるようになった。

% make
% sudo make install

HTK Engine API

こちらは簡単にインストール

% tar xf hts_engine_API-1.09.tar.gz
% cd hts_engine_API-1.09/
% ./configure
% make
% sudo make install

Open JTalk

簡単にインストール…… と思ったのだけど、これはだめだった(下記)。

% cd ./open_jtalk-1.08
% ./configure
% make
% make install

さあ実行!

いざ!とopen_jtalkコマンドを実行してみたものの、エラーでwavファイルは生成されず。

pi@raspberrypi:~/openjtalk$ cat talk.txt | open_jtalk -x ./open_jtalk_dic_utf_8-1.08 -m hts_voice_nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice -ow ~/talk.wav
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: set_unvoiced_vowel() in njd_set_unvoiced_vowel.c: Wrong pron.ERROR: detect_byte() in njd_set_long_vowel.c: Wrong character.
pi@raspberrypi:~/openjtalk$ cat talk.txt
こんにちは!らずぱい ツーです。
pi@raspberrypi:~/openjtalk$

envコマンドで確認してもUTF-8なので、ダウンロードした辞書は間違っていないはず。そこでこちらのWebページをみたら、この人はUTF-8コンパイルしなおしたとある。やりなおしてみる。

% make distclean
% ./configure --with-charset=UTF-8
% make
% sudo make install

さあ!実行!!

いざ!!

pi@raspberrypi:~/openjtalk$ cat talk.txt | open_jtalk -x ./open_jtalk_dic_utf_8-1.08 -m hts_voice_nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice -ow ~/talk.wav
pi@raspberrypi:~/openjtalk$

お、コマンド実行に成功しました。そしてできたのがこちらのファイル。よしよし、順調にしゃべれていますよ。Raspberry pi 2では、結構音声合成に時間がかかります。5秒くらいかな。
talk.zip - Google ドライブ

できたこと、できなかったこと

なにはともあれ喋らせることには成功したのですが、長い台詞を喋らせようと試してみると、少々課題もあります。前回のブログの原稿の冒頭部分を音声にしてみました。合成にかかる時間は約25秒。

pi@raspberrypi:~/openjtalk$ time cat talk.txt | open_jtalk -x ./open_jtalk_dic_utf_8-1.08 -m hts_voice_nitech_jp_atr5
03_m001-1.05/nitech_jp_atr503_m001.htsvoice -ow ./talk.wav

real    0m24.047s
user    0m22.710s
sys     0m0.130s
pi@raspberrypi:~/openjtalk$ cat talk.txt
発売したばかりのRaspberry pi 2 Model Bを購入しました。当初、特段の計画もなく、Linuxが動くんだしとりあえず買ってみればなんとかなるだろう、と軽く考えていました。ラズパイ自体が初めてですので、ネットを検索しながらmicroSDカード(16GB)にRasbianのイメージを焼き、起動にはあっさり成功。ここまでは順調でした。
しかし、ラズパイは基盤が小さいですから、電源(iPadのアダプタをUSBケーブルでつないだ状態)とLANケーブル、USBキーボードとマウス、HDMIケーブルを接続すると、ケーブルのテンションに引っ張られ、置きたいところにも置けない状態になります。
もちろん軽いのはいいことなんですが、美しくない。ケーブルはできるだけ取り払いたいです。というわけで、電源ケーブル以外 の線を全部不要にするべく、がんばりました。
pi@raspberrypi:~/openjtalk$ ls -l talk*
-rw-r--r-- 1 pi pi    1000  2月 20 15:19 talk.txt
-rw-r--r-- 1 pi pi 3553964  2月 20 15:20 talk.wav
pi@raspberrypi:~/openjtalk$

でも、実際に再生してみると、以下の問題があります。

  1. 英単語は一文字ずつ読んでしまう。Raspberry piは「あーるえーえすぴー……」などとなる。
  2. 途中なぜか気持ち悪く遅くなってる。
  3. 一段落で終了している。

このあたりは今後詰めてゆこうと思います。

Raspberry Piスターターパック (Pi2 用Standard)

Raspberry Piスターターパック (Pi2 用Standard)