GalateaTalk

GalateaTalkは日本語の音声合成エンジン。 Galatea Project の一環として開発された。 オープンソースで無償利用できるシステムとして期待されている。 構成要素およびバージョンによってライセンスが異なっている。 島根県CMSでは派生版が使用されている。

  • galatea プロジェクトからもツールキットの一部として配布されている。また ML で障害報告がなされた場合に、随時、修正版を公開している。
  • 2009年12月に公開された Open JTalk は、同じ技術に基づいて作られているが、実装されている機能や外部仕様が異なる。
  • jagtalk nishimotz が保守している GalateaTalk (gtalk) の派生版。

関連ソフトウェア

使ってみようGalateaTalk

使ってみようGalateaTalkというWindows用のアプリケーションが公開されている。

「しゃべります。」

「しゃべります。」開発プロジェクトにて「キーボードで打ち込んだ文字を、あたかもしゃべっているかのように読み上げてくれる」音声合成ソフト(Windows対応)が公開されている。

ライセンス

注意:この記事は西本の把握している情報で、Galatea Project および GalateaTalk プロジェクトの公式な見解ではありません。

2003年版の公開とライセンス

GalateaTalk の Linux 版および Windows 版は、2003年8月に(財団法人京都高度技術研究所 (ASTEM) が、情報処理振興事業協会 (IPA) が実施した「重点領域情報技術開発事業」において開発した研究成果 Galatea Toolkit の一部として)下記のライセンスで公開された。

  • Galatea Toolkit は複数の著作者による複数の成果物をまとめたものである。全体として Galatea Toolkit 使用許諾が定められている。

なお unidic については galatea4win\engine\SSM\unidic-sjis-1.1.0\COPYING に以下のように記載されている。

Copyright (c) 2002-2003 Chiba University and Information-technology
Promotion Agency, Japan (IPA).  All Rights Reserved.

Use, reproduction, and distribution of this software is permitted.
Any copy of this software, whether in its original form or modified,
must include both the above copyright notice and the following
paragraphs.

CHIBA UNIVERSITY, INFORMATION-TECHNOLOGY PROMOTION AGENCY, JAPAN
(IPA), AND THE CONTRIBUTORS TO THIS WORK DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL CHIBA UNIVERSITY, NOR
THE CONTRIBUTORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

2009年3月 ISTC 版の公開

2009年3月にISTCの活動が終了した。ISTCが活動していた間は最新の Galatea Toolkit は会員に配付された。

IPA2003年版を改良したバージョンが sourceforge.jp にて公開された。

この成果は「IPA 最終版の派生物」であるとされた。すなわち、全体としての使用許諾は IPA 最終版に基づくものである。

ただし2003年から2009年にかけて、 GalateaTalk を構成する主な要素である gtalk (コア部分), unidic, chaone, chasen は、以下のように独自のライセンスで別途公開された。

  • unidic と chaone は(利用者から第三者への再配布を許諾しない)独自ライセンスに変更された。
    • Galatea Project は「 unidic を利用したソフトウェアを開発して配付するプロジェクト」として unidic のユーザ登録をしている。
  • gtalk と chasen は独立したオープンソースプロジェクトとして活動が進められた。
    • chasen は chasen-legacy と改名された
    • 補足: julius も同じく独立したオープンソースプロジェクトとして活動

現在の GalateaTalk のシステム構成とライセンス

2009年4月以降の GalateaTalk のライセンスについて:

galateatalk プロジェクトのサイトにはライセンスは独自としか記載されておらず、 明記されていない。

コア部分(gtalk)は下記のとおりである。

GalateaTalk は chasen (chasen-legacy) を使用している。Ubuntu や Vine 5 で配付されている(ipadic対応の)chasen-2.4.x はそのまま利用できる。

GalateaTalk が使用している日本語辞書 unidic は独自ライセンスである。 ユーザ登録すればダウンロードできる。

UniDic ver.1.3.12 利用条件

