NetBSD 1.6.2 gtalkのインストール まずは、i386-netbsdで構築してみる。 ファイル chaone-1.2.0b6.tar.gz chasen-2.3.3.tar.gz darts-0.3.tar.gz gtalk-050817.tar.gz ipadic-2.6.3.tar.gz speakers-041210.tar.gz unidic-1.1.2.tgz libiconv-1.9.2.tar.gz それぞれを解凍。 手順はREADMEファイルによる。 ./configure make ・pthread.hがない デフォルトではスレッドは使わないが、pthread.hをインクルードしている。 コメントアウトするか、 #ifdef THREAD_DA #include #endif とする。 do_output.c ・LINUXじゃない LINUXとWindowsしか対応していないので。 CFLAGSに-DLINUXを追加する。 Makefile ・sys/soundcard.hがない ないらしい。代わりにsys/audioio.hにする。 ただし、定義されている定数や関数が軒並みアウトなので、関連するところはコメントアウトしてしまう。 da.h ・setpgrp()がへん。 setpgrp()と記述すれば、setpgrp(0,0)と解釈されるはずがされない。 setpgrp(0,0)と修正。do_output.cとmain.cにある。 これで一応makeは通るが、モチロンちゃんと動かない。 doc/index.htlmによる。 ./configure make make check ※注意:クロスコンパイルの時はテストできない。 make install rootで。 READMEによる。 ./configure --prefix=/usr/local make make install rootで。 libiconv.aが生成されない。なぜ? INSTALLによる。 dartsをちゃんとインストールしているのにみてくれない。 env CPPFLAGS="-I/usr/local/include" ./configure としてたら、./configureは通った。 # /usr/local/includeがインクルードファイルのディレクトリパスに入っていないようだ。 lib/dartsdic.cpp内のsetArrayをset_arrayに変更。0.2→0.3でメソッド名が変更になっているのにチェンジログに入っていない。何じゃコレは? iconvライブラリを認識されない。configureでnoとなる。そのため、リンクライブラリに登録されず、エラーを起こすらしい。 (マニュアルで-liconvを追加するとエラーは出ない) シェルで>&5ってのはどういう意味だろう。 → 出力の番号? 0はstdout 2はerrout という感じかな? >&2は標準エラー出力をリダイレクトするということで。。 libディレクトリ下のMakefileにて LIBS=-liconv としてmake libiconvを見つけられないらしいのでしばらく検討したがマニュアルで修正。 shを変えたりすれば結果が変わるかも?? 参考:ネイティブNetBSDでmakeした時、libiconvはpkgでインストール。 env CPPFLAGS="-I/usr/local/include -I/usr/pkg/include" ./configure --with-iconv=/usr/pkg lib/Makefile内のLIBS=行に -liconvを追加。 lib/dartsdic.cppを修正 で、コンパイル可能。 また、cygwinで最新バージョンを入れた場合、(2006/1/17現在)lib/dartsdic.cppのline180を修正しなければコンパイルエラーになった。 (const char*)keys[size] = key.data(); ⇒ keys[size] = (char*)key.data(); だったかな? INSTALLに従って作業する。 makeでメモリアロケーションエラーが発生。 VMwareでシステムアロケーションメモリーを194Mから284Mにしてみてリトライ。→現象は同じ。 chasenが入っていないとmakeできないため、他のPCでは作業できず。 とりあえず、既にmake済のunidic-1.1.0の辞書ファイルを持ってきた。 cygwinでインストールを試みると成功した。 ネイティブNetBSDでのインストールは失敗。NetBSDのメモリーアロケーションにバグがあるのか? cygwinで作成したunidicを使うことにする。 unidic-1.1.2 <<<クロスコンパイル編>>> env CXX=/usr/pkg/cross/bin/powerpc-netbsd-g++ CC=/usr/pkg/cross/bin/powerpc-netbsd-gcc ./configure --host=i686-netbsd --prefix=/usr/public/gtalk-ppc/p pc make サンプルプログラムをコンパイルしてみたが、うまくいかない。 exactMatchSearch()メソッドが認識されない。(テンプレートの仕組みがいまいちわからん) なにより、g++ が引数の省略を認めてくれない。なんか、オプションがあるのか?? 簡単なC++プログラムを作ってみたが、引数の省略は問題ないようだ。 どういうことか?クラス宣言がおかしい?クラスの使い方がおかしい? darts.hを若干修正して解決。 exactMatchSearch()の返り値はテンプレートではなく、呼び出される段階で既に決定しているようにした。ちなみにおかしかったのはクロスコンパイラだけ。 ネイティブコンパイラなら問題なし。 必要な辞書はなにかを調査。以下の辞書ファイルがあれば普通に変換できた。 marionet# pwd /usr/local/lib/chasen/dic/unidic marionet# ls -la total 7132 drwxr-xr-x 2 root wheel 512 Jan 28 21:08 . drwxr-xr-x 4 root wheel 512 Jan 28 21:06 .. -rw-r--r-- 1 root wheel 65559 Jan 28 21:07 cforms.cha -rw-r--r-- 1 root wheel 1626632 Jan 28 21:06 chadic.da -rw-r--r-- 1 root wheel 4011076 Jan 28 21:07 chadic.dat -rw-r--r-- 1 root wheel 1221400 Jan 28 21:06 chadic.lex -rw-r--r-- 1 root wheel 796 Jan 28 21:06 grammar.cha -rw-r--r-- 1 root wheel 111900 Jan 28 21:07 matrix.cha -rw-r--r-- 1 root wheel 201825 Jan 28 21:07 table.cha バイナリータイプの辞書ファイルは、エンディアンに依存しているらしいのでなんらかの対策が必要。 サイズももっと小さくしたい。 ※ちょっと方針変更。辞書までいじるとなると道のりが長いので、先にgtalkの移植に着手する。 env CC=/usr/pkg/cross/bin/powerpc-netbsd-gcc ./configure --host=i686-netbsd --build=powerpc-netbsd よく考えるとLINUXよりSOLARISに近い。 MakefileのCFLAGSに-DSOLARISを追加する。 da.h内 #define AUDIO_DEV "/dev/sound" /dev/audioはSOLARIS特有?のデバイス sndout()でなぜか、forced_stereoを検査しているが、forced_stereoはLINUX時のみに宣言されている。 どちらにしてもRPU-100時にはモノラルにできないので強制的にステレオダミーデータを入れるように修正。 vsprintf()やvfprintf()で使っている、va_listという型が整合しないらしい。 これは、stdarg.hやansi.h辺りで定義されているのだが、マシン依存の部分があるらしい。libcと整合された ヘッダーファイル情報でなければならないはずだが、そのあたりはよくわからない。 エラーメッセージやログなどを吐き出す部分の可変パラメータのための関数だが、どうしたものか。。 クロスコンパイラーだけの問題。 とりあえず、stdarg.hの問題はおいておく。 gtalkがchasenなしで動くように改造する必要がある。ただし、将来的にはchasenをつなぐので大改造はしない。 chasenをパイプでつなぐのはinit_text_analysis()で、入力文字列をchasenに送るのはmake_morph()で行っている。 一度、i386-netbsdで動かしてみる。 ・ssm.confに合わせてspeakersデータを準備する。 →話者データにはエンディアンが影響するらしい。i386はリトルエンディアン。 ・辞書ファイルの位置に合わせてssm.confを修正する。 ・chasenの位置に合わせてssm.confを修正する。 ・現在、i386-netbsdにはaudioデバイスがないので、その辺はコメントアウトしておく。 これで、動くには動くが、ChaOneがないせいか、うまく動かない。 C版のChaOneにlibxml2が必要らしい。http://xmlsoft.org/XSLT/が供給元というが、イマイチ不親切なHPなのでどこからDLして良いかわからない。 仕方が無いので、インストールメモのページからアーカイブファイルを拾ってきてgoogleで検索した。 アーカイブファイル名:libxml2-2.6.13.tar.gz libxslt-1.1.9.tar.gz 参考にしたインストールメモはこれ。 ---------------------------  ファイルの入手先  http://xmlsoft.org/ --------------------------------------------------------------------------------  $ cd /usr/local/src  $ libxml2-2.3.4.tar.gz  $ tar -xvzf libxml2-2.3.4.tar.gz 又は # gzip -cd libxml2-2.3.4.tar.gz | tar -xvf -  $ ls  libxml2-2.3.4  libxml2-2.3.4.tar.gz  $ cd libxml2-2.3.4  $ ./configure --without-iconv --with-ftp --with-http --with-html --enable-shared  $ make  $ su  Password:  # make install -n  # make install --------------------------- 実際にダウンロードしたのはhttp://mrtg.planetmirror.com/pub/xmlsoft/ でした。 やってみたのは・・ libxml2: ./configure --without-iconv --without-ftp --without-http --with-html make su make install シェアライブラリを作りたくなかったら。 ./configure --without-iconv --enable-shared=no --without-ftp --without-http --with-html libxslt: ./configure make su make install ライブラリをインストールして、ChaOneに再挑戦 ./configure --with-xml=/usr/local --with-xslt=/usr/local xmlChar型が認識できずにエラー。。わけわからん。。 --------------------- gtalkがうまく行かないのでちょっと細かな追跡を。どこでつまずいてるの?カナローマ字変換(音素変換)の出力がされない。 text.c make_morph()のタグ解析はうまく行ってる? カナを音素に変換するのは kana2phoneme() これは、make_phoneme()から呼び出す mora->yomi を順に変換する。 mora列は、make_mora()で作成。 morphから作成。 メッセージを見る限り、chasenの出力からmorphを作るところでうまくいっていないような気がする。 chaoneが無いから? morph->pron 読みが入ってる? 読みがある時(発声する時)はmorph->silenceにNONが入らなければならないが、なんだかそれ以外のデータが入っているようである。 そのため、kana2phoneme()が呼び出されないようだ。強制的にmorph->silenceをNONにすることで発声することができた。 ChaOneがないからか? -------------------- 長い文章を読ませるとおかしくなる。 durationが(恐らく)4096を越えるとおかしくなるようだ。 オリジナルのコードではSIZE(256*400)に区切ってオーディオデバイスにデータを送り込んでいるのだが、SIZE以上のサイズのデータ を一度に送り込んでも症状はまったく同じ。 表示されるphonemeデータは一見正しく音素に展開されている。 phoneme->phoneme, dur にアクセスしているボコーダー関連関数を探す。 PHONEME型をModel型に変換している関数を見つけた。 ここで前後の音素と関連付けてデータ化している。 なんで発声順序が入れ替わったりするのか?? 単純なシリーズデータなら起こらないはず。 make_context_data()とかいう名前だったはず。 これはVMware上のNetBSDのサウンドドライバの動作がおかしいためであった。RPU-100上では正常に再生された。 -------------------- chasen出力ファイルを読み込ませるのはset ParsedText = file.name 発声させるのはset Speak = NOW "o"でショートカット -------------------- フロントエンドが必要。 音声合成部への入力はChasen出力のような感じで形態素に分割されたものになるべき。 将来を考え、アクセント生成などはそのまま実装しておく。 ラムダが発声したい内容の単語列を用意したら、動詞の変形・修飾語の付与・助詞の付与などを行ったうえで形態素に分割された データに変換するフロントエンドが必要。 それを踏まえて、発声エンジンの実装形態はどのような形が望ましいかを考える。 発話衝動が生じると、単語列が用意され、状況などを加味した上で文章に変換する。・・・・ 発声エンジンは入力されたデータを変換発話するだけ。 通常は待機状態で、入力があると順次発話。 ・スタートタグとエンドタグがあり、その間を要発話情報として受け取る。 ・設定の変更は設定用のタグを使って処理する。 ・発声後は合成データは破棄。 タグが無視される。 コードを修正したが、ちょっと解せない。 更にアクセント用の「’」マークは無視されてしまう。 品詞コードが登録されていないと落ちてしまう。 それなりにコード修正。 アクセントはAPタグで表現するらしい。 形態素タグでのaType指定は無視されているらしい。 どうやらChaOneでAPタグをつけるのだろう。 データ型宣言はsynthesis.h 単語ごとのアクセントは活用しなくていいのかなー。 gtalk おかしいところ [済]合成を行わずに発話指令を送ると、無音?を発話し続ける。 → size_t型変数をint型にキャストした。 合成しないで発話指令したあと、合成をするとコアダンプする。 [済]発声中に発話指令を入力するとデバイスエラーとなり、その後正しく動かない。 →restartでlongjmpしているが、プロセスが死なずにそのまま残っている。 合成→発話→発話中に発話→おかしなプロセス発生→killする→発生⇒発声するが、そのままOSが落ちて、リブートがかかる。 restart()からlongjmp()しているが、refresh()がlongjmp()の後にある。合成を実施するまえにrefresh()を実行するから問題じゃないのか? 一応longjmp()の前に動かしておく。 test3.resを合成・発話した後にtest2.resを合成・発話することはできるが、test2.res→test3.resは落ちる。「短い→長い」はOKだが、「長い→短い」はダメなのか? 合成中に次の合成命令を入れると、、やはり長短でおかしくなるのか?→未確認 発話後、IDOL状態に戻るまでに合成すると・・どうだっけ? 合成データの開放はどうなってるのか? → refresh_hmmsynth()でwave.dataを開放している。refresh_vocoder()でnsampleをクリアしている。・・けど、wave.nsampleはクリアしてない?→wave.nsampleはdo_synthesis()で設定。音声合成時に更新される。 発話を追う setSpeak() => do_output() => output_speaker(nsample) => fork => init_output() -> sndout() [from init_output()]=> init_audiodev() -> open audio device ・・・フォークした先からrestart()はまずい。exit()にする。 fork()から処理は http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html に詳しい。_exit()を使わねばならないのかも。 Segmentation faultを起こす状況が絞られてきた。 場所はmake_parameter()の/* search pdfs */のループの最後のあたり。 m->mceppdf[state] = strdup (TraverseTree (m->name,t->parent)); この行で起こっているらしい。 発生するのは一度発話を行った後、発話を行わなかった場合は発生しないようである。 また、i386では起こらない。powerpcでだけ発生する。これはもしかしたらメモリー量か、メモリー構造によるものかもしれない。 また、必ずこの行で発生する。TraverseTree()内で発生している可能性が高い。 TraverseTree()内の、 answer = QuestionMatch (string, nd->quest); nd->questにアクセスした時に発生するらしい。 ndが4096という数字になっている。おかしい。 hmmsynth.cで読み取る音素データテーブルがおかしいことが原因らしい。 表示して、発声前発声後で比べようとしたら、発声前からおかしいことが発覚。 tree.c中の PrintTree()にて表示。 mset[].qhead[]のデータは大丈夫そう。 mset[].thead[]のデータが全滅っぽい。 読み込みを疑ってみる。 tree.cのReadTree() 色々と試してみたが、結局メモリーアロケーション、もしかしたらstrdup()がおかしいみたい。 コンパイラーをgccからg++にして、ソースファイルも*.ccにしたら正常になった。 ソースコードはみたところおかしいところは見当たらない。 g++にすると実行ファイルが大きくなってしまうが致し方ない。STLも使えるからヨシとするか。。 <gtalkの改造案件> ■プロンプトオプション  コマンドラインで使用するときはプロンプトを出す。 □タグの整理・入力文字列の整理(どういう入力を与えるようにするのか?) □アラビア数字読み上げ □時刻読み上げ □日付読み上げ □アルファベット読み上げ ■形態素入力削除  自然文入力を行わないので、形態素解析を行わない。  よって、形態素分析結果を待つ部分は必要なくなるので削除する。 □辞書削除 □音韻データ簡素化 □音声合成とパラメータ作成をパイプ処理 □アクセント制御  関西弁アクセントの再現はできるのか? テキスト入力イメージ :set text ジュンビガ デキマシタ。 ⇒ " "で拍を置く。 :set text <ジュンビガ 2> <デキマシタ 3> 。 ⇒ < >で拍を置く。数字でアクセント指定。 :set text コタエハ1234デス。 ⇒ こたえは、センニヒャクサンジュウヨンです。と発声。 :set text ジコクハ12:34デス。 ⇒ じこくは、ジュウニジ、サンジュウヨンプンです。と発声。 :set text キョウハ12/31デス。 ⇒ きょうは、ジュウニガツ、サンジュウイチニチです。と発声。 <gtalk不具合案件> □audioデバイスがおかしくなることがある。 最後にsilEを追加しているが、「。」だと、pauがついている。pauが必要。 データ作成を追う。 text_analysys_file() ⇒ read_morph() read_morph() アクセント句を基点にデータ作成している。 make_sil_aphrase() 無音部のアクセント句を作成 new_aphrase() ahead列に新規aphraseを追加。メンバーなし。親なし。 make_sil_morph( sil ); 無音部を1形態素、1モーラとして作成 new_morph(SILENCE sil) mphead列に追加 init_morph_data() aphrase->mphead = mphead; ←これおかしいのでは?先頭のaphraseの場合しか考えてない? ⇒mptailに修正。 aphrase->mptail = mptail; open_W2() make_mora() make_mora_data() moraを作って、morphのメンバーに。 new_mora() mrhead列に新規moraを追加。 | make_silence_mora() make_breath() aphrase列をみて、句点か、拍なら呼気段落を生成し、aphraseを組み込む。 new_breath() add_to_breath() make_phoneme() new_phoneme() 新規phonemeをphoneme列に追加。 add_to_phoneme(mora,phoneme) phonemeをmoraに追加 kana2phoneme() 読みをphonemeに変換する。 get_phoneme( "sil" ) phonemeListと照合する。何の意味があるのかわからん。 get_token() phoneme単位に分割して返す。 do_devoicing() make_sentence() new_sentence() add_to_sentence() breathをsentence列に追加。 データ構造 型名 グローバル変数 メンバー 親リスト 文章 sentence breath - 呼気段落 breath bhead,btail aphrase sentence アクセント句 aphrase ahead,atail morph breath 形態素 morph mphead,mptail mora aphrase モーラ mora mrhead,mrtail phoneme morph 音素 phoneme phhead,phtail - mora アクセント accent - - - sentence breath aphrase morph mora phoneme モデル型データに展開。 アクセント位置を変更してみたもの。 アクセントの位置はmr->acdistに反映している。 [sil]:x-sil+j/A:x_x/B:x_x_x-x_x_x+x_x_x/C:x_x_x_x-x_x_x_x_x+4_1_x_x/D:x-x_x+9/E:9 [sil]:x-sil+j/A:x_x/B:x_x_x-x_x_x+x_x_x/C:x_x_x_x-x_x_x_x_x+4_4_x_x/D:x-x_x+9/E:9 [j]:sil-j+u/A:1_0/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_1_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [u]:j-u+N/A:1_0/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_1_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [N]:u-N+b/A:2_1/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_1_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [b]:N-b+i/A:3_2/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_1_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [i]:b-i+g/A:3_2/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_1_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [g]:i-g+a/A:4_3/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_1_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [a]:g-a+d/A:4_3/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_1_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [d]:a-d+e/A:1_-1/B:x_x_x-x_x_x+x_x_x/C:4_1_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [e]:d-e+k/A:1_-1/B:x_x_x-x_x_x+x_x_x/C:4_1_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [k]:e-k+i/A:2_0/B:x_x_x-x_x_x+x_x_x/C:4_1_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [i]:k-i+m/A:2_0/B:x_x_x-x_x_x+x_x_x/C:4_1_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [m]:i-m+a/A:1_0/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [a]:m-a+sh/A:1_0/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [sh]:a-sh+I/A:2_1/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [I]:sh-I+t/A:2_1/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [t]:I-t+a/A:3_2/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [a]:t-a+pau/A:3_2/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [pau]:a-pau+sil/A:x_x/B:x_x_x-x_x_x+x_x_x/C:3_1_x_x-x_x_x_x_x+x_x_x_x/D:9-x_1+x/E:9 [sil]:pau-sil+x/A:x_x/B:x_x_x-x_x_x+x_x_x/C:3_1_x_x-x_x_x_x_x+x_x_x_x/D:9-x_x+x/E:9 [j]:sil-j+u/A:1_-3/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_4_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [u]:j-u+N/A:1_-3/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_4_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [N]:u-N+b/A:2_-2/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_4_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [b]:N-b+i/A:3_-1/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_4_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [i]:b-i+g/A:3_-1/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_4_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [g]:i-g+a/A:4_0/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_4_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [a]:g-a+d/A:4_0/B:x_x_x-x_x_x+x_x_x/C:x_x_x_0-4_4_x_1_0+2_2_x_0/D:x-9_1+0/E:9 [d]:a-d+e/A:1_-1/B:x_x_x-x_x_x+x_x_x/C:4_4_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [e]:d-e+k/A:1_-1/B:x_x_x-x_x_x+x_x_x/C:4_4_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [k]:e-k+i/A:2_0/B:x_x_x-x_x_x+x_x_x/C:4_4_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [i]:k-i+m/A:2_0/B:x_x_x-x_x_x+x_x_x/C:4_4_x_0-2_2_x_2_0+3_1_x_0/D:x-9_1+0/E:9 [m]:i-m+a/A:1_0/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [a]:m-a+sh/A:1_0/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [sh]:a-sh+I/A:2_1/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [I]:sh-I+t/A:2_1/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [t]:I-t+a/A:3_2/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [a]:t-a+pau/A:3_2/B:x_x_x-x_x_x+x_x_x/C:2_2_x_0-3_1_x_3_0+0_0_x_1/D:x-9_1+0/E:9 [pau]:a-pau+sil/A:x_x/B:x_x_x-x_x_x+x_x_x/C:3_1_x_x-x_x_x_x_x+x_x_x_x/D:9-x_1+x/E:9 [sil]:pau-sil+x/A:x_x/B:x_x_x-x_x_x+x_x_x/C:3_1_x_x-x_x_x_x_x+x_x_x_x/D:9-x_x+x/E:9 < > アクセント句 < a=1 > アクセント < s=p|b|e > サイレンス < i > 疑問形 数字の展開などがあるので、タグは"a=1"などとした方がいいか。 ジュンビガ デキマシタ 空白で一拍入れる。 空白までの一つのアクセント句として処理する。 アクセント句(aphrase>=形態素(morph)となる。 形態素分析を行っていないので、便宜上のことである。 ジュ^ンビガ デキ^マ^シタ アクセント位置のmoraの後ろに「^」をつける。 アクセント句に「^」は一つ。 二つ以上の「^」がある時、アクセント句を分割する。 <ジュ^ンビガ><デキ^><マ^シタ> tagの挿入 []にてタグを指定する。 [ジュ^ンビガ デキ^マ^シタ f] [ ]をfemaleとする。 [ジュ^ンビガ デキ^マ^シタ a:0.3]  αを0.3にする。 [ジュ^ンビガ デキ^マ^シタ r:1.5]  レートを1.5倍にする。 [ジュ^ンビ a:0.3]ガ デキ^マ^シタ [<ジュ^ンビ> a:0.3]<ガ> <デキ^><マ^シタ> タグ指定でmorphは分割される。(aphraseも分割される。) boostライブラリのインストール 正規表現ライブラリを使用するために導入してみる。 http://www.boost.org/ インストール手順などは http://www.kmonos.net/alang/boost/build.html などを参考にした。 http://sourceforge.jp/projects/boostjp に日本語化したドキュメント類がある。 bjamというツールが必要。netbsdでビルドするためにソースをDLしてきたが、構築方法がわからん。 configureとかMakefileがない。 よくみるとnetbsd用と思われるバイナリーファイルが同梱されていた。これでビルドを試みる。 bjamのソースはboost-jam-3.1.12.gzというアーカイブファイルだったが、boost-jam-3.1.12.tar.gzらしい。 unzgip してからだとtarで展開できないから注意。(展開する時のディレクトリ名とファイル名がだぶってしまう) bjamだとうまくいかない。 付属のmakefile(gcc.mak)を使うためにgmakeをインストール ユニコードを使うためにicuをインストール http://www-306.ibm.com/software/globalization/icu/index.jsp よりダウンロード gmakeが必要。gmakeがあれば、マニュアルどおりにインストール可能だった。 gmake -fgcc.mak でいい感じだが、 構造体のメンバー関数にtolow() とかtoupper() が出てきてうまくいかない。 #undef tolower #undef toupper を先頭部分に挿入したら動き出した・・が、 ../../../boost/regex/icu.hpp:336: Internal compiler error. ../../../boost/regex/icu.hpp:336: Please submit a full bug report. ../../../boost/regex/icu.hpp:336: See for instructions. というメッセージが出てきてしまった。ジ・エンドかな。。(>_<) gccのバージョンを上げればあるいはうまくいくのかも。 powerpc-netbsd-gccのバージョンが上げられないのでこれ以上は無理かと思われる。 正規表現で楽しようと思ったが諦めて自分でインプリメントすることに。 数字の読み上げ。 入力テキストの解析 [0-9][a-zA-Z][記号][2byte文字] の解析を行い、構造を分析 構造データのリストを作成。 struct{ type t; uint start; uint end; //end は最後の文字位置+1の方が便利か? uint len; }; という感じか? [0-9] D [a-zA-Z] A [記号] M [2byte文字] K として、 「ワタシワ12:30ニオキマス」 だと、 K:0:8:4 D:8:10:2 M:10:11:1 D:11:13:2 K:13:23:5 となる。 最後の要素のendがstrlen(str)と一致する。 startが前の要素のendと一致する。 数字桁読みの際の変化 サンヒャク saNhyaku サンビャク saNbyaku ロクヒャク rokuhyaku ロッピャク ro- pyaku ハチヒャク hatihyaku ハッピャク ha- pyaku ゴーマン ゴマン イチセン イッセン セン サンセン saNseN サンゼン saNzeN ハチセン hatiseN ハッセン ha- seN 時刻の読み上げ イチ ジ ニ  ジ サン ジ ヨ  ジ ゴ  ジ ロク ジ シチ ジ ハチ ジ ク  ジ ジュー   ジ ジューイチ ジ ジューニ  ジ ジューサン ジ ジューヨ  ジ ジューゴ  ジ ジューロク ジ ジューナナ ジ ジューハチ ジ ジューク  ジ ニジュー  ジ ニジューイチジ ニジューニ ジ ニジューサンジ イッ  プン ニ   フン サン  プン ヨン  プン ゴ   フン ロッ  プン ナナ  フン ハチ  フン キュー フン ジュッ プン    ジュー ニ  ジュー サン ジュー ヨン ジュー ゴ  ジュー