OpenJTalkでPHP.netのマニュアルを音声ファイルにしてBGMにするまで

PHPの勉強をするためにいろいろやったことのひとつです。   
車通勤をしていたとき、技術系のpodcastを聴いていたけれど聴くpodcastもなくなり、30分の通勤時間を勉強にあてがうことはできないのかなぁと思い、ちょうどそのときPHPを勉強していたこともあり、PHP.netのWebマニュアルを音声ファイルしてBGMとして聴こうと思い立ちました。  
以下は車で聴けるようになるまでやったことです。

## 環境構築

PHP.netをスクレイピングして取得した文章を音声ファイルにしていきます。
そのために必要なソフトをインストールします。
スクレイピングするのはPHPのGoutteを使います。
テキストを音声にするのにOpen JTalkを使用します。
Open JTalkを簡単にインストールしたいのでパッケージマネージャからインストールできるubuntuで環境を構築します。

```
vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"
```

### Open JTalk のインストール

```
$ sudo apt-get install -y open-jtalk open-jtalk-mecab-naist-jdic libhtsengine1 htsengine
$ wget http://kr.archive.ubuntu.com/ubuntu/pool/multiverse/h/hts-voice-nitech-jp-atr503-m001/hts-voice-nitech-jp-atr503-m001_1.05-1_all.deb
$ sudo dpkg -i hts-voice-nitech-jp-atr503-m001_1.05-1_all.deb
$ sudo apt-get install -y alsa-utils unzip git php5 php5-curl
```

バージョンを確認します。

```
vagrant@vagrant-ubuntu-trusty-64:~$ open_jtalk
The Japanese TTS System "Open JTalk"
Version 1.07 (http://open-jtalk.sourceforge.net/)
Copyright (C) 2008-2013 Nagoya Institute of Technology
All rights reserved.

The HMM-Based Speech Synthesis Engine "hts_engine API"
Version 1.08 (http://hts-engine.sourceforge.net/)
Copyright (C) 2001-2013 Nagoya Institute of Technology
              2001-2008 Tokyo Institute of Technology
All rights reserved.

Yet Another Part-of-Speech and Morphological Analyzer "Mecab"
Version 0.994 (http://mecab.sourceforge.net/)
Copyright (C) 2001-2008 Taku Kudo
              2004-2008 Nippon Telegraph and Telephone Corporation
All rights reserved.

NAIST Japanese Dictionary
Version 0.6.1-20090630 (http://naist-jdic.sourceforge.jp/)
Copyright (C) 2009 Nara Institute of Science and Technology
All rights reserved.

open_jtalk - The Japanese TTS system "Open JTalk"
```

動作の確認を行います。
まずは読み上げる文書(text.txt)の作成します。

```test.txt
こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
```

これを音声ファイルにします。
注意するのがOpen JTalkは外部からテキストファイルを読み込む場合、**改行があるとそこで読み込みをやめてしまう**ので、改行は含めないようにします。

```
$ open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow output.wav -x /var/lib/mecab/dic/open-jtalk/naist-jdic test.txt
```

できあがったoutput.wavを確認すると野郎の声でこんにちは連呼。
イントネーションもこんにちはをいう場所で変わりますね。
不気味ですが動作は問題ないようです。

### 女声のインストール

次に野郎の声だと学習意欲が萎えるので女声のインストールを行います。
sourceforgeからダウンロードします。
[sourceforge MMDAgent](https://sourceforge.net/projects/mmdagent/)

```
$ unzip MMDAgent_Example-1.4.zip
```

解凍したディレクトリに移動し、htsvoiceディレクトリにコピーします。

```
$ cd MMDAgent_Example-1.4/Voice
$ sudo cp -R mei /usr/share/hts-voice
```

女声になるか確認します。

```
$ open_jtalk -m /usr/share/hts-voice/mei/mei_happy.htsvoice -ow output_mai.wav -x /var/lib/mecab/dic/open-jtalk/naist-jdic test.txt
```

こちらもこんにちは連呼だけれども、なんとなくこっちの方が聴きやすい感じです。
これでOpen JTalkのインストールは完了です。

### Sox のインストール

作成された音声ファイルを結合するためにSoxを使います。インストールは以下。

```
$ sudo apt-get install -y sox
```

soxコマンドでファイルを結合する場合は以下の形式で。

```
$ sox [wavファイル名1] [wavファイル名2] [出力ファイル名]
```

つまり、２つのファイルを結合する場合は

```
$ sox input1.wav input2.wav output.wav
```

でできます。

３つ以上のファイルを結合する場合は

```
$ sox input1.wav input2.wav input3.wav ... output.wav
```

でできます。

## スクレイピングしてテキストファイルの作成

上述の構築した環境で以下のリポジトリをクローンします。
https://github.com/pinekta/listen-phpnet
このリポジトリの２つのPHPスクリプトを実行すればWavファイルが作成されます。  

上記のリポジトリをクローンした後、composer.jsonがあるのでcomposer installを行って依存するライブラリをインストールします。
composerと依存するライブラリは以下のコマンドでインストールします。

```
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar install
```

そのあと以下のコマンドを実行してスクレイピング＆音声ファイルに変換します。

```
$ php scrape2Wav.php
```

しばらく放置します。（２時間半くらいかかりました。）
パラグラフごとにwavファイルを作っているのでページごとに以下のコマンドで結合します。  

```
$ php combineWavBySox.php
```

1分から２分ほどで./dest/combined/配下にページごとで結合されたファイルができますので（約5.8GB）ダウンロードしてください。  

## 車で聴く

あとはスマホに入れて車のカーステレオとBluetoothで接続して通勤時間にでも聴いてください。
都市部にお住まいでしたら電車の中ででもお聞きください。
機械的な音声で多少違和感はありますが聴けないことはありません。
イントネーションが若干おかしいくらいです。

Open JTalkはPHPを「ペーハーピー」と喋ったり、演算子を「えんざんこ」と喋ったりしますが、そこはなんとか脳内で変換しましょう。  
ちなみに大音量で窓開けた状態で交差点で止まると通行人や隣の並んでいる車に訝しがられますのでご注意ください。

生成したWavファイルは個人だけでの利用をおねがいします。
※スクレイピングはサーバに迷惑かけないようにおこなってください。
スクレイピングについての注意事項は下記が非常に参考になります。
[Webスクレイピングの注意事項一覧](http://qiita.com/nezuq/items/c5e827e1827e7cb29011)