竹の 10/07 2000 --------------- テキストファイル読み上げツール yomi を公開します (UNIX 用)。現在 の version は 0.6.2 です。 1. introduction --------------- 1.1. 概要 --------- yomi は、ごく単純な方法で、テキストファイルを読み上げるためのソフ トです。特徴は次の通りです。 1) 音声出力の方法は、規則音声合成とかの立派な方法ではなく、単にテ キストファイルをひらがなの文書に直して、それに対応するひらがな の音声データを単純につないで音声デバイスなどに出すだけ、という 非常に粗末なものです。よって、イントネーションもでたらめ、一音 一音の音のデータもバラバラで決して聞きやすいものではありません。 音声データの品質も粗悪です。 2) 現在のバージョンは、日本語化された perl を使用しています。よっ て perl を知っていれば修正は可能です。 3) 漢字のひらがなへの変換には kakasi を使用していますが、kakasi はこのような目的に合わない部分があり、少し無理があります。 4) 記号の読み、アルファベットの読みには弱く、また単に一つ一つの記 号を読んでいくだけなので、非常に時間がかかります。そして、使用 すれば分かりますが、他にも弱い箇所はまだたくさんあります。 5) 50 音や数字、アルファベットの音に対応した音声データをつなげる、 という方法なので、そのようなデータを録音し直せば、任意の声で読 ませることが可能です。なお、現在対応しているのは、μ-Law 8kHz の AU ファイル (.au)、および linear PCM の WAV ファイル (.wav) のみです。 6) 日本語のコードは EUC のみに対応しています。 2. install ---------- 2.1. FreeBSD の場合の簡単な説明 ------------------------------- FreeBSD を使用していて、日本語化された perl5, kakasi がパッケージ からインストールされている場合で、yomi も /usr/local の下へインス トールしてもいい場合は、インストールは簡単です。 それ以外の場合は、Makefile を修正する必要があります。「2.2. 動作 環境」以下へ進んでください。 FreeBSD の場合のインストール方法を述べます。 0) ダウンロード 下記サイトから持って来てください。 yomi Home page http://takeno.iee.niit.ac.jp/~shige/unix/yomi/yomi.html 1) 展開 & コンパイル % gunzip -c yomi-0.6.2.tar.gz | tar xf - % cd yomi-0.6.2 % make 2) インストール % su で root になって # make install で終りです。 なお、標準では、AU ファイル用、WAV ファイル用のもの全てをインスト ールしますが、AU ファイル用のもののみインストールする場合は % make au # make install-au WAV ファイルのもののみインストールする場合は % make wav # make install-wav とするといいでしょう。 2.2. 動作環境 ------------- 必要なものは以下の通りです。 1) gcc または OS 付属の cc 2) 日本語化された perl (version 5) 3) kakasi version 2.2.5 以上 (わかち書きパッチは不要) 4) 音声を再生できる環境 (以下のうちいずれか一つあればよい) ・μ-Law 8kHz の音声ファイル (.au) を直接再生できる音声デバイス (/dev/audio) ・μ-Law 8kHz の音声ファイル (.au) を標準入力から読み込んで再生 できるソフト ・linear PCM の WAV 形式の音声ファイルを標準入力から読み込んで 再生できるソフト 標準入力から読み込むのは無理な再生ソフトでも、ラッパースクリプト を書いてごまかすことはできます (後述)。 こちらでは、以下のマシンと 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 で満たしていると思いますが、詳しいこと はわかりません。μ-Law に対応しているデバイスがない場合は、どこか から適当に AU ファイル、あるいは WAV ファイルを再生するソフトを持 って来てください。最近の Linux は、μ-Law に対応するデバイスを持 たないことも多いようです。 また、直接当該マシンで音声を鳴らさない (スクリプトだけ作成する) という目的の場合には、4) は特には必要ありません。 こちらで試したのは、 [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 | /usr/local/bin/auplay % cat file.wav | /usr/local/bin/wavplay のようにすればいいでしょう。 なお、HP-UX ではデバイス名は /dev/audioIU : μ-Law 8kHz スピーカ出力 /dev/audioEU : μ-Law 8kHz イヤフォンジャック出力 /dev/audioBU : μ-Law 8kHz 両方への出力 のようになっています。/dev/audioIA などは A-Law エンコーディング ですので yomi には使えません。 再生ソフトが標準入力からの読み込みをサポートしていない場合は、次 のようなラッパースクリプトで代用すればいいでしょう。 ----- ここから ----- #!/bin/csh -f /bin/cat > /tmp/yomi-tmp.au /usr/local/bin/auplay /tmp/yomi-tmp.au /bin/rm /tmp/yomi-tmp.au ----- ここまで ----- 2.3. Makefile の修正 -------------------- yomi のパッケージを展開してそのディレクトリに移動して Makefile の 必要な箇所を修正してください。他のファイルの修正は取り敢えずは不 要です。 修正点は以下の通りです。 ・PREFIX = インストール先のトップディレクトリ ・BINDIR = 実行ファイルのインストール先 ・LIBDIR, DATADIR, DOCDIR = 音声ファイルなどの各種ファイルのイン ストール先 ・KAKASI = kakasi のパス ・JPERL = perl のパス ・AUPLAY = AU 音声ファイルの再生ソフト (なければ適当でいい) ・AUDEV = AU 音声デバイスファイル名 (なければ適当でいい) もちろん、音声を再生するのであれば、AUPLAY, AUDEV の一方は適 切に設定されている必要があります。 ・AUPLAYMODE = デフォルトで再生ソフトを使うかデバイスに直接流すか の選択を行います (version 0.5.X までは PLAYMODE)。 AUPLAYMODE = 1 : 再生ソフト (AUPLAY を使用) AUPLAYMODE = 0 : デバイス (AUDEV を使用) AUPLAYMODE = 2 : 自動判別 となっていますが、自動判別は今のところ NAS の判別にしか使えま せん (例えば HP Aserver には対応していません)。1 か 0 を指定 しておく方が無難でしょう。 ・WAVPLAY = WAV 音声ファイルの再生ソフト (なければ適当でいい) ・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. コンパイルとインストール ----------------------------- AU ファイル用、WAV ファイル用のものすべてをインストールする場合は % make でコンパイル、そして (/usr/local 等へインストールする場合は root になってから) % make install とすれば OK です。 AU ファイル用のもののみインストールする場合は % make au % make install-au WAV ファイル用のもののみインストールする場合は % make wav % make install-wav とするといいでしょう。 インストールされる読み上げソフトの標準のコマンド名は yomi ですが make install で AU ファイル用、WAV ファイル用の両方をインストール した場合は yomi-au : AU ファイル用 yomi-wav: WAV ファイル用 yomi : AU ファイル用 (yomi-au と同じ (シンボリックリンク)) の 3 つのコマンドがインストールされます。オプション、その他の機能 はいずれも同一ですので、yomi-au, yomi-wav に関しては、以下の記述 の yomi を、それぞれ読み変えてください。 make install-au, make install-wav した場合は、それぞれ yomi-au, yomi-wav がインストールされ、それに yomi がシンボリックリンクされ ます。 2.5. 設定 --------- 特に設定は不要なはず。$(BINDIR) にパスが通っているかどうか確認し てください。音声ファイルを別なパスに作って追加する場合は、 $(LIBDIR)/auconnrc を ~/.auconnrc へ (AU ファイルを使う場合) $(LIBDIR)/wavconnrc を ~/.wavconnrc へ (WAV ファイルを使う場合) のようにコピーしてそれを編集すればいいでしょう。詳しくは、 「4.1.1. auconn,wavconn の設定ファイル」を参照してください。 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 yomi version 0.6.2 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) -n: 数字もひらがなに直してベタ読みする -nn: 数字用の音素を使用 (default) -a: アルファベットもひらがなに直してベタ読みする -na: アルファベット用の音素を使用 (default) -i (-ni) オプションには説明が必要です。 yomi では、例えば "3235" という単語は "さんぜんにひゃくさんじゅう ご" と読みますが、"(3235)" という単語は "さんにいさんご" と読ませ るような仕様になっています。これは、電話番号、郵便番号、学籍番号 などの読みのための機能です。 yomi -i とすると、"(3235)" を "かっこさんぜんにひゃくさんじゅうご かっことじる" と読むようになります。 なお、数字と記号の入った単語は最初から記号列とみるので、例えば "0123-45-6789" は、"ぜろいちにいさんはいふんよん..." のように読み ます。 また、version 0.6.2 から、アルファベット、数字を、専用音素を使用 する/しない、を選択できるオプション -n (-nn), -a (-na) を用意しま した。しない、とすると、すべてひらがなに直してから読みますので、 さらに聞きにくくなりますが (^^; それらの専用音素がない場合には有 効です。 yomi は、-s なし (あるいは -ns) で実行すると、指定されたファイル の最後まで実行しますので、その場合の中断は Ctrl-c などで行います が、環境にもよりますが、デバイスへの出力との関係で中断があまりう まくいかない場合があります。 その場合、何回か Ctrl-c を繰り返すと止まるようですが、途中で中断 する可能性がある場合はできるだけ -s オプションを使うのがいいと思 います。-s を使うと、「3.1. 基本的な利用法」[e] で説明したように q RET で行毎に中断できます。 [b] 出力先の指定 yomi の出力先は、音声デバイスか、パイプを通して別な音声再生プログ ラムに流すことが可能です。それを切替えるのが -u[mode]: 出力形式を選択 です。 -u 0: 音声ファイルを直接デバイスにリダイレクション出力する -u 1: 音声ファイルをパイプを通して再生プログラムに流す -u 2: 上の 2 つを自動判別する (default) となっています。最後の、「自動判別」は、音声デバイスが開けるか開 けないかで判別するだけなので、必ずしも十分なものではありません。 例えば Solaris の場合は、/bin/audioplay という再生プログラムにパ イプを通して音声ファイルを流すことが可能です。なお、標準入力から の音声ファイルを受け付けない再生プログラムや、μ-law 8kHz の AU 形式の音声データ (yomi-wav の場合は linear PCM の WAV データ) を 受け付けないものは使えません。 [c] 連係プログラム等への指示 出力デバイス名や、kakasi などの外部プログラムへの指示のためのオプ ションです。 -ao [strings]: auconn (または wavconn) に渡すオプションを指定 -ko [strings]: kakasi に渡すオプションを指定 -ap [strings]: 音声ファイル再生プログラムを指定 -ad [strings]: 音声ファイルを流すデバイスを指定 auconn は yomi (yomi-au) 用、wavconn は yomi-wav 用です。 これらのデフォルトの値は、yomi の最初の方に書かれています。インス トール時に書き換えておく方が便利ですが、環境、使用法によっては途 中で切替える必要があるかもしれません。例えば -ap '/bin/audioplay -p speaker -v 50' -ko "-JH -kH -KH -Ea -s" のように、クォートやダブルクォートを使ってスペースの入った文字列 を指定することも可能です。 なお、auconn, wavconn に渡すオプションについては、「4.1 音声デー タ連結ツール (auconn, wavconn)」の説明を参照してください。 [d] ヘルプ、バージョン表示 -v: バージョンの表示 -h: オプションの一覧表示 3.3. オプションの複雑な使用例 ----------------------------- 以下に 2 つ、オプションを複雑に組み合わせた使用例 (裏技 ?) を紹介 します。ほかにも面白い使用例があれば、是非教えてください。 [a] yomi で、文章を音声化したファイルを作る yomi では、-u0 で音声デバイスにリダイレクションすることができます が、その音声デバイスは -ad で指定できますので、例えば % echo "新潟県" | yomi -u0 -ad niigata.au -q - % echo "新潟県" | yomi-wav -u0 -ad niigata.wav -q - とすると、「にいがたけん」という音声ファイル niigata.au, niigata.wav ができます。ただし、これは 2 行以上の文章には使えませ ん (最後の文章だけがファイル化されます)。 [b] 読ませたい文書に必要な音声ファイルがあるかどうか確認 auconn (wavconn) には、必要な音声ファイルのパスを出力するオプショ ン (-l) が、チェック用についています (「4.1.2. auconn, wavconn の コマンドラインオプション」参照)。yomi は、-ao で auconn にオプシ ョンを渡すことができますので、それを使えばそのチェックを yomi 上 でできます。ただし、この場合は、出力先をデバイスなどから切り替え るために、-u1 で出力先をプログラムにして、そのプログラム (例えば cat) を -ap で指定します。 例えば % echo "新潟県" | yomi -ao-l -u1 -ap cat - % echo "新潟県" | yomi-wav -ao-l -u1 -ap cat - のようにすると、「新潟県」を音読するのに必要な音声ファイルの一覧 がパス付で表示されます。 長い文章の場合は、更にその出力に sort と uniq などを噛ませるとい いでしょう。これは yomi がうまく動作しない場合のデバッグ作業など で使えると思います。 もちろん、これらは yomi -d の出力を、手で編集しても可能で、その方 が速いこともあるかも知れません。 4. 各コマンドの詳細 ------------------- yomi に付属する、連係コマンドについて説明します。 4.1. 音声データ連結ツール (auconn, wavconn) ------------------------------------------- yomi では、1 音ずつデバイスに音を流してはおらず、行単位で音のデー タをつなげてからデバイスに流しています。そうでないと、マシンの能 力や実行時の負荷などによって、出力が間延びしたりつまったりするか らです。その音声データの連結プログラムが auconn, wavconn です。 auconn は AU ファイルを、wavconn は WAV ファイルを連結します。 wavconn に関する仕様は auconn とほぼ同様ですので、以下では主に 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 のようなコマンドラインを生成しています。 なお、WAV ファイルに関しては (yomi-wav)、それをそのままデバイスに 流すことはせず、必ず再生ソフトに渡しています。 また、auconn, wavconn は、フォーマット (チャンネル数、サンプリン グデータなど) の違うデータを連結することはできません。使用するデ ータを自分で用意する場合は、これらのフォーマットを揃えたものをご 使用ください。現在用意してある wav データは、au データを sox を使 って 8kHz linear PCM の wav にしたもので、音質はよくありません。 auconn, wavconn は、設定ファイル、またはコマンドラインオプション を使って、音声データの検索パス等や、拡張子等を指定できます。それ を説明します。 4.1.1. auconn, wavconn の設定ファイル ------------------------------------- [a] 設定ファイル名 auconn, wavconn の標準の設定ファイル名はそれぞれ ~/.auconnrc, ~/.wavconnrc で、これは auconn.h, wavconn.h の中で下のように定義 されていますので、そこを書き換えれば変更できます。 #define DEFAULTConffname "~/.auconnrc" (auconn.h) #define DEFAULTConffname "~/.wavconnrc" (wavconn.h) なお、設定ファイルは auconn, wavconn のコマンドラインから指定する こともできます。 % auconn -f[設定ファイル] ... % wavconn -f[設定ファイル] ... [b] 書式 設定ファイルの書き方は、基本的に [タグ] [リスト] の形で書かれます。[タグ] と [リスト] の間はスペースかタブを一つ以 上書いてください。'#' で始まる行はコメントと見なされます。空行は 無視されます。 [タグ] には "path" か "ext" を指示します。よって path [検索パスリスト] ext [拡張子リスト] のように書きます。path, ext はそれぞれ path: 音声データの存在するディレクトリのリストの指定 ext: 音声データのデフォルトの拡張子の指定 を意味しています。 リストの部分は、':' で区切って複数指定することができますし、複数 の path 行を書くこともできます。また、自分のホームディレクトリを '~' と書くことも可能です (環境変数 HOME を見てそれに展開します)。 例えば ~/.auconnrc に 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 を実行します。よって、必ず適切なパスと、適切な拡 張子が指定されている必要があります。 ただし、例えば上のような検索パスリストと拡張子リストの設定の場合、 カレントディレクトリに、例えば "mo" などのファイルやディレクトリ があると、それがマッチしてしまい、それを音声ファイルと見なします のでなってしまいますので注意してください。正しくファイルを検索し ているかどうかは % auconn -l a i u e o のようにすれば確認できます。 検索パス、拡張子は、 % auconn -p"~/data/yomi/tmp:." -e".au::.AU" といった具合にコマンドラインオプションから指定することもできます。 さらに、環境変数で指定することもできます。変数名はそれぞれ 環境変数 AUDATAPATH : AU ファイル検索パスリスト (auconn) 環境変数 AUDATAEXT : AU ファイル拡張子リスト (auconn) 環境変数 WAVDATAPATH : WAV ファイル検索パスリスト (wavconn) 環境変数 WAVDATAEXT : WAV ファイル拡張子リスト (wavconn) です。優先順位は コマンドラインオプション > 環境変数 > 設定ファイル > デフォルト です。デフォルトは、検索パスリストは Makefile で設定するようにな っていて、拡張子リストは auconn.h, wavconn.h に書いてありますが、 auconn: #define DEFAULTPathlist "$(DATADIR)/50on:$(DATADIR)/alph :$(DATADIR)/num:$(DATADIR)/null" #define DEFAULTExtlist ":.au:.AU" wavconn: #define DEFAULTPathlist "$(DATADIR)/wav" #define DEFAULTExtlist ":.wav:.WAV" となっています。 デフォルトのパスリストに、インストールしたデフォルトの音声データ のパスを埋め込み、各ユーザの ~/.auconnrc, ~/.wavconnrc には、各自 で録音したパスリストを書く、というのが標準の設定方法でしょう。 4.1.2. auconn, wavconn のコマンドラインオプション ------------------------------------------------- -p[検索パスリスト] : 音声データ検索パスリストの指定 -e[拡張子リスト] : 音声ファイル拡張子のリストの指定 -f[設定ファイル名] : 設定ファイルの指定 -l : 音声ファイルのリストのみ表示 -q : quiet モード 最初の 3 つは 4.1.1. でも説明しました。 -l は、音声データの連結は行わずに、指定した音声ファイルの、実際に 見つかったパスを表示します。設定ファイルのデバグに使えます。 -q は、auconn, wavconn のエラー表示を抑制します。 4.2. 音声データ作成ツール (auconst, aucut, ausubstr) ---------------------------------------------------- 音声データを自分で作るためのツールを少し用意しました。ただ、 auconst 以外はまだまともに使えるレベルではありませんので、簡単な 紹介だけにしておきます。 なお、これらのコマンドは、AU ファイル用のものですので、インストー ル時に make install-wav した場合はインストールされません。 また、yomi の配布に含まれている音声データは、UNIX でマイク録音し たデータを、UNIX 上の GUI の音声編集エディタを使用して、前後の不 要な空白部分を取り除いたもので、aucut や ausubstr を使ってはいま せん。 UNIX で動作する GUI の音声編集エディタには、Solaris では、 OpenWindows の audiotool, /usr/demo/SOUND の soundtool, HP-UX で は /usr/audio にある audio_editor などがあります (私はほとんどこ れを使いました)。フリーのものとしては、xwave や、NAS に含まれる auedit などがありますが、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" ==> "はっせん" (八が促音に変化) はそれ専用の音声データを用意し、さらに、「じゅう」「ひゃく」「せ ん」も専用の音声データを使用します。これにより、数字は割と高速に 読めます (注: version 0.6.2 より、数字用の音素を使用せず、数字を全部 ひらがなに直して実行することも可能になりました)。 記号は、本来時と場合により読みが変わるのが自然なのですが、ここで はその処理はしておらず、記号に固定されたひらがな文字列を割り当て ていて、そのひらがな文字列を読ませています。それは yomi の中の %Char = ( '[', 'だいかっこ', ']', 'だいかっことじる', '(', 'しょうかっこ', ')', 'しょうかっことじる', '{', 'ちゅうかっこ', '}', 'ちゅうかっことじる', '@', 'あっとまーく', '&', 'あんぱーさんど', ... の連想配列の中で行っているので、この文字列を変えれば固定の読みは 変えることができます。ただし、アルファベットは別で、アルファベッ トはそれらに対する専用の音声データを持っていてそれを使用します。 ひらがなにするとそれらしく聞こえない、ということと、高速化のため にそうしています (注: version 0.6.2 より、アルファベット用の音素 を使用せず、アルファベットを全部ひらがなに直して実行することも可 能になりました)。 なお、アルファベットの 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) 数字 (ベタ読みの場合は連想配列 %NumBeta{} を使用) 読み|file 読み |file 読み |file 読み |file ----+---- ------+---- ------+---- ----------+---- ぜろ|0 ご |5 じゅう|10 さんびゃく|300 いち|1 ろく |6 ひゃく|100 ろっぴゃく|600 に |2 なな |7 せん |1000 はっぴゃく|800 さん|3 はち |8 さんぜん |3000 よん|4 きゅう|9 はっせん |8000 (3) アルファベット (ベタ読みの場合は連想配列 %AlphaBeta{} を使用) ファイル名は 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. その他 --------- (10/07 2000: yomi Ver.0.6.2) 下に書いた、AIFF から AU の変換時の音質の劣化は、sox のバージョン を 12.12 から 12.16 に上げたら解消されそうであることがわかりまし た。いくつかのファイルには新たにノイズが発生するようですが、これ で、小さい AU ファイルの形式で、「こえうぇぶ」の音素を使用する見 通しが立ちました。 (10/01 2000: yomi Ver.0.6) 下に書いてある「こえうぇぶ」などのファイルなどを利用するために、 WAV ファイルのサポートを開始しました (yomi-wav, wavconn)。現在用 意しているのは、まだ品質の悪い AU ファイルを WAV ファイルに変換し ただけのものです。「こえうぇぶ」のファイルも、前後の空白の処理な どの編集をして yomi-wav で使用できるようにしたいと思います。 (09/28 2000: yomi Ver.0.5.1) フリーで公開されている音素として、 「こえうぇぶ」 http://reisiu.iamas.ac.jp/ のものがあります。ここには AIFF (16-bit linear 48kHz) の 50 音等 の色んな音階の音素が置いてあります。これを利用させてもらおうと思 ったのですが、sox で AU (8bit μ-Law 8kHz) に変換したら音質の劣化 がひどくて、このままではやや使いづらいことが分かりました。 よって、これを使うには、例えば WAV などの AU 以外の音声データのサ ポートが必要になりそうです。auconn に対応する wavconn のようなも のを作ればいいのでしょうが、WAV は AU に対してかなりフォーマット が複雑ですし、WAV にするにしてもサンプリングレートをあまり下げれ ないので音声ファイル自身がかなりでかいものになりそうですので、ち ょっと躊躇しています。 もし、他に yomi 用に音素を作成された方、あるいは修正等された方が おられましたら、是非こちらへご連絡ください。そしてできれば公開さ せて頂ければ、と思います。 また、現在、yomi Home page http://takeno.iee.niit.ac.jp/~shige/unix/yomi/yomi.html で、yomi の音声サンプルを紹介していますが、それを聞けば分かります が、「は」や「へ」を「わ」や「え」に変換することは現在の yomi は やっていません。完全に対処することは難しそうですが、テスト的にこ れもそのうち試してみたいと考えています。 (09/03 2000: yomi Ver.0.5) まだまだ、やらなければいけないことは山程あります。しかしいずれも いつになったらできるのかわかりません。卒研の学生に手伝ってもらっ たり、卒研で考えてもらったりしながら少しずつ前に進んで行こうと思 っています。とりあえずやらないといけないのは、 1) オンラインマニュアル (roff の勉強をしないといけない ?) 2) 各コマンドのバグ取り (まだかなりあると思う) 3) 音声ファイル作成ツールの改良 (全然使えない) 4) 音声データの改良 (ひどすぎる (^^;) などがあります。 実は、規則音声合成にはあまり興味や関心を持っていません。それを yomi に組み合わせられればいいのでしょうが、それよりも、このような 低機能なツールで何ができるか、どんなところに役立つか、という可能 性の方に興味があります。 例えば、音声データを一音一音用意しているという形態は、速度や規則 音声合成へ発展させるには不利かも知れませんが、ユーザが用意に音声 データを作り直せる、という有利な面もあるでしょう。perl で書いてい るのも同様の意味があります。C で書き直すことは、今のところあまり 考えていません (一番最初の yomi は AWK 版でした)。 よって、現在は yomi 自身の積極的な改良より、その周辺ツールや、こ れらを使った別なツールに関心を寄せていて、それらをまた学生の卒研 のテーマとして使うことなどを考えています。 私自身、このような低機能のツールを作った動機は、学生のテストの成 績の読み合わせ作業に使いたかったからです。パソコンの UNIX をわざ わざ shutdown して MS-DOS で VC2 を使う、ということをやるのが面倒 だったので作ったのですが、現在は、yomi を出席のデータ入力の時や、 パソコン内のデータの紙への転写の際に利用し、作業の量の軽減に役立 てています。 UNIX という、テキスト処理やツールの組み合わせを得意とする環境では、 まだまだ色々な可能性があると思っています。また、CUI での音声デー タの作成ツールがあれば、視覚障害者にも使えるツールになる可能性も あるのではないかと期待しています。 7. バグリポート、ライセンス --------------------------- このツール群は無保証です。しかし色々な不具合は、対応できるものは 行う予定ですので、不具合の報告、意見などは歓迎します。報告等は下 記メールアドレスへお願い致します。また、バグリポート等、各種情報 は、順次下記 yomi の Home page に掲載する予定です。 e-mail: shige@iee.niit.ac.jp Home page: http://takeno.iee.niit.ac.jp/~shige/unix/yomi/yomi.html また、このソフトはフリーソフトとして公開します。再配布、改良は可 能です。GPL に準じたライセンスとしたいと思いますが、まだそこまで は考えていません。 なお、この中に含まれる g711.c は、Sun Microsystems, Inc. の、改変、 再配布が可能なコードです。このファイルに関しては、ライセンスは、 そのファイルの最初のコメント部分に記載されている事項に従います。 8. 謝辞 ------- このツールの改良に関して、研究室の 1999 年度の卒研生 佐藤健美君に 色々調査、考察をして頂きました。どうもありがとうございました。 彼には、yomi 用の kakasi パッチを作成してもらったのですが、実はま だ現在の yomi はそれに対応していません。どうもすみません。次期バ ージョンでの対応を考えています。 「こえうぇぶ」 http://reisiu.iamas.ac.jp/ を作成しておられるれいしうさんには、yomi への音素の使用を快く了承 して頂いたばかりでなく、yomi には不足となる音素ファイルの作成のご 協力まで申し出て頂きました。上に述べたように、実際に使えるように なるのはいつになるか分かりませんが、本当にどうもありがとうござい ました。 長野大介さんには、Linux で yomi を使用する場合の問題点、バグリポ ート、修正点、技術情報など、大変多くのことを教えて頂きました。本 当にどうもありがとうございました。長野さん自身、yomi とは別のコン セプトのテキストファイルの読み上げソフトを作成しておられます。こ ちらもお楽しみください。 「雀」 http://member.nifty.ne.jp/Breeze/linux/bin/suzume-20000915.tar.gz 「PC てぱてぱ日記」 http://member.nifty.ne.jp/Breeze/linux/diary/index.html 9. 変更履歴 ----------- Version 0.5 以降に関しては、ChangeLog ファイルをご覧ください。 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 の作成。 10. 目次 -------- 1. introduction 1.1. 概要 2. install 2.1. FreeBSD の場合の簡単な説明 2.2. 動作環境 2.3. Makefile の修正 2.4. コンパイルとインストール 2.5. 設定 3. 使用法 3.1. 基本的な利用法 3.2. オプションの詳細 3.3. オプションの複雑な使用例 4. 各コマンドの詳細 4.1. 音声データ連結ツール (auconn, wavconn) 4.1.1. auconn, wavconn の設定ファイル 4.1.2. auconn, wavconn のコマンドラインオプション 4.2. 音声データ作成ツール (auconst, aucut, ausubstr) 4.2.1. auconst 4.2.2. aucut 4.2.3. ausubstr 4.3. スクリプトの less (shless) 5. 技術情報 5.1. 動作の流れ 5.2. 音声ファイルへの割り当て処理 5.3. 音声データ表 6. その他 7. バグリポート、ライセンス 8. 謝辞 9. 変更履歴 10. 目次 +=================================================+ 竹野茂治 〒945-1195 新潟工科大学 情報電子工学科 shige@iee.niit.ac.jp TEL(&FAX): 0257-22-8161 +=================================================+