WSL(Ubuntu18.04LTS)でHTSデモスクリプトをとりあえず動かすまで

# 概要
本記事では、Windows10のWSL(Windows Subsystem for Linux)に、名古屋工業大学の音声合成システムHTS[^hts]をインストールし、実際にデモスクリプトを動かすまでの手順を示します。

検証に使用したPC、WSLの情報は以下の通りです。

- 検証PC
    - OS: Windows 10 Home Ver.1909 64bit
    - CPU: Intel Core i7 920 2.67GHz
    - メモリ: 24.0GB  
- WSL
 - バージョン: **WSL1**
 - ディストリビューション: Ubuntu 18.04.4 LTS

# 0.WSL及びUbuntuの初期設定等
WSLの設定は他に良い解説ページが多くありますので割愛します。著者は以下を参考に設定しました。
http://www.aise.ics.saitama-u.ac.jp/~gotoh/UbuntuOnWSL.html

[^hts]: HMM-Based Speech Synthesis System → H Triple S

設定のうち、少なくとも以下は終了している前提です。上記リンクの見出し構成に合わせています。

- WSLの有効化
- Ubuntu 18.04(LTS)のインストールおよび初期設定
    - インストール
    - 初期設定
        - インストールされているソフトウェアの更新(apt update, apt upgrade)
        - 日本語環境の設定
        - タイムゾーンを日本(JST)にする
        - Manの日本語化
- X Windowの起動(Windows側からLinuxソフトウェアを別画面表示する)
    - VcxSrvのインストール
    - Ubuntu上でのXserverの起動
- 日本語環境を整える
    - WSL上のUbuntu18.04でのEmacs
        - Emacsのインストール

# 1. 追加の設定
## Windowsのよく使うフォルダへリンクを作成
 ホームディレクトリ(~/)にWindows側へシンボリックリンクを貼る(以下はデスクトップの例)

```shell
$ ln -s /mnt/c/Users/(ホスト名)/Desktop/ ~/Desktop
```
## デフォルトのファイルパーミッションを変更
設定ファイル~/.bashrcに新規作成ファイルの権限を指定する。[^perm]

[^perm]: WSL(Windows Subsystem for Linux)の初期パーミッション設定: https://qiita.com/minwinmin/items/bf1664fc861932db884c

`umask 022`によりグループユーザ及び他ユーザの権限を、読み取り&実行(755)もしくは読み取りのみ(644)に変更する。
~/.bashrcは次回からUbuntu(bash)起動時に実行されるので、毎回以下の`source`を実行する必要はない。

```shell
$ echo 'umask 022' >> ~/.bashrc # 必ず>>で追記とすること
$ source ~/.bashrc  # 追記した設定ファイルを再度実行する
```

ちなみに、注釈の参考記事では~/.profileに追記しているが、上記のように~/.bashrcに記載しても実現できる。

## ビルドに必要なパッケージをインストール
build-essentialパッケージ(`gcc`、`make`、`perl`等)をインストールする。

```shell
$ sudo apt -y install build-essential
```

## csh(C Shell)をインストール
`tcsh`(cshの上位互換)をインストールする。

```shell
$ sudo apt -y install tcsh
```

## autoconfをインストール
`configure`の実行に必要な`autoconf`をインストールする。同時に、`automake`、 `autotools-dev`、`m4`もインストールされる。

```shell
$ sudo apt -y install autoconf
```
## Windows環境変数の読み込み無効化
WSLのコンフィグファイル/etc/wsl.confを新規作成し、Windows環境変数を読み込まないようにする。[^env]

[^env]: WSLでWindowsのPATHを引き継がないようにする方法: https://qiita.com/raccy/items/456a7158f588670c0850

```shell
$ sudo touch /etc/wsl.conf  # root権限でファイルを新規作成
$ sudo emacs /etc/wsl.conf &
```
立ち上げたemacsで以下を記載する。[^1]

```configuration:/etc/wsl.conf
[interop]
appendWindowsPath = false
```
[^1]: Ubuntu側からWindows側のプログラムを実行したくない場合は、上記ファイルに**enabled = false**を記載する

Ctrl-x Ctrl-sで保存し、Ctrl-c Ctrl-sでemacsを閉じる。

