今回から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の検索結果
データベースのパッケージも提供されていますが、日本語話者の音声は提供されていません。Copying the MBROLA Bin and Databases から、jp1(男声) 、jp2(女声) 、jp3(女声)のデータベースをダウンロードすることができます。
[1] Mbrolaのウェブサイトによると、テキスト音声合成を学ぶ学生に実践の機会を提供することが目的だったようです。入力テキストから音声を合成する処理のことをテキスト音声合成と言いますが、言語処理や信号処理、コンピューター科学の複雑な処理を含んでいます。そのエンジンの開発や改良に関係する敷居を下げたいということのようです。
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つの音素が連続したひとつづきの音」を表し、一番下に発音を表示した。表示は便宜的なものであり厳密なものではない
システムのサウンド出力から「はちのへ(八戸) 」という男声が聞こえたら合成は成功です[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を用いるには、テキストを解析して読みを抽出し、それを音素のリストに変換すればよさそうです。加えてテキストの解析結果を反映してピッチを調整すると、より自然な音声となるでしょう。
[3] ここではシェルの機能を使い、mbrolaの標準出力をパイプでaplayに送っている。aplayはALSAプロジェクトで開発されているサウンドプレイヤーで、「 alsa-utils」パッケージに含まれている。Ubuntuではデフォルトでインストールされている。aplayは引数を与えないとシステムのデフォルトのサウンドカードに出力するが、Ubuntuの標準設定ではこれはPulseAudioとなっている。その結果、他のアプリケーションが音声を出力していてもミックスされてシステム出力となる。
MeCabを使ったテキスト解析
そこで次は、テキストを解析するためにMeCabという日本語形態素解析エンジンを使います。
形態素解析は耳慣れない言葉ですが、簡単に言うと、日本語の文書を単語に分解し、動詞や名詞などの品詞を特定する処理のことです。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を利用してこの一連の流れを自動化し、入力テキストを喋るプログラムを作成してみます。