Ubuntu Weekly Recipe

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

この記事を読むのに必要な時間:およそ 6 分

mbrola用ファイルのダンプ

コマンドライン引数を与えてスクリプトを実行すると,mbrolaに与えるファイルの内容をダンプしてから発声します。引数は何であっても構いません。

$ python2 ./mecabrola.py dump
何を喋りたい?: 河童の川流れ
k      75      0      205
a      75      0      205
Qp     150     0      190
a      75      0      190
n      75      0      205
o      75      0      205
k      75      0      205
a      75      0      205
w      75      0      205
a      75      0      205
n      75      0      205
a      75      0      205
g      75      0      205
a      75      0      205
rr     75      0      220
e      75      0      220
_      90      

再生中 Sparc オーディオ 'stdin' : Signed 16 bit Big Endian, レート 22050 Hz, モノラル

ファイルにコピーし手動でmbrolaに読み込ませるという用途に使えると思います。

jp1/jp3の制約

jp1とjp3は作成者が同じ人物ということもあり,含んでいるデータセットで対応可能な音素セットはほぼ同じです。この2つのデータベースの持つ制限として,促音が関係するデータが欠けていることが挙げられます。これにより,例えば「骨子」「ヘッダ⁠⁠,⁠ぼっち」といった語が,そのままでは発音できません。

対してjp2はjp1/jp3の倍以上のデータを含んでおり,促音が関係するデータも充実しています。しかしjp1/jp3とは異なる音素セットとなっており,互換性はありません。

どちらを選ぶか悩みましたが,今回は男声と女声が発音可能なように,jp1とjp3データベースを選択しました。欠けているデータへの対応ですが,本来促音が発音するはずだった時間が無音となるように処理することで,それっぽく聞こえるようにしました。

$ python2 ./mecabrola.py dump
何を喋りたい?: 一人ぼっちは寂しいもんな。
h      75      0      205
i      75      0      205
t      75      0      205
o      75      0      205
rr     75      0      205
i      75      0      205
b      75      0      205
o      75      0      205
_      75      0      205
_      75      0      205
tS     75      0      190
i      75      0      190
w      75      0      205
a      75      0      205
s      75      0      205
a      75      0      205
b      75      0      205
i      75      0      205
S      75      0      205
i      75      0      205
i      150     0      190
m      75      0      205
o      75      0      205
N      150     0      190
n      75      0      205
a      75      0      205
_      150     0      205
_      90      

再生中 Sparc オーディオ 'stdin' : Signed 16 bit Big Endian, レート 22050 Hz, モノラル

なおmbrolaは,音素リスト内に合成できない組み合わせを見つけると音声合成を中止し,その時点でエラーを出力します。スクリプトはこのエラーをそのまま表示します。ダンプ出力と組み合わせて,スクリプトの改良に役立ててください。次の例では,⁠_-Qt」に対応するデータがないため,エラーとなっています。

$ python2 ./mecabrola.py a
何を喋りたい?: 「一般的な文系」って・・・。
i      150     0      205
Qp     150     0      205
a      75      0      205
N      150     0      190
t      75      0      205
e      75      0      205
k      75      0      190
i      75      0      190
n      75      0      205
a      75      0      205
b      75      0      205
u      75      0      205
N      150     0      205
k      75      0      205
e      75      0      205
i      150     0      190
_      150     0      205
Qt     150     0      205
e      75      0      205
_      37      0      205
_      37      0      205
_      37      0      205
_      37      0      205
_      90      

再生中 Sparc オーディオ 'stdin' : Signed 16 bit Big Endian, レート 22050 Hz, モノラル
Fatal error: Unkown recovery for _-Qt segment

オープンソースなテキスト音声合成ソフトウェア

さてmbrolaですが,他のソフトウェアのエンジンとしても使われています。eSpeakは音声合成のバックエンドをmbolaから選択することができます。gespeakはeSpeakのGUIフロントエンドです。festivalもmbrolaをバックエンドの一つとして使うことができます。

eSpeakとFestivalはspeech-dispatcherというスピーチシンセサイザーフレームワークのエンジンのひとつとなっています。これらはUbuntuのパッケージとしても提供されていますが,mbrolaの日本語データベースのパッケージが提供されておらず,また日本語特有の処理が含まれていないため,日本語のテキストから音声合成することはできません。今回紹介した内容を実装することで,日本語のテキスト音声合成をすることができる可能性があると思います。

また,日本語テキスト音声合成専用のオープンソースなソフトウェアとして,名古屋工業大学のOpen Jtalkがあります。mbrolaとは異なり,テキスト入力から音声合成までを含むシステムです。Ubuntuでは12.04からパッケージが提供されていますので,すぐに試すことができます。


今回のレシピはこれで終わりとなります。実際に音声合成してみると,全体的に抑揚がないことがわかります。試行錯誤してみましたが,同じ品詞の単語は同じピッチになってしまいます。今回利用したソフトウェアだけでは文章構造の情報が足りないからです。テキスト音声合成システムは音声合成だけでは完結せず,音声学や言語学も含めた様々な研究成果から成り立っていることが実感できます。

著者プロフィール

坂本貴史(さかもとたかし)

Ubuntuのマルチメディア編集環境であるUbuntu Studioのユーザ。主にUbuntu日本コミュニティとUbuntu Studioコミュニティで活動。いつかユーザ同士で合作するのが夢。