Add line number to gist

My Styles

2012年1月25日水曜日

Mac OS X Lion で OpenJTalk-1.05 を動かす

Use OpenJTalk-1.05 with Mac OS X Lion.

1.0が出た頃に使って以来、久々に使ってみました。

本家URL:
- hts_engine API http://hts-engine.sourceforge.net/
- Open JTalk http://open-jtalk.sourceforge.net/

参考URL:
- てくてくラボ - Open JTalk
  http://ja.nishimotz.com/open-jtalk
- ぽち*ぷ~ち - Open JTalk で音声合成して日本語テキスト読み上げ
  http://pochi.usamimi.info/linux/open_jtalk.html
- まほろば- オープンソース音声合成エンジン「Open JTalk 1.05」
  http://mahoro-ba.net/e1569.html
- WebMemo! - OpenJTalkを使ってみる。
  http://www.geocities.jp/humanrace96/OpenJTalk104.html

Windows版に関して:
VS2005 … http://naoh16.seesaa.net/article/140482825.html
VS2008 … http://neu101.seesaa.net/article/141634682.html

とりあえず、インストール手順については他のサイトと同様です。

環境:
  iMac 27inch (2009年12月製?, Mac OS X 10.7 Lion; upgrade from SnowLepard)
  Xcode 4.1



インストールは、/usr/local/OpenJTalk以下に入れて見ました。
your_username, your_groupnameは自分の環境に合わせて書き換えてください。
また、最新版を使う場合には、cvsのオプションで -r ver-1-05 などを -r HEAD にすればOK。
もちろん、tar.gzを普通にダウンロードしてもOKです。cvsだとダウンロードが遅いので・・・

インストール先の準備

$ cd /usr/local
$ sudo mkdir OpenJTalk
$ sudo chown your_username:your_groupname OpenJTalk
$ mkdir -p src bin lib include dic voice

HTS Engine 1.06のインストール

$ cd /usr/local/OpenJTalk/src/
$ cvs -z3 -d:pserver:anonymous@hts-engine.cvs.sourceforge.net:/cvsroot/hts-engine co -d hts_engine-1.06 -r ver-1-06 hts_engine_API/src
$ cd hts_engine-1.06
$ ./configure --prefix=/usr/local/OpenJTalk CFLAGS='-O3 -arch x86_64'
$ make && make install

Open JTalk 1.05のインストール

$ cd /usr/local/OpenJTalk/src/
$ cvs -z3 -d:pserver:anonymous@open-jtalk.cvs.sourceforge.net:/cvsroot/open-jtalk co -d open_jtalk-1.05 -r ver-1-05 open_jtalk/src
$ cd open_jtalk-1.05
$ ./configure --prefix=/usr/local/OpenJTalk ¥
    --with-hts-engine-header-path=/usr/local/OpenJTalk/include ¥
    --with-hts-engine-library-path=/usr/local/OpenJTalk/lib ¥
    CFLAGS='-O3 -arch x86_64'
$ make && make install

makeの途中で辞書のコンパイルがうまくいっていない場合のみ、
辞書のバイナリパッケージをダウンロードして、/usr/local/OpenJTalk/dic 以下に展開しましょう。

HTS Voice "NIT ATR503 M001" version 1.04 のインストール

$ cd /usr/local/OpenJTalk/voice
$ curl -L http://sourceforge.net/projects/open-jtalk/files/HTS%20voice/hts_voice_nitech_jp_atr503_m001-1.04/hts_voice_nitech_jp_atr503_m001-1.04.tar.gz/download ¥
$ | tar xvzf /dev/stdin
$ ln -s hts_voice_nitech_jp_atr503_m001-1.04 m001

curlの行は長いですが一行でDLから解凍までやっています(-Lはsourceforgeの302対策)。
名前が長すぎるのでシンボリックリンクもついでに作っています。

また、こちらのモデルファイルについては1.02までは16000Hzサンプリングのモデルで、
1.03以降では48000Hzサンプリングモデルになっています。mei音響モデルも48000Hzのモデルのようです。

コマンドを試してみる。

が、オプションが多いです・・・
完全には理解できていませんが、ここでは設定を別のファイルに落としこんで、
ラッパースクリプトから使う形にしてみます。