1. UniDic ver.1.3.12 の著作権は,伝康晴・山田篤・小椋秀樹・小磯花絵・小
木曽智信が保持する。
2. UniDic ver.1.3.12 を複製又は改変することは,個人的な利用に限り認める。
3. UniDic ver.1.3.12 及びこれを改変したものを再配布してはならない。
4. UniDic ver.1.3.12 を利用して行った研究等の成果を公表する場合は,
UniDic ver.1.3.12 を利用したことを明記すること。
5. 営利を目的として,UniDic ver.1.3.12 を利用する場合は,事前に著作権者
と協議すること。
6. UniDic ver.1.3.12 を利用することによって,直接的・間接的に生じたいか
なる損害についても,著作権者は賠償する責任を負わない。
7. 本文書に定めのない事項については,著作権者と協議すること。

GalateaTalk が使用している形態素解析後処理ツール ChaOne のライセンスは下記のとおりである。

                       ChaOne version 1.3.3
 
       Copyright (c) 2004-2009 Atsushi YAMADA (Studio ARC)
                       All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
``Software''), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL ATSUSHI YAMADA BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

インストールと設定

Mac/Linux における 64bit 対応状況

64bit 環境での動作は未確認。

unidic については、公開中のChaSen版バイナリ辞書は32ビット専用。

Mac 対応は作業中。 http://en.nishimotz.com/galateatalk を参考にされたい。

Galatea における動作確認

RUN スクリプトを実行し, 合成音声が出力されることを確認する.

 $ cd linux/bin/SSM
 $ perl RUN

設定ファイル

本項は ISTC 配付バージョンに関するメモ。

GalateaTalk を更新する場合などには以下を確認する.

[SSM/gtalk/ssm.conf]

# path name of 'chasen'
CHASEN: /usr/local/istc/chasen-2.4.1-istc/bin/chasen

# configuration file for 'chasen'
CHASEN-RC: /usr/local/istc/chasen-2.4.1-istc/etc/chasenrc

# command of running 'chaone'
CHAONE: /usr/local/istc/chaone-1.3.0-istc/chaone

[/usr/local/istc/chasen-2.4.1-istc/etc/chasenrc]

(GRAMMAR /usr/local/istc/chasen-2.4.1-istc/lib/chasen/dic)
(DADIC chadic)

Chasen, Unidic, Chaone インストール作業

作成:2007-07-12

作業環境 Vine Linux 3.2

過去のISTC版に関するメモ。

 概要:
 過去のバージョンを上書きしないように
 morph の実行イメージを /usr/local/istc/ に作る。
 /usr/local/istc/chasen-2.4.1-istc ... chasen
 /usr/local/istc/unidic-1.3.0-pkg  ... unidic (eucj)
 /usr/local/istc/chaone-1.3.0-istc ... chaone

* chasen-2.4.1

 用意するファイル
 chasen-2.4.1.tar.gz

 $ tar xvfz chasen-2.4.1.tar.gz
 $ cd chasen-2.4.1
 $ ./configure --prefix=/usr/local/istc/chasen-2.4.1-istc
 $ make
 $ make install

* unidic-1.3.0-pkg

 用意するファイル
 unidic-1.3.0-pkg.tar.gz

 $ tar xvfz unidic-1.3.0-pkg.tar.gz
 $ cd unidic-1.3.0-pkg

 $ export PATH=/usr/local/istc/chasen-2.4.1-istc/bin:$PATH
 $ sh configure --with-packagedir=/usr/local/istc/unidic-1.3.0-pkg
 $ make
 $ make install