Windowsの[スタート]>[Windows管理ツール]＞[サービス]を起動し、以下の画像の通りにLxssManagerを再起動する。
![lxssManager.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630940/19ecbd92-55fc-5d51-eabb-5965096eceef.jpeg)

Ubuntuを再起動する。

# 2. SPTKのインストール
HTSデモスクリプトのINSTALLにはSPTK-3.9を指定しているが、3.9はインストールエラーが発生したのでSPTK-3.11をインストールする(3.11でデモスクリプト動作確認済)
## ダウンロード
[SPTK公式](http://sp-tk.sourceforge.net/)からSource Code: SPTK-3.11をDLし、Ubuntuへコピーする。

```shell
$ cp ~/(Windowsフォルダへのシンボリックリンク)/SPTK-3.11.tar.gz  ~/
```
## インストール
デフォルトでは**/usr/local/**にインストールされる。

`./configure --prefix=インストール先`でホームディレクトリ以下の任意の場所にインストールしてもよい。SPTKコマンドはコマンドラインで使用することも多いため、以下のどちらかをおすすめする。

- 元々PATHの通っているデフォルト(/usr/local/)にインストールする
- ホームディレクトリ以下の任意の場所にインストールし、
`export PATH="$PATH:インストール先/bin"`でPATHを通す

```shell
$ tar -zxvf SPTK-3.11.tar.gz
$ cd SPTK-3.11
$ ./configure  # --prefix=インストール先 で指定可能
$ make
$ sudo make install
```
# 3. HTSのインストール
<font color=red>**！！注意！！**
HLMToolsのMakefile.inで、以下の**if前**がTAB空白ではなく"半角スペース×8"となっており、makeがエラーで停止する(Ubuntuだけ?)
HLMToolsを解凍したら最初にemacsで該当箇所をTAB空白に修正すること。</font>

```makefile:htk/HLMTools/Makefile.in
mkinstalldir:
□□□□□□□□if [ ! -d $(bindir) -a X_ = X_yes ] ; then mkdir -p $(bindir) ; fi
```
念の為、変更前のバックアップファイルを削除する。

```shell
$ rm htk/HLMTools/Makefile.in~ # バックアップファイルを削除する
```

## ダウンロード
### HTK、HDecode
[HTK公式](http://htk.eng.cam.ac.uk/)からHTK-3.4.1、HDecode-3.4.1をDLする**(要登録)**
こちらの記事が詳しいので参考にして欲しい。
https://qiita.com/kiat/items/e51918cd49210df23f76
### HTS
[HTS公式](http://hts.sp.nitech.ac.jp/)からメニューのdownloadを選び、HTS-2.3のSource code:  HTS-2.3_for_HTK-3.4.1をDLする。

3ファイルをWindowsのフォルダからUbuntuへコピーする。

```shell
$ cp ~/(Windowsフォルダへのシンボリックリンク)/HTK-3.4.1.tar.gz  ~/
$ cp ~/(Windowsフォルダへのシンボリックリンク)/HDecode-3.4.1.tar.gz  ~/
$ cp ~/(Windowsフォルダへのシンボリックリンク)/HTS-2.3_for_HTK-3.4.1.tar.bz2  ~/
```

## HTSパッチの適応及びインストール
デフォルトでは**/usr/local/HTS-2.3/**にインストールされる。

`./configure --prefix=インストール先`でホームディレクトリ以下の任意の場所にインストールしてもよい。ただし、HTSコマンドはコマンドラインで使うことがほとんどないため、PATHの通っている/usr/local/にインストールする意味はあまりない。

HTSのINSTALLには記載されていないが、`configure`の<font color=red>CFLAGSオプションに以下を指定しないとエラーで停止する</font>ので注意(Ubuntuだけ？) [^conferr]

[^conferr]: 救世主降臨: https://stackoverflow.com/questions/37719890/install-hts-2-3-for-htk-3-4-1-on-ubuntu-16-04-has-error/37826366

```shell
$ tar -zxvf HTK-3.4.1.tar.gz
$ tar -zxvf HDecode-3.4.1.tar.gz
$ tar -jxvf HTS-2.3_for_HTK-3.4.1.tar.bz2 # bzip2で圧縮されているのでオプションはj
$ mv HTS-2.3_for_HTK-3.4.1.patch htk
$ cd htk
$ patch -p1 -d . < HTS-2.3_for_HTK-3.4.1.patch # -d後の.(カレントディレクトリ)を忘れない
$ ./configure CFLAGS="-DARCH=linux"  # --prefix=インストール先 で指定可能
$ make all
$ sudo make install
$ sudo make hlmtools install-hlmtools
$ sudo make hdecode install-hdecode
```

# 4. hts_engine APIのインストール
## ダウンロード
[hts_engine API公式](http://hts-engine.sourceforge.net/)からhts_engine_API-1.10をDLし、Ubuntuへコピーする。

```shell
$ cp ~/(Windowsフォルダへのシンボリックリンク)/hts_engine_API-1.10.tar.gz  ~/
```
## インストール
デフォルトでは**/usr/local/**にインストールされる。

`./configure --prefix=インストール先`でホームディレクトリ以下の任意の場所にインストールしてもよいが、<font color=red>解凍したhts_engine_API-1.10ディレクトリ直下にはインストールできない</font>ので注意。

```shell
$ tar -zxvf hts_engine_API-1.10.tar.gz
$ cd hts_engine_API-1.10
$ ./configure  # --prefix=インストール先 で指定可能
$ make
$ make install
```

# 5. HTSデモスクリプトを動かす
<font color=red>**！！注意！！**
特徴量抽出及び学習データ作成(make data)まで問題ないが、学習及び合成(make voice)は開始直後にエラーで停止するので、デモスクリプトを解凍したら最初にMakefile.inを書き換えること(コマンドラインで直接実行する場合も同様)</font>

原因: perl5.26でperlモジュール(.pm)の検索先リスト(＠INC)からカレントディレクトリ"."が削除され、Config.pmが見つからなかったため。詳しくは以下のページを参照のこと。
https://tutorial.perlzemi.com/blog/20170414149217.html

同ディレクトリにconfigureがあるMakefile.inのターゲットvoice部分について、script/Config.pmを<font color=red>**./**</font>script/Config.pmに書き換える。

```makefile:HTS-demo_NIT_ATR503-M001/Makefile.in
voice:
        echo "Running a training/synthesis perl script (Training.pl) in background...."
#       @PERL@ scripts/Training.pl scripts/Config.pm > log 2>&1 &
        @PERL@ scripts/Training.pl ./scripts/Config.pm > log 2>&1 &
```
念の為、変更前のバックアップファイルを削除する。

```shell
$ rm HTS-demo_NIT_ATR503-M001/Makefile.in~ # バックアップファイルを削除する
```

## HTSデモスクリプトのダウンロード(ATR503文男性)
[HTS公式](http://hts.sp.nitech.ac.jp/)からメニューのdownloadを選び、HTS-2.3のSpeaker dependent training demo: Japanese HTS-demo_NIT-ATR503-M001をDLし、Ubuntuへコピーして解凍する。

```shell
$ cp ~/(Windowsフォルダへのシンボリックリンク)/HTS-demo_NIT-ATR503-M001.tar.bz2  ~/
$ tar -jxvf HTS-demo_NIT-ATR503-M001.tar.bz2
```

## パラメータ設定及び学習スクリプト実行
SPTK、HTS、hts_engine APIをデフォルトの場所にインストールした場合は以下のパスを指定する。それ以外は各々のコマンドがあるディレクトリを指定する。

記事末尾のおまけにあるconf.shを使用するとconfigureがラクかもしれない。
(以下のオプションに該当する変数3つにパスを記載してシェルスクリプトを実行)

```shell
$ ./configure --sptk-search-path=/usr/local/bin \ 
      --hts-search-path=/usr/local/HTS-2.3/bin \
      --hts-engine-search-path=/usr/local/bin
$ make data  # 特徴量抽出及び学習データ作成
$ make voice # 学習及び合成
```

# 終わりに
これで"とりあえずは"HTSデモスクリプトが最後まで動くはずです。
著者の環境では、make dataに約1時間、make voiceに約4時間半かかりました。
日本語歌声デモスクリプトは全部で12時間くらいかかりました。

# おまけ
上記のデモスクリプトで、configureのオプションをコマンドラインでいちいち指定するのは非常に面倒です。

そこで、オプションに対応する変数を定義し、連結して実行するシェルスクリプト: conf.shを作りました。簡単な使い方と機能を記載したreadmeも同梱しています。どうぞお使いください。
OneDrive  https://1drv.ms/f/s!AoplgFa8hZqvnQ632m8coFlWTCMh