音声合成Open JTalkのインストール[On Windows 10]

#0.前提条件
- Windows 10 Pro
- HTS Engine API 1.10
- Open JTalk 1.10
- Visual Studio 2017 Community

#1. ダウンロード
HTSエンジンとOpen JTalk及び音源をダウンロードしてきます。
その後、各アーカイブを解凍しておきます（[7zip](https://sevenzip.osdn.jp/)を使用しました）。

https://sourceforge.net/projects/hts-engine/
**hts_engine_API-1.10.tar.gz**

https://sourceforge.net/projects/open-jtalk/
**open_jtalk-1.10.tar.gz**
*[Files]→[HTS voice]→[hts_voice_nitech_jp_atr503_m001-1.05]*
**hts_voice_nitech_jp_atr503_m001-1.05.tar.gz**


#2. HTSエンジンのビルド
「VS 2017用 x64 Native Tools コマンドプロンプト」を開いて、HTSエンジンのフォルダに移動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/c05455f4-c31a-378b-db4a-0161620e82a3.png)

```Console:dos
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>d:

D:\>cd Develop\open-jtalk\hts_engine_API-1.10
```
移動したら、nmakeコマンドでビルドします。

```Console:dos
D:\Develop\open-jtalk\hts_engine_API-1.10>nmake -f Makefile.mak
```

#3. Open JTalkのビルド
次にOpen JTalkをビルドします。
bin\Makefile.makにHTSエンジンのデフォルトのインストールパス（***C:\hts_engine_API***）が明記されています。
そこで、このパスをHTSビルド時の環境（***D:\Develop\open-jtalk\hts_engine_API-1.10***）に修正します。
※HTSビルド時に「**nmake -f Makefile.mak install」している場合は、修正不要です。

```makefile:bin\Makefile.mak
CC = cl
CL = link

CFLAGS = /O2 /Ob2 /Oi /Ot /Oy /GT /GL /TC 
         /I..\text2mecab 
         /I ..\mecab\src
         /I ..\mecab2njd
         /I ..\njd
         /I ..\njd_set_pronunciation 
         /I ..\njd_set_digit
         /I ..\njd_set_accent_phrase
         /I ..\njd_set_accent_type
         /I ..\njd_set_unvoiced_vowel
         /I ..\njd_set_long_vowel
         /I ..\njd2jpcommon
         /I ..\jpcommon
         /I D:\Develop\open-jtalk\hts_engine_API-1.10\include
LFLAGS = /LTCG

LIBS = ..\text2mecab\text2mecab.lib 
       ..\mecab\src\mecab.lib
       ..\mecab2njd\mecab2njd.lib
       ..\njd\njd.lib
       ..\njd_set_pronunciation\njd_set_pronunciation.lib
       ..\njd_set_digit\njd_set_digit.lib
       ..\njd_set_accent_phrase\njd_set_accent_phrase.lib
       ..\njd_set_accent_type\njd_set_accent_type.lib
       ..\njd_set_unvoiced_vowel\njd_set_unvoiced_vowel.lib
       ..\njd_set_long_vowel\njd_set_long_vowel.lib
       ..\njd2jpcommon\njd2jpcommon.lib
       ..\jpcommon\jpcommon.lib
       D:\Develop\open-jtalk\hts_engine_API-1.10\lib\hts_engine_API.lib
       winmm.lib
       Advapi32.lib

all: open_jtalk.exe

open_jtalk.exe : open_jtalk.obj
	$(CC) $(CFLAGS) /c $(@B).c
	$(CL) $(LFLAGS) /OUT:$@ $(LIBS) $(@B).obj

clean:	
	del *.exe
	del *.obj

```
修正が終わったら、nmakeでビルドします。

```Console:dos
D:\Develop\open-jtalk\open_jtalk-1.10>nmake -f Makefile.mak
```

**mecab-naist-jdic**のビルドで以下のようなエラーが発生しました。

```Console:dos
　　　：
　　　：
Copyright (C) Microsoft Corporation.  All rights reserved.

コード生成しています。
コード生成が終了しました。
        cd ..
        cd mecab-naist-jdic
        nmake /f Makefile.mak

Microsoft(R) Program Maintenance Utility Version 14.14.26431.0
Copyright (C) Microsoft Corporation.  All rights reserved.

NMAKE : fatal error U1073: 'left-id.def' のビルド方法が指定されていません。
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.EXE"' : リターン コード '0x2'
Stop.
```

**mecab-naist-jdic** を参照してみると**xxx_.def**ファイルが全てアンダーバー付きのファイル名になっていました。
そこで、以下のようにファイルをコピーする構文をmakefileに追加しました。

```makefile:mecab-naist-jdic\Makefile.mak（編集前）
all: char.bin matrix.bin sys.dic unk.dic

char.bin matrix.bin sys.dic unk.dic: naist-jdic.csv matrix.def left-id.def pos-id.def rewrite.def right-id.def char.def unk.def feature.def
	..\mecab\src\mecab-dict-index.exe -d . -o . -f UTF-8 -t sjis

clean:
	del char.bin matrix.bin sys.dic unk.dic
```

```makefile:mecab-naist-jdic\Makefile.mak（編集後）
all: char.bin matrix.bin sys.dic unk.dic

left-id.def: _left-id.def
	copy _left-id.def left-id.def

pos-id.def: _pos-id.def
	copy _pos-id.def pos-id.def

rewrite.def: _rewrite.def
	copy _rewrite.def rewrite.def

right-id.def: _right-id.def
	copy _right-id.def right-id.def

char.bin matrix.bin sys.dic unk.dic: naist-jdic.csv matrix.def left-id.def pos-id.def rewrite.def right-id.def char.def unk.def feature.def
	..\mecab\src\mecab-dict-index.exe -d . -o . -f UTF-8 -t sjis

clean:
	del char.bin matrix.bin sys.dic unk.dic
```

再度、nmakeすると無事ビルドが完了しました。

#4. 動作確認
**open_jtalk-1.10\bin** フォルダに移動して、**input.txt** にSJISコードで合成したいテキストを保存します。
以下のコマンドを実行すると**output.wav**に合成音声が出力されます。

```Console:dos
D:\Develop\open-jtalk\open_jtalk-1.10\bin>open_jtalk.exe -m ..\..\hts_voice_nitech_jp_atr503_m001-1.05\nitech_jp_atr503_m001.htsvoice -x ..\mecab-naist-jdic -ow output.wav input.txt
```
尚、***-m*** の指定は音源ファイル、***-x*** の指定は辞書ファイルとなります。

#5. 女性の音声を合成
**nitech_jp_atr503_m001.htsvoice** は男性の音声でしたが、女性の音声を試してみます。
[MMDAgent](http://www.mmdagent.jp/)で**mei**という女性音源が入手できます。
[MMDAgent "Sample Script" version 1.7 (December 25, 2016)の**Source code**リンク](http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip/download)から、**MMDAgent_Example-1.7.zip**をダウンロードして展開します。

**Voice** フォルダの中にいくつか音源ファイルが入っていますので、いずれかを ***-m*** オプションで指定すると、女性の合成音声が生成されます。

```Console:dos
D:\Develop\open-jtalk\open_jtalk-1.10\bin>open_jtalk.exe -m D:\Develop\MMDAgent\MMDAgent_Example-1.7\MMDAgent_Example-1.7\Voice\mei\mei_happy.htsvoice -x ..\mecab-naist-jdic -ow output.wav input.txt
```

#参考にさせて頂いたページ
[Windowsで音声合成Open JTalk @mkgask さん](https://qiita.com/mkgask/items/0bf9c26dc96e7b0b45ac)

以上となります。