Ubuntu Weekly Recipe

第250回Ubuntuに日本語を話してもらおう(前編)

今回から2回に渡り、Ubuntuで利用可能ないくつかのソフトウェアを組み合わせて、入力テキストを喋る仕組みを作るレシピをお届けします。Mbrola、MeCabを使って音声を合成し、Linuxのサウンドサブシステムを通じて音声を出力します。

MBROLAプロジェクトとは

MBROLAとは、汎用音声合成エンジン「mbrola」と、mbrolaで利用可能な音声データベースを開発するプロジェクトです[1]⁠。1995年にベルギーのFaculte Polytechnique de Mons大学のTCTS研究室が開始しました。音声合成エンジンもデータベースもバイナリーの形で提供されているためオープンソースソフトウェアではありませんが、フリーなライセンス[2]のもとで利用できます。

DebianやUbuntuではmbrolaのパッケージが提供されています。Ubuntuソフトウェアセンターでmbrolaを検索し、インストールしてください。

図1 UbuntuソフトウェアセンターでのMbrolaの検索結果
図1 UbuntuソフトウェアセンターでのMbrolaの検索結果

データベースのパッケージも提供されていますが、日本語話者の音声は提供されていません。Copying the MBROLA Bin and Databasesから、jp1(男声⁠⁠、jp2(女声⁠⁠、jp3(女声)のデータベースをダウンロードすることができます。

Mbrolaの音声合成の仕組みと使い方

Mbrolaのデータベースは、⁠ふたつの音素が連続したひとつづきの音」をデータとして保持しています。あるテキストを発声させたい場合、テキストに加えて、発音させたい文字列を構成する音素と、いわゆるトーン情報(強弱や長短・イントネーション)を記述してMbrolaに読み込ませます。Mbrolaは音素から「ひと続きの音」をデータベースより取り出し、これにトーン情報を加味して波形を合成して音声を出力します。

なお、あるデータベースに収録されている録音データセットはデータベースごとにまちまちです。あるデータベースを用いて処理できた音素の連なりが、別なデータベースを用いると処理できないことがあります。

説明はここまでにして、実際に音声合成してみましょう。まず、次のコードをテキストに保存します。

h       75      0       250
a       75      0       250
tS      75      0       260
i       75      0       260
n       75      0       300
o       75      0       300
h       75      0       250
e       75      0       250
_       75

Mbrolaのデータベースが必要なので、jp1データベースの圧縮ファイルをどこかに展開しておきます。

次に端末を開きます。音声合成をするには次のコマンドを実行します。今回はテキストファイル名を「./hachinohe.pho⁠⁠、jp1データベースへの相対パスを「./jp1/jp1」としましたが、読者の実行環境に応じて変更してください。

$ mbrola ./jp1/jp1 ./hachinohe.pho -.au | aplay
図2 合成した音声の波形をAudacityで表示した例。上の記号が「音素」を、その下の矢印が「2つの音素が連続したひとつづきの音」を表し、一番下に発音を表示した。表示は便宜的なものであり厳密なものではない
図2 合成した音声の波形をAudacityで表示した例。上の記号が「音素」を、その下の矢印が「2つの音素が連続したひとつづきの音」を表し、一番下に発音を表示した。表示は便宜的なものであり厳密なものではない

システムのサウンド出力から「はちのへ(八戸⁠⁠」という男声が聞こえたら合成は成功です[3]⁠。jp1ではなくjp3を使うと、今度は女声が聞こえると思います。データベースに同梱されているマニュアルを参照すると、jp1とjp3はほぼ同じ音素セットを用いていますが、jp2は異なるものを用いています。この「八戸」の例では問題ありませんが、データベースを変更すると、処理できる音素セットも変わる点に注意してください。

さて、Mbrolaに読み込ませるファイルのフォーマットは次のとおりです。

音素のアルファベット表記    発声の継続時間    ピッチペア

ピッチペアは発声のピッチを変化させるために用います。2つの数字からなり、1つ目で発音の継続時間におけるパーセンテージを、2つ目に周波数を記述します。ピッチペアは複数記述できるため、例えば次のようにするとビブラートのかかったような音声を合成することができます。うまく合成すれば歌唱を再現することもできるでしょう。

rr   150  0  265  50  250
a   3000  0  265   5  250  10  265  15  250  20  265  25  250  30  265
35  250  40  265  45  250  50  265  55  250  60  265  65  250  70  265
75  250  80  265  85  250  90  265  95  250
_     90

ここまでの結果から、テキスト音声合成にmbrolaを用いるには、テキストを解析して読みを抽出し、それを音素のリストに変換すればよさそうです。加えてテキストの解析結果を反映してピッチを調整すると、より自然な音声となるでしょう。

MeCabを使ったテキスト解析

そこで次は、テキストを解析するためにMeCabという日本語形態素解析エンジンを使います。

形態素解析は耳慣れない言葉ですが、簡単に言うと、日本語の文書を単語に分解し、動詞や名詞などの品詞を特定する処理のことです。MeCabはこの形態素解析をするオープンソースソフトウェアであり、単語辞書データベースとテキストを与えることで処理を行います。与える辞書を変更することで様々な用途に使うことが可能な、汎用テキスト処理フレームワークでもあります。

図3 UbuntuソフトウェアセンターでのMeCabの検索結果
図3 UbuntuソフトウェアセンターでのMeCabの検索結果

Ubuntuでは形態素解析のためのMeCab用辞書データベースとして、次の3つが利用できます[4]⁠。

mecab-naist-jdic
奈良先端科学技術大学院大学で開発されている形態素解析システムChaSenに使われている辞書を、MeCab用に調整したもの
mecab-jumandic-utf8
京都大学で開発されている形態素解析ツールJUMANに使われている辞書を、MeCab用に調整したもの
mecab-ipadic-utf8
mecab-naist-jdicの前身

MeCabを使うにはまず、パッケージ「MeCab」をインストールします。次に辞書ですが、今回は「mecab-naist-jdic」をインストールします。そして端末を開き、解析したいテキストを含め、次のように実行します。

$ echo "Ubuntu Magazine vol.10は11月30日(金)発売です。" | mecab
Ubuntu    感動詞,*,*,*,*,*,*
Magazine  感動詞,*,*,*,*,*,*
vol     感動詞,*,*,*,*,*,*
.       記号,句点,*,*,*,*,.,.,.,,
1       名詞,数,*,*,*,*,1,イチ,イチ,,
0       名詞,数,*,*,*,*,0,ゼロ,ゼロ,,
は      助詞,係助詞,*,*,*,*,は,ハ,ワ,,
11月    名詞,副詞可能,*,*,*,*,11月,ジュウイチガツ,ジューイチガツ,,
3       名詞,数,*,*,*,*,3,サン,サン,,
0       名詞,数,*,*,*,*,0,ゼロ,ゼロ,,
日      名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ,,
(      記号,括弧開,*,*,*,*,(,(,(,,
金      名詞,一般,*,*,*,*,金,キン,キン,,
)      記号,括弧閉,*,*,*,*,),),),,
発売    名詞,サ変接続,*,*,*,*,発売,ハツバイ,ハツバイ,,
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス,,
。      記号,句点,*,*,*,*,。,。,。,,
EOS

形態素解析され、品詞が特定されていることがわかります。デフォルトでは辞書にない単語は「感動詞」となるため、上記の場合にはUbuntu、Magazine、Volが残念ながら辞書にないことがわかります。MeCabはユーザー辞書という機能を持つため、ユーザーが独自の辞書を作成して単語を登録することで、よりよい形態素解析ができます。

音素リストへの変換については後編で!

mecab-naist-jdicによってもたらされる読みは片仮名となっており、これをMbrolaの音素リストに変換できれば、今回の目的であるテキスト音声合成器が完成します。さらに、ここには表示されていないMeCabの解析結果も含めてピッチに反映すれば、より自然な音声を目指すことができます。

そこで来週のレシピでは、Pythonを利用してこの一連の流れを自動化し、入力テキストを喋るプログラムを作成してみます。

おすすめ記事

記事・ニュース一覧