
GalateaTalk: Speech synthesis module for Galatea (Win32版)
                                                               2003.8.22
------------------------------------------------------------------------

GalateaTalk は Galetea システムの音声合成モジュール (SSM) として動作します。

=============
1. コンパイル
=============

Visual Studioでプロジェクトファイルgtalk.dswを開き、
gtalk.exeをビルドする。

===================
2. 実行に必要なもの
===================

2.1 gtalk.exe
  1. で作成した合成プログラム

2.2 chasen-2.3.2 [CHASEN-DLL]
  合成プログラムが内部で呼び出し、形態素解析を行う。
  Windows用にmakeされたlibchasen.dllを用いる。
  さらに辞書データとして unidic-1.1.0 が必要である。
  [ ] 内は、設定ファイル中での変数名で、以下同様。

2.3 chasenrc [CHASEN-RC]
  chasen の設定ファイル

2.4 chaone [CHAONE-XSL-FILE]
  複合語、音韻交替処理プログラム 
2.4.1 数字の読み方 [NUMBER]
  アラビア数字連続を位取りして読む(DECIMAL)か否(NO)か
2.4.2 英字の読み方 [ALPHABET]
  英字連続を英単語として読む(WORD)か否(NO)か
2.4.3 日付の読み方 [DATE]
  ISO 8601に基づく日付表記を読む(YMD)か否(NO)か
2.4.4 時刻の読み方 [TIME]
  ISO 8601に基づく時刻表記を読む(hms)か否(NO)か

2.5 音素モデルのリスト [PHONEME-LIST]
  合成部で使う音素セットのリスト
  mono.lst が用意されている。

2.6 音素モデル
  合成を行うための音素モデルは、１話者あたり
	話者のIDコード [SPEAKER-ID]
	話者の性別     [GENDER]
	時間長の決定木 [DUR-TREE-FILE]
	ピッチの決定木 [PIT-TREE-FILE]
	メルケプストラムの決定木 [MCEP-TREE-FILE]
	時間長の分布ファイル [DUR-MODEL-FILE]
	ピッチの分布ファイル [PIT-MODEL-FILE]
	メルケプストラムの分布ファイル [MCEP-MODEL-FILE]
の８つの情報を指定して、与える。
2.7 で述べる設定ファイル中での指定通りに、音素モデルを
用意しておく必要がある。

2.7 設定ファイル
  これらのデータファイルは、gtalk の設定ファイル中で記述し、
	gtalk -C 設定ファイル
のようにプログラムを起動する。
  設定ファイルの例として、ssm.conf が与えられており、

	----------
	# configuratiuon file for gtalk (GalateaTalk for Win32)
	
	# path name of 'chasen' (only for Linux)
	#CHASEN: ..\chasen\chasen.exe
	
	# path name of 'libchasen.dll' (only for Windows)
	CHASEN-DLL:  ..\chasen\libchasen.dll
	
	# configuration file for 'chasen'
	#CHASEN-RC: ..\chasen\etc\chasenrc
	
	# path name of 'chaone.xsl' (only for Windows)
	CHAONE-XSL-FILE: ..\chasen\chaone\chaone_t_ms.xsl
	
	# default for numbers and alphabets
	NUMBER: DECIMAL
	ALPHABET: WORD
	DATE: YMD
	TIME: hms
	
	# file of phoneme list
	PHONEME-LIST: ..\gtalk\mono.lst
	
	# parameter files for each speaker
	SPEAKER-ID: male01
	GENDER: male
	DUR-TREE-FILE:   ..\gtalk\speakers\male01\tree-dur.inf
	PIT-TREE-FILE:   ..\gtalk\speakers\male01\tree-lf0.inf
	MCEP-TREE-FILE:  ..\gtalk\speakers\male01\tree-mcep.inf
	DUR-MODEL-FILE:  ..\gtalk\speakers\male01\duration.pdf
	PIT-MODEL-FILE:  ..\gtalk\speakers\male01\lf0.pdf
	MCEP-MODEL-FILE: ..\gtalk\speakers\male01\mcep.pdf
	
	(以下、省略)
	----------

