竹の 09/03 2000 --------------- テキストファイル読み上げツール yomi を公開します (UNIX 用)。現在 の version は 0.5 です。 1. introduction --------------- 1.1. 概要 --------- yomi は、ごく単純な方法で、テキストファイルを読み上げるためのソフ トです。特徴は次の通りです。 1) 音声出力の方法は、規則音声合成とかの立派な方法ではなく、単にテ キストファイルをひらがなの文書に直して、それに対応するひらがな の音声データを単純につないで音声デバイスなどに出すだけ、という 非常に粗末なものです。よって、イントネーションもでたらめ、一音 一音の音のデータもバラバラで決して聞きやすいものではありません。 音声データの品質も粗悪です。 2) 現在のバージョンは、日本語化された perl を使用しています。よっ て perl を知っていれば修正は可能です。 3) 漢字のひらがなへの変換には kakasi を使用していますが、kakasi はこのような目的に合わない部分があり、少し無理があります。 4) 記号の読み、アルファベットの読みには弱く、また単に一つ一つの記 号を読んでいくだけなので、非常に時間がかかります。そして、使用 すれば分かりますが、他にも弱い箇所はまだたくさんあります。 5) 50 音や数字、アルファベットの音に対応した音声データをつなげる、 という方法なので、そのようなデータを録音し直せば、任意の声で読 ませることが可能です。なお、現在対応しているのは、μ-Law 8kHz の .au ファイルのみです。 6) 日本語のコードは EUC のみに対応しています。 2. install ---------- 2.1. FreeBSD の場合の簡単な説明 ------------------------------- FreeBSD を使用していて、日本語化された perl5, kakasi がパッケージ からインストールされている場合で、yomi も /usr/local の下へインス トールしてもいい場合は、インストールは簡単です。 それ以外の場合は、Makefile を修正する必要があります。「2.2. 動作 環境」以下へ進んでください。 FreeBSD の場合のインストール方法を述べます。 1) 展開 & コンパイル % gunzip -c yomi-0.5.tar.gz | tar xf - % cd yomi-0.5 % make 2) インストール % su で root になって # make install で終りです。 2.2. 動作環境 ------------- 必要なものは以下の通りです。 1) gcc または OS 付属の cc 2) 日本語化された perl (version 5) 3) kakasi version 2.2.5 以上 (わかち書きパッチは不要) 4) μ-Law 8kHz の音声ファイル (.au) を直接再生できる音声デバイス (/dev/audio)、あるいはその音声ファイルを標準入力から読み込ん で再生できるソフト こちらでは、以下のマシンと OS の環境での動作を確認しています。 [a] NEC PC9821 + FreeBSD(98)2.2.8R-Rev03 [b] Sun SS5 (および Ultra 1) + Solaris 2.6 [c] HP9000/715 + HP-UX 9.05 条件の 1) は、 [b]: Sun WorkShop SPARC Compiler 4.0 および gcc (2.8.1) [c]: HP C Compiler (A0.9.61) および gcc (2.8.1) で確認済です。条件 [2] は、こちらでは [a],[b],[c] いずれも次のバ ージョンのもので動作しました。 % perl -v This is perl, version 5.005_02 built for i386-freebsd Copyright 1987-1998, Larry Wall Japanization patch 4 by Yasushi Saito, 1996 Modified by Hirofumi Watanabe, 1996-1998 jperl5.005_02-981225 EUC version .... 条件の 4) は、だいたいの UNIX では満たしていると思いますが、詳し いことはわかりません。また、直接当該マシンで音声を鳴らさない (ス クリプトだけ作成する) という目的の場合には特には必要ありません。 こちらで試したのは、 [a]: /dev/audio, NAS (Network Audio Server) の auplay [b]: /dev/audio, /bin/audioplay, NAS の auplay [c]: /dev/audioIU, /usr/audio/bin/splayer です。yomi で音声が鳴らせるかどうかのテストは、適当な音声ファイル file.au を使って (例えば、yomi に含まれているものでいい)、 % cat file.au > /dev/audio (デバイスファイルのテスト) % cat file.au | /bin/audioplay (音声再生ソフトのテスト) のようにすればいいでしょう。 なお、HP-UX ではデバイス名は /dev/audioIU : μ-Law 8kHz スピーカ出力 /dev/audioEU : μ-Law 8kHz イヤフォンジャック出力 /dev/audioBU : μ-Law 8kHz 両方への出力 のようになっています。/dev/audioIA などは A-Law エンコーディング ですので yomi には使えません。 2.3. Makefile の修正 -------------------- yomi のパッケージを展開してそのディレクトリに移動して Makefile の 必要な箇所を修正してください。他のファイルの修正は取り敢えずは不 要です。 修正点は以下の通りです。 ・PREFIX = インストール先のトップディレクトリ ・BINDIR = 実行ファイルのインストール先 ・LIBDIR, DATADIR, DOCDIR = 音声ファイルなどの各種ファイルのイン ストール先 ・KAKASI = kakasi のパス ・JPERL = perl のパス ・AUPLAY = 音声ファイルの再生ソフト (なければ適当でいい) ・AUDEV = 音声デバイスファイル名 (なければ適当でいい) もちろん、音声を再生するのであれば、AUPLAY, AUDEV の一方は適 切に設定されている必要があります。 ・PLAYMODE = デフォルトで再生ソフトを使うかデバイスに直接流すかの 選択を行います。 PLAYMODE = 1 : 再生ソフト (AUPLAY を使用) PLAYMODE = 0 : デバイス (AUDEV を使用) PLAYMODE = 2 : 自動判別 となっていますが、自動判別は今のところ NAS の判別にしか使えま せん (例えば HP Aserver には対応していません)。1 か 0 を指定 しておく方が無難でしょう。 ・SOLARIS_CAT = Solaris では、auconn a i > /dev/audio がうまく働 かず、cat を間に噛ませる必要がありますので、Solaris では SOLARIS_CAT = \"\| cat\" とし、Solaris 以外では SOLARIS_CAT = \"\" としてください。 ・INSTALL = install プログラムを指定します。Solaris では例えば /usr/ucb/install を指定できます (/usr/sbin/install は不可)。 また、HP-UX ではデフォルトで install を持っていませんので、同 等のことを行うシェルスクリプト cpandmod.csh を用意しました。 これを指定します。Makefile のコメント部分を参考にしてください。 ・INSTDAT = データのインストール時のコマンドラインです。 ・INSTBIN = 実行バイナリのインストール時のコマンドラインです。 なお、/usr/local などへではなく、自分のホームディレクトリの下 などにインストールする場合は -o bin -g bin を適切なものに変更 してください。 ・CC,CFLAGS,LINK = コンパイラやコンパイルオプション等の指定です。 gcc を使う場合は CFLAGS に -Dgcc を入れてください。HP cc では CFLAGS に -Aa を入れて ANSI C モードにしてください。 2.4. コンパイルとインストール ----------------------------- % make でコンパイル、そして (/usr/local 等へインストールする場合は root になってから) % make install で OK です。 2.5. 設定 --------- 特に設定は不要なはず。$(BINDIR) にパスが通っているかどうか確認し てください。音声ファイルを別なパスに作って追加する場合は、 $(LIBDIR)/auconnrc を ~/.auconnrc へとコピーしてそれを編集すれば いいでしょう。詳しくは、「4.1.1. auconn の設定ファイル」を参照し てください。 3. 使用法 --------- 3.1. 基本的な利用法 ------------------ [a] 使うには、単に % yomi [テキストファイル] として実行すれば、その [テキストファイル] を読み上げてくれます。 [b] 複数のファイルを読ませる場合は % yomi [テキストファイル 1] [テキストファイル 2] ... のように複数指定するだけです。 [c] 画面には、通常、そのファイルを kakasi で変換した行 (現在読ん でいる行) が表示されますが、 % yomi -q [テキストファイル] とすると画面への表示は消えます。 [d] yomi は、通常 1 行ずつ読みますが、メールなどのように、ある行 数で折り返された文章の場合、行単位ではなく、文単位 (句点区切り) で読ませたい、ということもあると思います。その場合は % yomi -t [テキストファイル] とします。 [e] yomi は連続して最後の文になるまで読んで行きます。改行毎に多少 の間が入りますが、1 行ずつ、休止しながら読ませたい場合もあります。 % yomi -s [テキストファイル」 とすると、1 行終了毎にキー入力待ちになり、return で次の行に行きま す。なお、このとき 'q' を押してから return するとそこで処理を中断 します。また、'r' の後 return を押すと、再び現在の行の処理を行い ます。 [f] yomi は、実際には直接音声をつなげたり、音声デバイスに音のデー タを出力しているわけではなく、そのようなことを実行するコマンドラ インを生成して、それを system() を使って実行しているだけです。 よって、そのコマンドライン行を吐き出させれば、シェルスクリプトと して利用できます。それには % yomi -d [テキストファイル] > [ファイル] とします。[ファイル] に実行すべきコマンドラインが入っていますので % csh -f [ファイル] とすれば実際に読み上げを行います。 [g] mail など、漢字コードが EUC でないファイルの場合は nkf などを 使って EUC に変換してから yomi に食わせてください。例えば % nkf -e [テキストファイル] | yomi - とすればいいでしょう。yomi はファイル名として '-' が指定されると 標準入力から読み込みます。 3.2. オプションの詳細 --------------------- yomi のオプションについて説明します。 何も引数をつけずに yomi を実行すると、yomi のオプション一覧が出力 されます。 % yomi Usage: yomi [options] [file1] ([file2] ...) -nd: 音声出力を実行 (default) -d: 音声出力はせず、実行コマンドを script の形で出力 -nt: 文の区切りは改行毎 (default) -t: 文の区切りは句点毎 .... ファイルは複数指定できます。ファイル名として '-' を指定した場合は それを標準入力と解釈します。 オプションは 4 種類に分類されます。 [a] ある機能のオンとオフ この種類のオプションは、"-d" と "-nd" のように、オプションに 'n' をつけることで反対の機能になります。以下にそれらをあげます。カッ コ内に default と書かれている方が、標準、すなわち、何も指定しない 場合の機能です。 -d: 音声出力はせず、実行コマンドをスクリプトの形で出力 -nd: 音声出力を実行 (default) -t: 文の区切りは句点毎 -nt: 文の区切りは改行毎 (default) -s: 改行毎にポーズ (キー入力待ち) を入れる -ns: ポーズ (キー入力待ち) なし (default) -q: 画面表示はなし -nq: 画面に kakasi で変換した行を表示する (default) -i: (数字) もカッコ、数字、カッコとして読む -ni: (数字) の形のものは数字ではなく数の列して読む (default) 最後のものには説明が必要です。yomi では、例えば "3235" という単語 は "さんぜんにひゃくさんじゅうご" と読みますが、"(3235)" という単 語は "さんにいさんご" と読ませるような仕様になっています。これは、 電話番号、郵便番号、学籍番号などの読みのための機能です。 yomi -i とすると、"(3235)" を "かっこさんぜんにひゃくさんじゅうご かっことじる" と読むようになります。 なお、数字と記号の入った単語は最初から記号列とみるので、例えば "0123-45-6789" は、"ぜろいちにいさんはいふんよん..." のように読み ます。 [b] 出力先の指定 yomi の出力先は、音声デバイスか、パイプを通して別な音声再生プログ ラムに流すことが可能です。それを切替えるのが -u[mode]: 出力形式を選択 です。 -u 0: 音声ファイルを直接デバイスにリダイレクション出力する -u 1: 音声ファイルをパイプを通して再生プログラムに流す -u 2: 上の 2 つを自動判別する (default) となっています。最後の、「自動判別」は、音声デバイスが開けるか開 けないかで判別するだけなので、必ずしも十分なものではありません。 例えば Solaris の場合は、/bin/audioplay という再生プログラムにパ イプを通して音声ファイルを流すことが可能です。なお、標準入力から の音声ファイルを受け付けない再生プログラムや、μ-law 8kHz の音声 データを受け付けないものは使えません。 [c] 連係プログラム等への指示 出力デバイス名や、kakasi などの外部プログラムへの指示のためのオプ ションです。 -ao [strings]: auconn に渡すオプションを指定 -ko [strings]: kakasi に渡すオプションを指定 -ap [strings]: 音声ファイル再生プログラムを指定 -ad [strings]: 音声ファイルを流すデバイスを指定 デフォルトの値は、yomi の最初の方に書かれています。インストール時 に書き換えておく方が便利ですが、環境、使用法によっては途中で切替 える必要があるかもしれません。例えば -ap '/bin/audioplay -p speaker -v 50' -ko "-JH -kH -KH -Ea -s" のように、クォートやダブルクォートを使ってスペースの入った文字列 を指定することも可能です。 なお、auconn に渡すオプションについては、「4.1 音声データ連結ツー ル (auconn)」の説明を参照してください。 [d] ヘルプ -h: オプションの一覧表示 4. 各コマンドの詳細 ------------------- yomi に付属する、連係コマンドについて説明します。 4.1. 音声データ連結ツール (auconn) ---------------------------------- yomi では、1 音ずつデバイスに音を流してはおらず、行単位で音のデー タをつなげてからデバイスに流しています。そうでないと、マシンの能 力や実行時の負荷などによって、出力が間延びしたりつまったりするか らです。その音声データの連結プログラムが auconn です。 auconn は % auconn a b c > d.au とすると、デフォルト音声データ検索パスから a.au, b.au, c.au とい うファイルを探し、それをつなげたデータファイルを作り、標準出力に 流します。よって、それが結果として d.au となって出力されます。 yomi では、実際は % auconn a i u e o > /dev/audio % auconn a i u e o | /bin/audioplay のようなコマンドラインを生成しています。 auconn は、設定ファイル、またはコマンドラインオプションを使って、 音声データの検索パス等や、拡張子等を指定できます。それを説明しま す。 4.1.1. auconn の設定ファイル ---------------------------- [a] 設定ファイル名 標準の auconn の設定ファイル名は ~/.auconnrc です。これは auconn.h の中で下のように定義されていますので、そこを書き換えれば 変更できます。 #define DEFAULTConffname "~/.auconnrc" なお、設定ファイルは auconn のコマンドラインから指定することもで きます。 % auconn -f[設定ファイル] ... [b] 書式 設定ファイルの書き方は、基本的に [タグ] [リスト] の形で書かれます。[タグ] と [リスト] の間はスペースかタブを一つ以 上書いてください。'#' で始まる行はコメントと見なされます。空行は 無視されます。 [タグ] には "path" か "ext" を指示します。よって path [検索パスリスト] ext [拡張子リスト] のように書きます。path, ext はそれぞれ path: 音声データの存在するディレクトリのリストの指定 ext: 音声データのデフォルトの拡張子の指定 を意味しています。 リストの部分は、':' で区切って複数指定することができますし、複数 の path 行を書くこともできます。また、自分のホームディレクトリを '~' と書くことも可能です (環境変数 HOME を見てそれに展開します)。 例えば path :.:~/data/yomi/tmp path /usr/local/share/yomi/data/50on path /usr/local/share/yomi/data/alph path /usr/local/share/yomi/data/num path /usr/local/share/yomi/data/null ext :.au:.AU のように書くと、検索パスリストとして "" . ~/data/yomi/tmp /usr/local/share/yomi/data/50on ... のように指定されたことになり、これらのパスを、指定されたファイル 名の先頭につけて順番にファイルを検索します。最初の "" は、パスを 何も追加せず、指定されたファイル名のまま検索することを意味します。 また、ext の部分は上の設定の場合、"" ".au" ".AU" が指定されたこと を意味しますので、例えば % auconn a とすると auconn は a, a.au, a.AU という順番で検索パスからファイル を検索します。これを設定することで、拡張子を書く手間が省けます。 もちろん、指定ファイルにパスや拡張子をつけて % auconn ~/data/a.au ~/data/b.au とすることもできます。そして、このために検索パスリストと拡張子リ ストには、空文字列を含むようにしておくといいでしょう。 なお、yomi では、-d の出力の可読性を上げるため、.au もパスもつけ ずに % auconn a i u e o > /dev/audio のように auconn を実行します。よって、必ず適切なパスと、適切な拡 張子が指定されている必要があります。 検索パス、拡張子は、 % auconn -p"~/data/yomi/tmp:." -e".au::.AU" といった具合にコマンドラインオプションから指定することもできます。 さらに、環境変数で指定することもできます。変数名はそれぞれ 環境変数 AUDATAPATH : 検索パスリスト 環境変数 AUDATAEXT : 拡張子リスト です。優先順位は コマンドラインオプション > 環境変数 > 設定ファイル > デフォルト です。デフォルトは、auconn.h に書いてありますが、 #define DEFAULTPathlist ".:/usr/local/audio/lib/audata:" #define DEFAULTExtlist ":.au:.AU" です。<== これは修正が要るな デフォルトのパスリストに、インストールしたデフォルトの音声データ のパスを埋め込み、各ユーザの ~/.auconnrc には、各自で録音したパス リストを書く、というのが標準の設定方法でしょう。 4.1.2. auconn のコマンドラインオプション ---------------------------------------- -p[検索パスリスト] : 音声データ検索パスリストの指定 -e[拡張子リスト] : 音声ファイル拡張子のリストの指定 -f[設定ファイル名] : 設定ファイルの指定 -l : 音声ファイルのリストのみ表示 -q : quiet モード 最初の 3 つは 4.1.1. でも説明しました。 -l は、音声データの連結は行わずに、指定した音声ファイルの、実際に 見つかったパスを表示します。設定ファイルのデバグに使えます。 -q は、auconn のエラー表示を抑制します。 4.2. 音声データ作成ツール (auconst, aucut, ausubstr) ---------------------------------------------------- 音声データを自分で作るためのツールを少し用意しました。ただ、 auconst 以外はまだまともに使えるレベルではありませんので、簡単な 紹介だけにしておきます。 なお、私が作った音声データは、UNIX でマイク録音したデータを、UNIX 上の GUI の音声編集エディタを使用して、前後の不要な空白部分を取り 除いたもので、aucut や ausubstr を使ってはいません。 UNIX で動作する GUI の音声編集エディタには、Solaris では、 OpenWindows の audiotool, /usr/demo/SOUND の soundtool, HP-UX で は /usr/audio にある audio_editor などがあります (私はほとんどこ れを使いました)。フリーのものとしては、xwave がありますが、マシン によって動作が不安定なようです。 私自身は、CUI で音声編集を行うツールがあったらいいなと思っていて それを目指して下の aucut や ausubstr のようなものを作っています。 4.2.1. auconst -------------- ある長さのデータを繰り返すだけの音声データ (.au) を生成するツール です。実際は、無音データの作成にしか使用していません。 % auconst (-n [num]) (-s [data]) (-i [data]) (-h) > file 出力は標準出力に出されますのでリダイレクトしてください。 -n [num]: データブロックの個数 (default: 10) -s [data]: データブロック (16 進数) (default: なし) -i [data]: データブロック (10 進整数 (0~255)) (default: 0) -h: ヘルプメッセージ (この程度) -s [data] や -i [data] で指定したデータを -n [num] で指定した回数 だけ繰り返したデータを作成します。-s の方はデータを 16 進数の文字 列として読み込みますし、-i の方は 10 進数として読み込みます。 それらのデータを、8bit μ-law エンコーディングされた 0~255 までの 値のデータと見なして、つなげるだけです。-s の方は、08080a0a0808 のように、多少長い文字列も指定できますので、工夫すればある種の音 を出すこともできます (が、面倒です)。 なお、私が使用している無音は % auconst -s 7e -n 2000 > null.au として作ったものです。 4.2.2. aucut ------------ GUI ではないツールで、一度に複数の音が録音されたデータから単音の データを切り出すことを目標に、取り敢えず作ってみたツールです。 % aucut [options] [出力ファイル指定] [aufile] [aufile] : 複数の単音を録音したデータファイル (.au) [options] : -r[R] : 信号とノイズの比のしきい値 (default=0.1) -t[T] : 最短音声データ長 [秒] (default=0.01) -s[S] : 最短雑音部分長 [秒] (default=0.01) -p[path] : 出力ファイルを格納するパス (default=カレントディレクトリ) -v : 冗長出力 [出力ファイル指定] は、複数のデータファイル名を指定します。書式は (a) ',' 区切り (例: a,o,ko) (b) '-' 区切り (例: a-ko ==> a,i,u,e,o,ka,ki,ku,ke,ko) のどちらかの書き方ができます。スペースは入れないようにします。(b) には、順序があるわけですが、それは autable.h を見てください。5.3. 音声データ表に書いてある順もほぼ同じだと思います。 [R],{T},[S] の値ですが、動作は次のようになっています。 [1] (信号の強さの最大値)×[R] 以下の強さのデータ部分は雑音部分と みなします。よって [R] を 小さくする ==> 雑音を拾いやすくなり、各音声は長めになり、総音 声数は増える 大きくする ==> 小さい音声が雑音と見なされて捨てられてしまい、 各音声は短めになり、総音声数は減る となります。 [2] [T] より短い音声部分は雑音とみなします。よって [T] を 小さくする ==> ピーク型のノイズを拾いやすくなる 大きくする ==> 短い音声をノイズとみて捨ててしまう となります。 [3] 音声データ中の雑音部分で、[S] より短い部分は、データ中で一時 的にデータが弱くなっている部分と判断し、音声データが継続して いるとみなします。よって、[S] を 小さくする ==> 一時的に弱い部分も音の切れ目と判断されて音声が 途中で切れてしまう 大きくする ==> 音と音との間も音声がつながっているとみなされて 音が切り離せなくなる となります。 これらを調整しながら使用しないといけないのですが、それは録音環境 により千差万別、また、試行錯誤の連続が必要になりますし、それを行 っても実際にはあまり綺麗には切れません。まだ GUI ツールで目でみな がら、部分的に再生しながら切るのには全くかないません。 4.2.3. ausubstr --------------- aucut では、例えばアルファベットや数字などの複音からなるデータを 切り出すことは難しいです。ausubstr は、AWK の substr 関数のように 先頭と長さを指定して、録音データから音を切り出すツールです。 % ausubstr (-v) (-q) (-o [outfile]) [start] ([length]) [infile] -v : 冗長モード -q : quiet モード (default) -o [outfile] : 出力ファイルの指定 (default: 標準出力) [start] : 開始位置 [length]: 出力最大長 (default: 最後まで) [infile]: 入力ファイル 入出力ファイルは、'-' を指定すると標準入出力になります。start と length の単位は一つのサンプリングデータ単位ですので、1/8000 秒と なります。 最悪の場合、GUI の音声編集エディタがなくても、この ausubstr と sox と gnuplot があれば、ある程度の編集は可能ですが、それは非常に 大変な作業です。 4.3. スクリプトの less (shless) ------------------------------- これは、yomi で読ませるときは、前に読んだところに戻れない、という ことを解消するために作ったミニツールですが、非常に低機能ですので 実際にはあまり使い物にならないと思います。 % shless [script file] とすると、csh のスクリプトファイルを一行表示してそれを実行し、キ ー入力待ちの状態になります。[script file] として "-" を指定すると 標準入力から読みます。 キーの意味は次の通りです。 n: 次の行 ([space], [return]) r: 今の行 b: 前の行 g: 最初の行 G: 最後の行 h: キー一覧表示 q: 終了 [script file] の '#' で始まる行はコメント行とみなして実行をとばし ます。実際には各行を system() で実行しているだけです。3 行戻る、 とかはまだサポートしていません。yomi と組み合わせるときは % yomi -d [テキストファイル] | shless - のようにします。 5. 技術情報 ----------- 5.1. 動作の流れ --------------- yomi の動作の詳細については perl のソースを見てください。 基本的に、次のように動作しています。 [a] kakasi で漢字をひらがなに変換し、文章を単語毎に区切る [b] 各単語を分類 [c] 分類された単語を音声ファイル名に分割し、コマンドラインを生成 [d] そのコマンドラインの実行 [a] の kakasi は、デフォルトでは kakasi -JH -kH -KH -Ea -s -f をフィルタとして使っています。これには少し理由があります。 例えば 「私の勤め先は新潟工科大学です。」 は、 (1) kakasi -JH ==> わたしのつとめさきはにいがたこうかだいがくです。 (2) kakasi -JH -s ==> わたし の つとめさき は にいがた こうかだいがく です 。 (3) kakasi -JH -f ==> 私[わたし]の勤め先[つとめさき]は新潟[にいがた]工科大学[こ\ うかだいがく]です。 (4) kakasi -JH -s -f ==> 私[わたし] の 勤め先[つとめさき] は 新潟[にいがた] 工科大学[\ こうかだいがく] です 。 のようになります。(1) のひらがなだけの列だと間を入れることができ ません。(2) のひらがなに空白が入ったものだと、空白を間に置き換え れば確かに間が入りますが、それだと、「わたし」と「の」の間、「つ とめさき」と「は」の間にもいらない間が入ってしまうことになります。 よって、「漢字」+「ひらがな」の間を抜くために -f を使っているので すが、(3) ではやはり処理が面倒なので、(4) の出力を利用しています。 (4) の出力を空白区切りで単語と見なし、"[ひらがな]" で終っている単 語は漢字と見なし、「漢字」+「ひらがな」は間を入れない、という処理 を行っているわけです。もちろん、漢字の部分は "[ひらがな]" の部分 を見て音声ファイルに割り当てます。 単語は、[b] で 句読点、ひらがな、漢字、数字、(数字)、記号 の 6 種類に分類しています。これらに合わなかった単語はエラーとなり ます。 [c] でそれらを音声ファイルに割り当てる作業をします。 5.2. 音声ファイルへの割り当て処理 --------------------------------- 句読点は句点と読点に分け、それぞれ長めの間、短めの間に変換します。 なお、間は auconn を実行しないのではなく、無音状態の音声ファイル を用意し、それらに割り当てています。そうでないと間がマシンの状態 によってまちまちになりますし、音声ファイル前後の雑音が入るからで す。無音の間を含ませて行単位で連結を行うわけです。 ひらがなは、濁音 (だ) や 拗音 (ゃ) などを含む場合の合字を行い、音 声ファイルに割り当てます。促音 (っ) は短い間で置き換え、長音は直 前のひらがなの母音を続けます。よって音声データには単なる 50 音だ けではなく、濁音、拗音などを含む音などのデータも用意する必要があ ります。必要なデータの表は後で記します。 数字は、整数部分と小数部分に分け、整数部分は 4 桁ずつに分け、各 4 桁を "なんぜんなんびゃくなんじゅうなん" という文字列に直し、それ にその 4 桁に対応する位名 (万、億、兆) などを割り当てています。あ まり大きなものは必要なしと考え、現在は "京" までしかサポートして いませんが、原理的には 「9999 無量大数」までサポートすることは可 能だと思います。小数部分は単に "てん" を読んでから、後に続く数字 を一音一音数字のファイルに割り当てていくだけです。 なお、数字は、例えば "3" を「さん」にしているのではなく、3.au と いう、「さん」の音の入った音声ファイルを用意しています。これはそ うしないと数字の読みが間延びするからです。そして、音の読みの例外、 すなわち 、 "300" ==> "さんびゃく" (百が濁る) "600" ==> "ろっぴゃく" (六が促音に、百が半濁音に変化) "800" ==> "はっぴゃく" (同上) "3000" ==> "さんぜん" (千が濁る) "8000" ==> "はっせん" (八が促音に変化) はそれ専用の音声データを用意し、さらに、「じゅう」「ひゃく」「せ ん」も専用の音声データを使用します。これにより、数字は割と高速に 読めます。 記号は、本来時と場合により読みが変わるのが自然なのですが、ここで はその処理はしておらず、記号に固定されたひらがな文字列を割り当て ていて、そのひらがな文字列を読ませています。それは yomi の中の %Char = ( '[', 'だいかっこ', ']', 'だいかっことじる', '(', 'しょうかっこ', ')', 'しょうかっことじる', '{', 'ちゅうかっこ', '}', 'ちゅうかっことじる', '@', 'あっとまーく', '&', 'あんぱーさんど', ... の連想配列の中で行っているので、この文字列を変えれば固定の読みは 変えることができます。ただし、アルファベットは別で、アルファベッ トはそれらに対する専用の音声データを持っていてそれを使用します。 ひらがなにするとそれらしく聞こえない、ということと、高速化のため にそうしています。 なお、アルファベットの B と D は聞き分けにくい (^^; ので、例えば A,B,C,D の成績の読み合わせなどには向きません。よって、そのような 必要がある場合には、音声ファイルを作り直すか、元のデータファイル を変換してください。私はそのような場合は、sed を使って元のファイ ルの方を sed 's/[Dd]/でい/g' のようにして 'D' と 'd' を "でい" に変換してから yomi にかけてい ます。 5.3. 音声データ表 ----------------- yomi のソースを見ればだいたい分かりると思いますが、yomi が使用す る必要な音声データを表にして紹介します。ファイル名の拡張子 ".au" は省略します。 (1) ひらがな (連想配列 %H2a{}) 読み|file 読み|file 読み|file 読み|file 読み|file 読み|file ----+---- ----+---- ----+---- ----+---- ----+---- ----+---- あ |a か |ka さ |sa た |ta な |na は |ha い |i き |ki し |si ち |chi に |ni ひ |hi う |u く |ku す |su つ |tsu ぬ |nu ふ |hu え |e け |ke せ |se て |te ね |ne へ |he お |o こ |ko そ |so と |to の |no ほ |ho 読み|file 読み|file 読み|file 読み|file ----+---- ----+---- ----+---- ----+---- ま |ma や |ya ら |ra わ |wa み |mi ゆ |yu り |ri を |o む |mu よ |yo る |ru ん |n め |me れ |re も |mo ろ |ro 読み|file 読み|file 読み|file 読み|file 読み|file ----+---- ----+---- ----+---- ----+---- ----+---- が |ga ざ |za だ |da ば |ba ぱ |pa ぎ |gi じ |zi | び |bi ぴ |pi ぐ |gu ず |zu | ぶ |bu ぷ |pu げ |ge ぜ |ze で |de べ |be ぺ |pe ご |go ぞ |zo ど |do ぼ |bo ぽ |po 読み|file 読み|file 読み|file 読み|file 読み|file 読み|file ----+---- ----+---- ----+---- ----+---- ----+---- ----+---- きゃ|kya しゃ|sha ちゃ|cha にゃ|nya ひゃ|hya みゃ|mya きゅ|kyu しゅ|shu ちゅ|chu にゅ|nyu ひゅ|hyu みゅ|myu きょ|kyo しょ|sho ちょ|cho にょ|nyo ひょ|hyo みょ|myo 読み|file 読み|file 読み|file 読み|file 読み|file ----+---- ----+---- ----+---- ----+---- ----+---- りゃ|rya ぎゃ|gya じゃ|ja びゃ|bya ぴゃ|pya りゅ|ryu ぎゅ|gyu じゅ|ju びゅ|byu ぴゅ|pyu りょ|ryo ぎょ|gyo じょ|jo びょ|byo ぴょ|pyo 読み|file 読み|file 読み|file ----+---- ----+---- ----+---- ふぁ|fa てぃ|ti っ |ttsu ふぃ|fi とぅ|tu ー |error ふぇ|fe じぇ|je ふぉ|fo でゅ|dyu 最後の「っ」は、短い空白を使用し、「ー」はエラーとしていますので、 error.au は適当に作ってください (何でも結構です)。 (2) 数字 読み|file 読み |file 読み |file 読み |file ----+---- ------+---- ------+---- ----------+---- ぜろ|0 ご |5 じゅう|10 さんびゃく|300 いち|1 ろく |6 ひゃく|100 ろっぴゃく|600 に |2 なな |7 せん |1000 はっぴゃく|800 さん|3 はち |8 さんぜん |3000 よん|4 きゅう|9 はっせん |8000 (3) アルファベット ファイル名は A.au から Z.au の 26 file です。 (4) 空白、促音 (っ) これは付属のものをそのまま使えばいいでしょう。 意味 |file ------+---- (空白)|null 促音 |ttsu この 2 つは実は同じもので、auconst を使って auconst -s 7e -n 2000 > null.au ; cp null.au ttsu.au として作ったものです。 6. その他 --------- まだまだ、やらなければいけないことは山程あります。しかしいずれも いつになったらできるのかわかりません。卒研の学生に手伝ってもらっ たり、卒研で考えてもらったりしながら少しずつ前に進んで行こうと思 っています。とりあえずやらないといけないのは、 1) オンラインマニュアル (roff の勉強をしないといけない ?) 2) 各コマンドのバグ取り (まだかなりある) 3) 音声ファイル作成ツールの改良 (全然使えない) 4) 音声データの改良 (ひどすぎる (^^;) などがあります。 実は、規則音声合成にはあまり興味や関心を持っていません。それを yomi に組み合わせられればいいのでしょうが、それよりも、このような 低機能なツールで何ができるか、どんなところに役立つか、という可能 性の方に興味があります。 例えば、音声データを一音一音用意しているという形態は、速度や規則 音声合成へ発展させるには不利かも知れませんが、ユーザが用意に音声 データを作り直せる、という有利な面もあるでしょう。perl で書いてい るのも同様の意味があります。C で書き直すことは、今のところあまり 考えていません (一番最初の yomi は AWK 版でした)。 よって、現在は yomi 自身の積極的な改良より、その周辺ツールや、こ れらを使った別なツールに関心を寄せていて、それらをまた学生の卒研 のテーマとして使うことなどを考えています。 私自身、このような低機能のツールを作った動機は、学生のテストの成 績の読み合わせ作業に使いたかったからです。パソコンの UNIX をわざ わざ shutdown して MS-DOS で VC2 を使う、ということをやるのが面倒 だったので作ったのですが、現在は、yomi を出席のデータ入力の時や、 パソコン内のデータの紙への転写の際に利用し、作業の量の軽減に役立 てています。 UNIX という、テキスト処理やツールの組み合わせを得意とする環境では、 まだまだ色々な可能性があると思っています。また、CUI での音声デー タの作成ツールがあれば、視覚障害者にも使えるツールになる可能性も あるのではないかと期待しています。 7. バグリポート、ライセンス --------------------------- このツール群は無保証です。しかし色々な不具合は、対応できるものは 行う予定ですので、不具合の報告、意見などは歓迎します。報告等は下 記メールアドレスへお願い致します。 また、このソフトはフリーソフトとして公開します。再配布、改良は可 能です。GPL に準じたライセンスとしたいと思いますが、まだそこまで は考えていません。 なお、この中に含まれる g711.c は、Sun Microsystems, Inc. の、改変、 再配布が可能なコードです。このファイルに関しては、ライセンスは、 そのファイルの最初のコメント部分に記載されている事項に従います。 8. 謝辞 ------- このツールの改良に関して、研究室の 1999 年度の卒研生 佐藤健美君に 色々調査、考察をして頂きました。どうもありがとうございました。 彼には、yomi 用の kakasi パッチを作成してもらったのですが、実はま だ現在の yomi はそれに対応していません。どうもすみません。次期バ ージョンでの対応を考えています。 9. 変更履歴 ----------- 07/17 1998 Ver.0.1 02/16 1999 Ver.0.2 03/09 1999 Ver.0.3 05/02 2000 Ver.0.4 09/03 2000 Ver.0.5 yomi 07/17 1998 1) AWK 版の低機能版が取り敢えず完成。 02/16 1999 2) 外部音声出力プログラムに対応。 3) auconn の作成。 03/09 1999 4) auconst の作成。 5) perl 版の作成。 6) auconn の改良。 7) audio server (NAS) の自動判別。 05/02 2000 8) auconn の改良。 9) 公開版の作成開始。 09/03 2000 10) 公開版。ドキュメントをつける。 11) コマンドラインオプションをつける。 12) pause のサポート。 13) 複数のファイルのサポート。 14) aucut の作成。 15) 句点区切りのサポート。 16) shless の作成。 17) ausubstr の作成。 +=================================================+ 竹野茂治 〒945-1195 新潟工科大学 情報電子工学科 shige@iee.niit.ac.jp TEL(&FAX): 0257-22-8161 +=================================================+