* unidic-1.3.0_eucj への差し替え

 用意するファイル
 unidic-1.3.0_eucj.tar.gz

 $ tar xvfz unidic-1.3.0_eucj.tar.gz
 $ cp unidic/* /usr/local/istc/unidic-1.3.0-pkg/dic/

* chasen の辞書設定

 chasen の dicdir を確認してリンクをはる

 $ /usr/local/istc/chasen-2.4.1-istc/bin/chasen-config --dicdir
 /usr/local/istc/chasen-2.4.1-istc/lib/chasen/dic

 $ cd /usr/local/istc/chasen-2.4.1-istc/lib
 $ mkdir chasen
 $ cd chasen/
 $ ln -s /usr/local/istc/unidic-1.3.0-pkg/dic dic

 デフォルトの chasenrc を作る

 $ cd /usr/local/istc/chasen-2.4.1-istc/
 $ mkdir etc
 $ cd etc/
 $ cp /usr/local/istc/unidic-1.3.0-pkg/dic/chasenrc .

 [chasenrc] の追加および修正

 ;; 変更箇所
 (GRAMMAR /usr/local/istc/chasen-2.4.1-istc/lib/chasen/dic)
 ;; 
 ;; 変更箇所 (改行を挿入)
 (OUTPUT_FORMAT "<W1 orth=\"%m\" kana=\"%?U/%m/%y/\"
  pron=\"%?U/%m/%a/\" pos=\"%U(%P-)\"%?T/ cType=\"%T \"//%?F/
  cForm=\"%F \"//%?I/ %i//>%m</W1>\n")
 ;; 
 ;; 変更箇所 (改行を挿入)
 (ANNOTATION
	(("<" ">") "%m\n")
	(("\"") "<W1 orth=\"&#x22;\" kana=\"&#x22;\"
  pron=\"&#x22;\" pos=\"%U(%P-)\"%?T/ cType=\"%T \"//%?F/
  cForm=\"%F \"//%?I/ %i//>%m</W1>\n")
 )
 ;; 
 ;; 追加
 (BOS_STRING "<S>\n")
 (EOS_STRING "</S>\n")

* chasen + unidic の動作確認  (出力に改行を挿入)

 $ echo "今日はいい天気です。" | /usr/local/istc/chasen-2.4.1-istc/bin/chasen

 <S>
 <W1 orth="今日" kana="キョウ" pron="キョー" pos="名詞-普通名詞-副詞可能" 
 orthBase="今日" kanaBase="キョウ" pronBase="キョー" lForm="キョウ"
 lemma="今日" form="キョウ" aType="1" aConType="C3">今日</W1>
 <W1 orth="は" kana="ハ" pron="ワ" pos="助詞-係助詞" orthBase="は"
 kanaBase="ハ" pronBase="ワ" lF orm="ハ" lemma="は" form="ハ"
 aConType="動詞%F5,名詞%F1,形容詞%F2@-1">は</W1>
 (以下略)

* chaone-1.3.0

 /usr/local/istc/chaone-1.3.0-istc にインストールする

 用意するファイル
 chaone-1.3.0.tar.gz

 その前に Vine Linxu 3.1 のバグ回避(?)
 # su
 # cd /usr/include
 # ln -s libxml2/libxml .

 $ tar xvfz chaone-1.3.0.tar.gz
 $ cd chaone-1.3.0
 $ sh configure --with-chaonedir=/usr/local/istc/chaone-1.3.0-istc
 $ make
 $ make install

* chasen + unidic + chaone の動作確認 (出力に改行を挿入)

 $ echo "今日はいい天気です。"
   | /usr/local/istc/chasen-2.4.1-istc/bin/chasen
   | /usr/local/istc/chaone-1.3.0-istc/chaone

 <S>
  <cha:W2 xmlns:cha="http://www.unidic.org/chasen/ns/structure/1.0"
   orth="今日" pos="名詞-普通名詞-副詞可能" pron="キョー">
    <cha:W1 orth="今日" kana="キョウ" pron="キョー" 
    pos="名詞-普通名詞-副詞可能" orthBase="今日" kanaBase="キョウ"
    pronBase="キョー" lForm="キョウ" lemma="今日" form="キョウ" aType="1"
    aConType="C3">今日</cha:W1>
  </cha:W2>
  <cha:W2 xmlns:cha="http://www.unidic.org/chasen/ns/structure/1.0"
    orth="は" pos="助詞-係助詞" pron="ワ">
    <cha:W1 orth="は" kana="ハ" pron="ワ" pos="助詞-係助詞" orthBase="は"
     kanaBase="ハ" pronBase="ワ" lForm="ハ" lemma="は" form="ハ"
     aConType="動詞%F5,名詞%F1,形容詞%F2@-1">は</cha:W1>
  </cha:W2>
 (以下略)

API の検討

GalateaTalk の Python ラッパー

作りかけですが、少しまともになってきました:

詳細は下記の「ソケット通信」を参照されたい。

Galatea プロトコル

README で説明されている。

Galatea Dialog Studio では実験的に Windows 対応を行い、AgentManager をとおさないで gtalk.exe のサブプロセスと通信を行う実装をした。

文字コードは Windows では Shift_JIS を、Linux では EUC-JP が使われる。

コンパイラ互換性

  • GalateaTalk が gcc 4.4.1 でコンパイルできないという話。getline() という関数名が stdio.h と衝突するエラーらしい。gcc 4.3.3 だとコンパイルできる。

ソケット通信

gtalk にはソケットサーバ機能がある。 galatea4win ではソケット通信を使っているが、Linux版にも実装されている。

ソケット接続の場合はコマンド行の末尾に "./" が必要である。

端末1での操作:

$ cd /usr/local/galatea-engine/SSM/gtalk
$ ./gtalk -C ~/.galatea/ssm.conf -p 59999

端末2での操作:

$ telnet localhost 59999
set Text = 12345./
set Speak = NOW./

ソースコード解読

音声を生成するコア部分

READMEに各ファイルの概要が書かれている。

音声を生成するコア部分を抜粋する。

main.c: setText()

  refresh();
  text_analysis( val );	/* テキスト解析 */
  // ...
  parameter_generation();	/* パラメータ生成(F0,MLSAフィルタ係数,継続長) */
  do_synthesis();		/* 合成波形の生成 */