のように、
	変数名: 値
の形式で記述し : の前後のスペースは読み飛ばされる。
また、行頭が # の行および空行はコメント行として扱われる。

  複数の話者データを利用する場合には、SPEAKER-ID の記述に
続いて、その話者のデータを列挙する。GENDER、*-TREE-FILE、
*.MODEL-FILE の記述は、直前の SPEAKER-ID の話者に対する
記述であると解釈される。
また、SPEAKER-ID に対しては、任意の文字列が利用できる。
GENDER に対しては、male あるいは female を指定する。

gtalk の実行時に設定ファイルが指定されない場合には、
デフォールトとして、
	----------
	CHASEN-DLL: ..\chasen\libchasen.dll
	CHASEN-RC: ..\chasen\etc\chasenrc
	CHAONE-XSL-FILE: ..\chasen\chaone\chaone_t_ms.xsl
	NUMBER: DECIMAL
	ALPHABET: WORD
	DATE: YMD
	TIME: hms
	PHONEME-LIST: ..\gtalk\mono.lst
	----------
が設定される。

chaone を使用しない場合には、設定ファイル中で
	CHAONE-XSL-FILE: 
を記述する。

===========
3. 発話記述
===========

発話内容は、
	set Text = 音声合成の研究者は、何人くらいいますか。
のように、漢字仮名混じり文で与える。
文中でJEIDA-62-2000に基づいたタグを記述することにより、韻律の変更などができる。

3.1 SILENCE タグ
  ポーズを挿入する。

MSEC 属性
  msec単位で長さを指定してポーズを挿入する。
  例)
	set Text = 東京<SILENCE MSEC="400"/>じゃなくて京都です。
  とすることにより、「東京」の後に400msのポーズが挿入される。
  また、
	set Text = 東京<SILENCE/>じゃなくて京都です。
  のようにポーズ長を指定しない場合には、システムが適当な長さのポーズを
  挿入する。

その他の属性は無視される。

3.2 EMPH タグ
  韻律的な強調を行う。
  指定すべき属性はない。

  例)
	set Text = 私が欲しいのは、お金ではなく<EMPH>時間</EMPH>です。
  とすることにより、「時間」が強調されて発話される。

3.3 SPELL タグ
  数字や英字などの綴り読みを指定する。
  指定すべき属性はない。

  例)
	set Text = ＳＭＡＲＴのつづりは<SPELL>ＳＭＡＲＴ</SPELL>です。
  とすることにより、
	「スマートのつづりはエスエムエーアールティーです」
  と読み上げる。

	set Text = これは<SPELL>1234</SPELL>です。
  とすることにより、
	「これは一二三四です」
  と読み上げる。

3.4 PRON タグ

SYM 属性
  カナ表記によって、読みとアクセント型を指定する。
  例)
	set Text = 最寄り駅は<PRON SYM="ミナミク’サツ">南草津</PRON>です。
  とすることにより、「南草津」が「ク」にアクセント核をおき、「ミナミクサツ」
  と読まれる。

その他の属性は無視される。

3.5 SPEECH タグ
  タグのスコープを指定する。
  指定すべき属性はない。

3.6 VOICE タグ

OPTIONAL 属性
  話者を指定して発話する。
  例)
	set Text = 彼女は、<VOICE OPTIONAL="female01">はい。</VOICE>と言った。
  とすることにより、「はい。」だけが female01 の声で発話され、それ以外の
  「彼女は、」「と言った。」は、その時の Speaker スロットで指定されている
  話者の声で発話される。

その他の属性は無視される。

3.7 RATE タグ
  発話速度を指定する。

SPEED 属性
  通常の発声に対する相対的時間長を指定する。
  例)
	set Text = 私は<RATE SPEED="2.0">東京</RATE>へ行きます。
  とすることにより、「東京」が2.0倍の時間長で(ゆっくりと)発話される。