以下の場所に配置するファイルとして、Gistからダウンロードして下さい。
- /usr/local/OpenJTalk/voice/m001/openjtalk.conf
#
# Configuration file for open_jtalk.sh
#
# Copyright (c) Sunao HARA, Shikano Lab., NAIST/JAPAN
# Last Modified: 2012/01/25 14:03:44.
#
##
## WAVE synthesis Parameters (Recommended)
##
# -s i : sampling frequency [16000][ 1--48000]
# -p i : frame period (point) [ 80][ 1--]
# -a f : all-pass constant [ 0.42][ 0.0--1.0]
# -z i : audio buffer size [ 1600][ 0--48000]
# -g i : gamma = -1 / i (if i=0 then gamma=0) [ 0][ 0-- ]
# -b f : postfiltering coefficient [ 0.0][-0.8--0.8]
# -l : regard input as log gain and output linear one (LSP) [ N/A]
# -u f : voiced/unvoiced threshold [ 0.5][ 0.0--1.0]
-s 48000 -p 240 -a 0.55
##
## Acoustic models and Parameters (Mandatory)
##
# -td tree : decision trees file for state duration [ N/A]
-td $VOICEDIR/tree-dur.inf
# -tm tree : decision trees file for spectrum [ N/A]
-tm $VOICEDIR/tree-mgc.inf
# -tf tree : decision trees file for Log F0 [ N/A]
-tf $VOICEDIR/tree-lf0.inf
# -md pdf : model file for state duration [ N/A]
-md $VOICEDIR/dur.pdf
# -mm pdf : model file for spectrum [ N/A]
-mm $VOICEDIR/mgc.pdf
# -mf pdf : model file for Log F0 [ N/A]
-mf $VOICEDIR/lf0.pdf
# -dm win : window files for calculation delta of spectrum [ N/A]
-dm $VOICEDIR/mgc.win1 -dm $VOICEDIR/mgc.win2 -dm $VOICEDIR/mgc.win3
# -df win : window files for calculation delta of Log F0 [ N/A]
-df $VOICEDIR/lf0.win1 -df $VOICEDIR/lf0.win2 -df $VOICEDIR/lf0.win3
##
## Low pass filter (Optional)
##
# -tl tree : decision trees file for low-pass filter [ N/A]
-tl $VOICEDIR/tree-lpf.inf
# -ml pdf : model file for low-pass filter [ N/A]
-ml $VOICEDIR/lpf.pdf
# -dl win : window files for calculation delta of low-pass filter [ N/A]
-dl $VOICEDIR/lpf.win1
##
## Global Variance (Optional)
##
# -em tree : decision tree file for GV of spectrum [ N/A]
-em $VOICEDIR/tree-gv-mgc.inf
# -ef tree : decision tree file for GV of Log F0 [ N/A]
-ef $VOICEDIR/tree-gv-lf0.inf
# -el tree : decision tree file for GV of low-pass filter [ N/A]
#-el $VOICEDIR/?.inf
# -cm pdf : filename of GV for spectrum [ N/A]
-cm $VOICEDIR/gv-mgc.pdf
# -cf pdf : filename of GV for Log F0 [ N/A]
-cf $VOICEDIR/gv-lf0.pdf
# -cl pdf : filename of GV for low-pass filter [ N/A]
#-cl $VOICEDIR/?.pdf
# -jm f : weight of GV for spectrum [ 1.0][ 0.0--2.0]
-jm 1.0
# -jf f : weight of GV for Log F0 [ 1.0][ 0.0--2.0]
-jf 1.0
# -jl f : weight of GV for low-pass filter [ 1.0][ 0.0--2.0]
-jl 1.0
# -k tree : use GV switch [ N/A]
-k $VOICEDIR/gv-switch.inf
view raw open_jtalk.conf hosted with ❤ by GitHub
- /usr/local/OpenJTalk/bin/open_jtalk.sh
#!/bin/bash
#
# Open JTalk 実行のためのスクリプト
#
# Copyright (C) 2012 Sunao HARA, Shikano Lab., NAIST/JAPAN
# Last Modified: 2012/01/25 13:38:20.
#
VOICEID=$1
SRC_TXT=$2
SRC_BASE=${SRC_TXT%\.*}
DST_WAV=${3:-$SRC_BASE.wav}
PREFIX=/usr/local/OpenJTalk
OPENJTALK=${PREFIX}/bin/open_jtalk
DICDIR=${PREFIX}/dic
VOICEDIR=${PREFIX}/voice/${VOICEID}
CONFFILE=${VOICEDIR}/openjtalk.conf
TXT_FLTR="iconv -t euc-jp"
#WAVEPARAM="-s 48000 -p 240 -a 0.55"
#WAVEPARAM="-s 16000 -p 80 -a 0.42"
function usage {
[ "x$1" == "x" ] || echo 2>&1 $1
echo 2>&1 "usage: $0 voice_id input_txt [output_wav]"
exit 1
}
[ -f "$SRC_TXT" ] || usage 'Error: Input-file not found'
$TXT_FLTR < $SRC_TXT | eval $OPENJTALK -x $DICDIR \
`sed -e 's/#.*$//' $CONFFILE` \
-ow $DST_WAV
view raw open_jtalk.sh hosted with ❤ by GitHub

別のディレクトリにOpenJTalkをインストールした場合は、open_jtalk.shの中身を書き換えてください。
openjtalk.confには必須パラメータ、推奨パラメータ、任意パラメータに分けて書いています。
推奨パラメータ部分はモデルやユーザの希望に応じて変更すれば良いです。

ちなみに、幾つかの参考ページを幾つか見ていたところ-aがすごいことになっていますが、
モデルを自分で作られたという方は、
    -a はメル周波数ワーピングのためのパラメータですね.16kHzですと0.42が典型的な値です.20kHzだと0.44,22.05kHzだと0.45です.
とのことです。

また、合成する音声はモデルの周波数帯域にあわせて置く必要があります。
-sの指定で無理やり低いサンプリングレートの生成をしてから、
-aで周波数軸の引き伸ばしをすれば使えなくはないでしょうが、品質の面からは全くお勧めできません。
必要なら、その後にsoxなどでダウンサンプリングしましょう。

# 全様、ありがとうございました!
# https://twitter.com/#!/heigazen/status/161772650379751425

さて、スクリプトの使い方ですが、適当なテキストファイルを作って(例えば、sample.txt)、
    $ /usr/local/OpenJTalk/bin/open_jtalk.sh m001 sample.txt
とすると、sample.wavが生成されます。(第三引数で明示的に出力ファイルも指定できます)
以下、必須パラメータのみ(sample_48k_nolpf.wav)、
任意パラメータlow-passあり(sample_48k_lpf.wav)、
任意パラメータGlobal Varianceあり(sample_48k_gv.wav; READMEの記載通り)の合成結果を掲載します。

図は順番に、音声波形の振幅表示、スペクトログラム(24k)、スペクトログラム(8k)となります。
# スペクトログラムはaudacityを利用しました。元音声は48kサンプリング、FFT4096ポイントです。参考程度にお考え下さい。


また、音声ファイルも以下で聞くことができます。違いを聞き分けるのは・・・難しいですね。

Open JTalk sample by naoh16

0 件のコメント:

コメントを投稿