void parameter_generation() は main.c にある。

void parameter_generation()
{
  /* 音声合成の初期設定 */
  init_parameter();
  /* 音素継続長の決定 */
  make_duration();
  /* 音素継続長の変更 */
  modify_duration();
  make_cumul_time();
  modify_voice();
  // ...
  /* パラメータ生成 F0,MLSAフィルタ係数 */
  make_parameter();
  /* F0, ゲイン b(0) の変更 */
  modify_f0();
  modify_power();
}

make_parameter() は make_parameter.c にある。GenerateParam() を呼んでいる。

GenerateParam() は mlpg.c にある。

do_synthesis.c: do_synthesis()

for(nframe = shift_start; nframe < totalframe; nframe++)
{
  /* for power modification */ 
  coeff[nframe][0] = power.data[nframe];
  /* MLSA filter */
  vocoder(f0.data[nframe], coeff[nframe], mceppst.order, alpha.data[nframe], speaker[spid].postfilter_coef);
  // ...
}
double **coeff および int totalframe は main.c のグローバル変数。

vocoder() は vocoder.c にある。

パラメータ生成の処理を追う

メルケプストラムの情報を見たいので、ちょっと追っかけた。

main.c にグローバル変数 double **mcep があります。
でも、
do_synthesis.c: do_synthesis()
ではすでに mcep から計算された coeff の値が
使われているように見えます。
どこで mcep[][] を計算しているのか。。

ためしにグローバルな構造体 g_syn を作り、 mfcc 変数をその中に移してみました。
この状態でコンパイルできて動いているので、
make_parameter で alloc されたサイズであることは間違いないです。
でも参照されていないので、もしかすると本当に使われていないのかも。。

デバッガ (gdb) で軽く追ってみたのですが、
mceppst.order は 18 で、do_synthesis のループの後でも、
g_syn->mcep[xx][1..17] はいずれも 0 のままのように見えます。

mfcc は完全に削除しても gtalk が動きました。
mfcc は完全に未使用の配列だと思われます。

mlpg.c:119:
mc2b( mceppst.par[mcepframe], coeff[mcepframe], mceppst.order,
alpha.data[mcepframe] );

の mceppst.par にケプストラムが入っているのでは。。

mlpg.h:
typedef struct _PStream {
       int vSize;
       int     order;
       int     mType;
       int     T;
       int max_T;
       int     width;
       DWin dw;
       double **par;     /* output parameter vector */
       SMatrices sm;
} PStream;

もう少し gdb と ddd
(sudo aptitude ddd でインストールできる GUI デバッガ)
で追ってみました。

setText するたびに、
main.c の
PStream pitchpst;
PStream mceppst;
の両方について、
mlpg.c のvoid InitPStream(PStream *pst)
が2回呼ばれる。
       pst->par        = ddcalloc(pst->T,pst->order+1);
で二次元配列が確保される。
これらは coeff を計算するために使用され、
すぐにvoid FreePStream(PStream *pst)が呼ばれるので、
setText が終わったときには mceppst.par の中身は
free されてしまっている。

FreePStream されるまえに mceppst.par を
別の配列にコピーしたり、ファイルにダンプしたりできればよい?

PStream の T がフレーム数だと思っていいのか自信がないのだけど。
galateatalk.txt · 最終更新: 2010/12/01 15:52 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0