その他の属性は無視される。

3.8 VOLUME タグ
  音量を指定する。

LEVEL 属性
  通常の発声に対する音量を相対的に指定する。
  例)
	set Text = 私は<VOLUME LEVEL="2">東京</VOLUME>へ行きます。
  とすることにより、「東京」が1.5倍の音量で(大きい声で)発話される。

その他の属性は無視される。

3.9 PITCH タグ
  基本周波数を指定する。

LEVEL 属性
  通常の発声に対するピッチを相対的に指定する。
  例)
	set Text = 私は<PITCH LEVEL="1.5">東京</PITCH>へ行きます。
  とすることにより、「東京」が1.5倍のピッチで(高い声で)発話される。

RANGE 属性 (JEIDA-62-2000 からの拡張)
  通常の発声に対するピッチの振れ幅を相対的に指定する。
  例)
	set Text = 私は<PITCH RANGE="1.5">東京</PITCH>へ行きます。
  とすることにより、「東京」がその平均ピッチを維持したまま振れ幅を1.5倍にして
  発話される。

その他の属性は無視される。

3.10 CONTEXT タグ  (JEIDA規格の一部を実装、一部拡張)
  データ内容に関する情報を指定する。
  数字および一部の記号を対象として、読み上げ型を TYPE 属性で指定する。
  TYPE属性の指定がない場合は、タグは無視される。

TYPE 属性
  値として、NUMBER, DIGITS, DATE, TIME, PHONE のいずれかを指定する。
  (NUMBER, DIGITS は JEIDA-62-2000 からの拡張である。)
  これ以外の値を TYPE 属性に指定した場合にはタグ全体が無視される。

  例)
	set Text = 人数は<CONTEXT TYPE="NUMBER">1234</CONTEXT>です。
  とすることにより、
	「人数は千二百三十四です」
  と読み上げる。
  デフォルトでは小数点は'.'、位取り区切り記号は','を用いる。
  よって
	<CONTEXT TYPE="NUMBER">1,234.5</CONTEXT>
  は千二百三十四点五と読まれる。FORMAT属性にISOを指定することで
	<CONTEXT TYPE="NUMBER" FORMAT="ISO">1 234,5</CONTEXT>
  のように、小数点に','、位取り区切り記号に' 'を用いることができる。

	set Text = これは<CONTEXT TYPE="DIGITS">1234</CONTEXT>です。
  とすることにより、
	「これは一二三四です」
  と読み上げる。

	set Text = 今日は<CONTEXT TYPE="DATE">2003-8-3</CONTEXT>です。
  とすることにより、
	「今日は二千三年八月三日です」
  と読み上げる。
  デフォルトの日時の表記法にはISO 8601を採用している。
  FORMAT属性に"MDY"、DELIM属性に"/"と書くことにより
	<CONTEXT TYPE="DATE" FORMAT="MDY" DELIM="/">8/3/2003</CONTEXT>
  を二千三年八月三日と読み上げることができる。

	set Text = 時刻は<CONTEXT TYPE="TIME">12:34</CONTEXT>です。
  とすることにより、
	「時刻は十二時三十四分です」
  と読み上げる。
	set Text = 時刻は<CONTEXT TYPE="TIME">12:34:56</CONTEXT>です。
  とすることにより、
	「時刻は十二時三十四分五十六秒です」
  と読み上げる。
  
	set Text = 電話番号は<CONTEXT TYPE="PHONE">0120-123-4567</CONTEXT>です。
  とすることにより、
	「電話番号は〇一二〇、一二三、四五六七です」
  と読み上げる。

(参考)
  CONTEXTタグを用いない場合の数字、英字のデフォルトの読み上げ方は以下の
  とおりである。

  数字はNUMBER (位取りして読み上げ)、英字は辞書にあればその読みで、
  なければALPHABETとして読み上げられる。
  ただし、設定ファイルの既述によりこれをかえることができる。

=========
4. 実行例
=========

話者の選択は
	set Speaker = male01
のように話者 ID を設定して行なう。
指定しなければ、デフォールトの話者として "male01" が使われる。
発話内容の記述では、
	set Text = 音声合成の研究者は、何人くらいいますか
により、合成音を生成し、
	set Speak = NOW
とすると合成音声を出力する。
	set Save = Filename
で、最後に合成した合成音声波形を Filenameに出力することができる。
ファイル形式は 16kHz, 16bit, signed linear raw file である。

	set ParsedText = data/sentence1.data
	set ParsedText = data/sentence2.data
など、手で作成した茶筌の解析結果を読み込んで音声を合成することが
できる。

合成音声の出力では、
	set Speak = 12:34:56.000
で発話開始時刻を指定しての出力、また、
	set Speak = +1000
で発話開始を msec 単位で遅らせての出力ができる。

合成音声出力中に
	set Speak = STOP
を与えると、音声出力が途中で停止し、途中停止するまでに音声出力された
音素列が出力される。

===========
5. スロット
===========

  GalateaTalk は内部にいくつかのスロットを持ち、そこに外部から値をセット
したり、内部の処理で値を決定したりして処理を進める。定義されている
スロットは、以下の通りである。

    Run : 動作状態 ( 起動時に LIVE に設定され、EXIT をセットすれば終了する)
    ProtocolVersion : 通信プロトコルのバージョン
    ModuleVersion : プログラムのバージョン
    SpeakerSet : 利用可能な話者ID
    Speaker : 現在の話者ID
    Text.text : 発話内容 ( 4. で述べた set Text = ... でセットされる)
    Text.pho : 音素系列と音素時間長
    Text.dur : 総発話時間
    Speak.text : 発話内容 (Text.text と同じ)
    Speak.pho : 音素系列と音素時間長 (Text.pho と同じ)
    Speak.dur : 総発話時間 (Text.dur と同じ)
    Speak.utt : 既に発声した音素系列
    Speak.len : 既に発声した総時間長
    Speak.stat : 合成プログラムの状態 ( IDLE, READY, PROCESSING, SPEAKING )

これらのスロットの値を知るには、
    inq Text.text
のように inq コマンドを用いる。

  さらに、スロットの値が新たにセットされた場合に、セットされた値を自動的に
出力するかどうかをスロットのプロパティによって制御できる。
各スロットは、プロパティとして AutoOutput か NoAutoOutput のどちらかの
値をとり、それぞれ自動出力する、自動出力しないを表す。
プロパティの値を変更するには、
    prop Text.text = NoAutoOutput
    prop Text.text = AutoOutput
のように prop コマンドによって行なう。
初期値としては、全て AutoOutput が設定されている。

===================
6. 内部データの出力
===================

	set Log = ファイル名
のように、Log スロットにファイル名を与えることにより、
選択されている内部データ (形態素やアクセント句など) を
ファイルに書き出すことができる。指定したファイルがすでに
存在する場合には、ファイルの末尾に追加される。
	set Log = CONSOLE
とした時には、標準エラー (stderr) に出力され、
    set Log = NO
とすれば、出力を中止する。
Log スロットの初期値は NO となっており、内部データの出力は行なわれない。
書き出す内部データは、
	Log.conf (ssm.conf による設定)
	Log.text (入力テキスト)
	Log.arrangedText (整形された入力テキスト)
	Log.chasen (茶筌の解析結果)
	Log.tag (タグの一覧(SAYASタグ以外))
	Log.phoneme (音素情報)
	Log.mora (モーラ情報)
	Log.morph (形態素情報)
	Log.aphrase (アクセント句情報)
	Log.breath (呼気段落情報)
	Log.sentence (文情報)
の各スロットに対し、
	set Log.chasen = YES
のように YES の値をセットすることにより、選択する。
( ) が出力される情報を示している。
初期値では全ての Log.* のスロットは NO となっている。

===============
7. エラーの出力
===============

    set Err = ファイル名
のように、Err スロットにファイル名を与えることにより、
実行時のエラー出力をファイルへ出力することができる。
    set Err = CONSOLE
とした時には、標準エラー出力 (stderr) に出力される。
Err スロットの初期値は CONSOLE となっている。

=========
8. ソース
=========

    --------------- 合成プログラム
    gtalk.dsw:           プロジェクトファイル
    main.cpp:            メインプログラム
    read_conf.cpp        設定ファイルの読み込み
    ---テキスト解析部
    text.cpp:            テキスト解析結果の読み込み
    tag.cpp:             発話内容記述タグの解析
    accent.cpp:          アクセント処理
    chasen.cpp:          茶筌プロセス
    chaone.cpp:          ChaOneプロセス
    make_sentence.cpp:   SENTENCE 構造体作成
    make_breath.cpp:     BREATH 構造体作成
    make_aphrase.cpp:    APHRASE 構造体作成
    make_phoneme.cpp:    PHONEME 構造体作成
    morph.cpp:           MORPH 構造体作成
    make_mora.cpp:       MORA 構造体作成
    send.cpp:            統合部への情報の転送
    sleep.cpp:           遅延処理
    util.cpp:            その他
    ---音声合成部
    make_duration.cpp:   音素継続長の決定
    make_parameter.cpp:  パラメータ生成
    modify_parameter.cpp:タグの指定に基づく韻律の修正
    do_synthesis.cpp:    波形生成
    do_output.cpp:       出力
    hmmsynth.cpp:        refresh(),init(),コンテキストラベル生成
    mlpg.cpp:            HMMからのパラメータ生成
    model.cpp:           音素HMMの構造体
    tree.cpp:            決定木探索
    vocoder.cpp:         メルケプストラムボコーダ
    misc.cpp:            その他
    Sock.cpp:            ソケット通信

    synthesis.h:         構造体定義、グローバル変数
    confpara.h:          データファイルのパス、話者情報など
    command.h:           コマンド定義
    tag.h:               発話内容記述のタグ情報
    slot.h:              スロット定義
    pronunciation.h:     発音辞書
    accent.h:            品詞、アクセント変形の定義

    hmmsynth.h:          header for hmmsynth.cpp グローバル変数  
    vocoder.h:           header for vocoder.cpp  関数プロトタイプ宣言など
    tree.h:              header for tree.cpp     決定木構造体 Tree
    model.h:             header for model.cpp    モデル構造体 Model
    mlpg.h:              header for mlpg.cpp     パラメータ生成構造体 PStream
    misc.h:              header for misc.cpp    関数プロトタイプ宣言など
    da.h:                header for do_output.cpp:音声出力の定義
    defaults.h:          HMM合成のデフォルトパラメータの設定
    main.h:              header for main.cpp
    chaone.h:            header for chaone.cpp
    Sock.h:              header for Sock.cpp
    ---ChaOne呼び出し
    msxml2.h:            header for msxml
    msxml2.lib:          msxmlライブラリ

    StdAfx.h

    --------------- モデルファイル等
    ssm.conf:            設定ファイル
    mono.lst:            音素リスト
    chasenrc:            茶筌出力フォーマット定義
    data/sentence1.data: サンプル茶筌結果1
    data/sentence2.data: サンプル茶筌結果2
    data/sentence3.data: サンプル茶筌結果3
    data/sentence4.data: サンプル茶筌結果4
    --------------- その他
    README.txt:          このファイル
    Changelog.txt:       開発履歴

=============
9. 音素モデル
=============

    duration.pdf:        継続長の分布
    mcep.pdf:            メルケプストラムの分布
    lf0.pdf:             基本周波数の分布
    tree-mcep.inf:       メルケプストラムに対する決定木
    tree-dur.inf:        継続長に対する決定木
    tree-lf0.inf:        基本周波数に対する決定木

