2010年03月06日

さらにUnidicを使って、日本語にアクセントをつけてみる

MBROLAについてのエントリーを書こうと思っていたのですが、Unidicを使ったらどうなるだろうかと好奇心が沸いてしまって、前回作った mmtts.py を修正して使えるようにしてみました。

Unidic というのは、ChaSen や MeCab で使える 形態素解析辞書です。無料でダウンロードして使えるのですが、再配布は不可です。
http://www.tokuteicorpus.jp/dist/

Unidicは、国立国語研究所で規定した「短単位」という揺れがない斉一な単位で設計されているという特徴を持ちますが、今回興味を持ったのはアクセントや音変化の情報が付加されていることです。この情報はGalateaTalkでも利用されているようです。そういうことを知ると、前回作った棒読みスクリプトでもこれが利用できないかと思い、勢いでやってみました。


ダウンロード:
mmtts092.zip


これ単体では動きませんので、前回の記事に書いてあるように、必要なファイルをダウンロードして、手順通りインストールしてください。

内部的には大幅に書き換えていますが、使用する分にはほとんど変わりなく使えると思います。コマンドラインスイッチを増やしたので、--helpで確認してみてください。以前は'-'のみで標準入力指定をしていましたが、それができなくなったので、'-i'スイッチで指定するように変えました。変更点はそのくらいです。


さて、この新しいスクリプトで Unidic を使う方法ですが、やはりMeCab用のUnidicを持ってこないといけません。

まず、次のページに行きます。
形態素解析辞書 UniDic

そして、ダウンロードページに進みます。アカウントを未登録の場合は、「ダウンロード 未登録の方」リンクを選んで、アカウントを作ってから先に進みます。
ダウンロードページのルートから、「1.3.12個別ファイル」、「unidic-mecab」の順にリンクを選んでいくと、文字コード別のファイルが置いてあるので、今回必要なsjis用の「unidic-mecab1312_sjis.zip」をクリックしてダウンロードします。
※ 1.3.12は現時点での最新版のバージョンです。

ダウンロードしたファイルを展開し、展開してできたフォルダの名前を unidicと名前を変えて、mecab の dicフォルダにコピーします。標準的なインストールの場合、MeCabの辞書フォルダは"C:\Program Files\MeCab\dic"になります。ここには既に標準辞書の ipadic のフォルダがあるはずです。

なお、UnidicのダウンロードページにはWindows用パッケージ(フルセット)版も配布されていて、こちらだとChaSen用、MeCab用と必要なファイル全てを簡単にインストールできるのですが、残念なことに文字コードがUTF-8にエンコードされています。今回使用するシフトJISではないので、これでは使えません。また現時点ではこのパッケージはWindows7に対応していません。

mmtts.py の標準設定では unidic があればそれを優先して、そのアクセント情報を使うようにしています。時々は使いたいけれど、unidic を標準で使いたくないときは、42行目付近を default_dic = 0 に書き換えてください。

以上の設定をすると、mmtts.py で抑揚のある日本語を発音してくれます。ただし現在、単語のアクセントとそれに続く助詞のアクセント、そして「?」の直前の語尾上げしか設定していませんので、不完全なアクセントの日本語になってしまっています。Unidicには複合語になったときのアクセントなどの情報もあるようですが、今回は面倒だったのでは使いませんでした。このスクリプトの日本語はまだまだ改善していけると思います。

音素データのパラメータを今回新たに見直したので、棒読みをさせた場合においても以前のバージョンと印象の違う発声になっていると思います。


posted by takayan at 03:41 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする

2010年03月08日

そして、Ubuntuに対応してみた。

今までは Windows上でしか動かなかったのですが、LinuxのUbuntuでも動くようにしてみました。

自己責任でご利用ください。
ダウンロード:mmtts093.zip

もともと、参考にした muDaTTS.rb は Linux向けのものだったわけですし、mbrolaはLinuxで使うほうがWindowsよりも使いやすくできていて、意外に簡単にできました。Windowsでもmbrplay.dllが Python からまともに使えれば非同期再生などといったさらに高度な使い方もできるのですが、mbrolaのソフトのメンテナンスが止まっていて、ちょっと残念です。

今回、文字コード関連の修正も加えました。今までこのスクリプトで使う場合、MeCab辞書の文字コードはシフトJIS固定でしたけれど、スクリプトを一箇所修正することでMeCabの文字コードを任意で選べるようにしました。WindowsのMeCabパッケージはインストール時に辞書の文字コードを選ぶようになっています。このとき文字コードとして、シフトJIS、UTF-8、EUC-JP、UTF-16が選べますが、この中のシフトJIS、UTF-8、EUC-JPを選んでも、このmmttsスクリプトでMeCab辞書を使えるようにしました。具体的にはWindowsの場合は31行あたりの mecab_charset への代入文でその文字コードを示す文字列を代入します。Ubuntuの場合は、44行あたりです。
通常の入出力の文字コード、作られるテキストファイルの文字コードも変数 system_charset、text_charset で設定できるようにしてますので、必要に応じて書き換えます。


さて、Ubuntuで使うための準備です。Ubuntuで使う場合も Windowsと同じようにいろいろなパッケージを用意しなくてはいけません。

apt-getやSynaptic などのパッケージ管理ソフトを使って、MBROLA、mecab、mecab-ipadic のパッケージをインストールします。このときインストールされるMeCab辞書はeuc-jp文字コードのものです。UTF-8版辞書が欲しいときはそのパッケージも探してインストールしておきます。また、あとでMeCabのPythonバインディングパッケージをインストールするのですが、そのとき mecab のヘッダファイルが必要になるので、この段階で libmecab-dev もインストールしておきます。

sudo apt-get install MBROLA
sudo apt-get install mecab
sudo apt-get install mecab-ipadic
sudo apt-get install libmecab-dev

次に、MeCabをPythonから使うためのバインディング mecab-python のファイルをMeCabサイトからダウンロードします。
Browse MeCab Files on SourceForge.net

現在の Ubuntuでインストールされるmecabパッケージのバージョンは0.97なので、mecab-python-0.97.tar.gz をダウンロードして、

tar xvfz mecab-python-0.97.tar.gz
cd mecab-python-0.97
sudo python setup.py install
と打ち込みます。
これでLinuxのPythonでも MeCabが使えるようになります。

MBROLAサイトに行って、日本語の音素データベースJP2をダウンロードします。展開し、中に入っているJP2ファイルをmmtts.pyと同じフォルダに置きます。
これで mmtts.py も使えるようになります。

パッケージからMeCabおよびMeCab辞書をインストールした場合、辞書の場所は /var/lib/mecab/dic/ になります。mmtts.pyではこのパスを記入しています。
MeCabおよびMeCab辞書はソースから最新版をインストールすることもできますが、その場合は辞書のインストール先を configure で --with-dicdir=/var/lib/mecab/dic/ipadic-utf8 などとしてUbuntuパッケージ版でインストールされる場所と同じ /var/lib/mecab/dic/*** に合わせるか、デフォルトでインストールされた場所を、mmtts.py の該当行に書き込むなりしなくては、mmtts.py スクリプトは正しく動きません。

ipadic辞書ではアクセント情報がありませんので、せっかくなので Unidic もインストールします。
Unidic サイトに行き、ログインします。アカウントがなければ作ります。
そして、ダウンロードページに入り、個別ファイルのところから unidic-mecab1312_eucj.tar.gz か unidic-mecab1312_utf8.tar.gz をダウンロードします。どちらでもいいですが、先に入れた ipadic と同じ文字コードのほうをインストールします。両方入れてもかまいませんが、euc-jp版のフォルダはunidic、utf8版のフォルダはunidic-utf8という名前にします。
ダウンロードしたら、
tar xvfz unidic-mecab1312_eucj.tar.gz
sudo cp -r unidic-mecab1312_eucj/ /var/lib/mecab/dic/unidic
もしくは
tar xvfz unidic-mecab1312_utf8.tar.gz
sudo cp -r unidic-mecab1312_eucj/ /var/lib/mecab/dic/unidic-utf8
で、MeCabの辞書フォルダにコピーします。MeCabの辞書フォルダが上記と違う場合は、適宜書き換えます。バージョンが進んでいる場合も適宜書き換えます。

Linux用のUnidicパッケージも置いてあるので、それをインストールした場合は、mmtts.py内の辞書のパスの記述を書き換える必要があります。MeCab用Unidicにはソース版も置いてありますが、文字コードをeuc-jpに指定してビルドしようとするとiconv変換エラーが大量に出ました。対処の仕方が分からなかったので、mmtts.pyを書き換えないで済む上記の変換済みの個別ファイルの方が無難だと思います。

必要なファイルのインストールが完了したら、コンソールから、
python mmtts.py -t utf8 -f mmtts.txt
なんて打ち込んで、動作を確認します。


今回は 日ごろ僕が使っているUbuntuだけに対応しましたが、MeCab辞書のインストール先とそのシステムの入出力用の文字コードを設定すれば、他のOSでも使えるのではないかと思います。

まだいろいろ問題あると思いますし、機能不足ですが、これでlinuxで日本語をしゃべらせる選択肢が増えたと思います。


posted by takayan at 03:03 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする

2010年03月09日

最終的に mbrola.exe を使うことにする

MBROLAサイトではWindows用のMBROLAバイナリとして、MBROLA toolsというパッケージが公開されています。
Mbrola Tools

このパッケージを実行すると、いくつものファイルがインストールされます。
C:\Program Files\Mbrola Tools には ツールやドキュメント、インターフェイスソースコード、そしてサンプルコードが入ります。また C:\Windows\System32 には mbrola.dll、mbrplay.dll の2つのDLLがコピーされます。

WindowsでのMBROLAのプログラミングをする場合は、英語で書かれたドキュメントをよく読み、サンプルコードを参考にしながらDLLを操作するプログラムを書くことになります。前回までmmtts.pyに同梱していた pho2wav.pyd も mbrola.dll を使って wavファイルを生成するプログラムでした。

この pho2wav.pyd を作るにあたってはいろいろ紆余曲折があります。もう一つのDLLである mbrplay.dll には、MBR_Play、MBR_Stop、MBR_WaitForEnd、MBR_IsPlaying といった便利な関数が定義されています。一般的なTTSを使ったプログラムを書いたことがある人ならば、この関数名を見ただけでわかるでしょう。もちろん、MBR_Play 関数には、非同期再生やコールバック関数の登録機能もあります。これらの機能を使えば簡単に音声合成アプリを作ることができるはずです。本当はこちらのDLLを使うためにpydファイルを作ろうとしました。しかし、これがどうやっても Python2.6 で使えるようにはなりませんでした。VC++2008でコンパイルして実行するとレジストリエラーが出てしまいます。VC++6 だとなんとかうまくコンパイルでき、単体で動かすことができるのですが、それをPythonから呼び出す段になると、やっぱりレジストリエラーが出てしまいます。それで困り果てて、結局諦めて、mbrola.dll を使うプログラムを書くことにしました。こちらを使ったプログラムだとなんとかPythonと組み合わせても動きます。しかし完全ではありません。長文を読ませると、音声にノイズが出てきて、意味不明の音素の組み合わせを読み込んで、エラーで停止してしまいます。 そのため pho2wav.pydの内部では文章を短く区切って対処していました。とりあえずそうやって音素のスクリプトから安定して音声ファイルを作れるようになりました。

ところが、FreeTTSでMBROLAを使う資料を読んでいると、次のやり取りを見つけました。
http://sourceforge.net/projects/freetts/forums/forum/137669/topic/1219083

なーんだ。DOS版が使えたのか。それも linuxのコマンドラインスイッチと同じものが使える。

そういうわけで、pho2wav.pyd を組み込むのは廃止です。代わりに、mbrola.exe を使います。pydファイルの作り方を覚えたので全てが無駄ではありませんでしたが、このpydを作るための悪戦苦闘は何だったのだろう。


mbrola.exeは、MBROLAサイトのダウンロードページにある PC/DOSリンクでダウンロードします。ダウンロードされる mbr301d.zip を展開し、中にある mbrola.exe をmmtts.pyと同じ場所に置くか、パスの通った場所におけば使えます。

mbrola.exe 利用版 mmtts.py
ダウンロード:mmtts094.zip


いろいろ書いてきましたが、MBROLAについてはこの辺で終わりにして、今後はしばらく、できるかどうかわかりませんが、 open jtalkを使って Linux 上の Fire Voxでも日本語がしゃべれるようにすることに時間を割きたいと思っています。


posted by takayan at 03:25 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする

2010年03月25日

日本語音声合成 Python パッケージ mbtts

前回でやめるつもりでいたんですが、MBROLA関連の続きです。
前回のものを大幅に拡張して作った、Windows、Ubuntu、MacOSX で使える音声合成処理のPythonパッケージです。
これ単体では動きませんが、無料で配布されているファイルを持ってくると、日本語の文字列を音声に変換してくれます。

興味のある方は、無保証ですが使ってみてください。

ダウンロード:
mbtts-0.95.zip

主な変更点ですが、

せっかくなので、jp2だけでなく、MBROLAの jp1,jp3の音声も使えるようにしました。

プログラムが長くなりすぎたため、ファイルを分割せざるを得なくなってしまったのですが、それを扱いやすくするために、パッケージにしてみました。Windows用のインストーラや、setup.py でPythonにインストールします。

非同期発声はどうしても実現したくて、でも、自分で作るのは面倒だったので、既存のpygameパッケージを使ってできるようにしてみました。

そして、MeCabバインディングのパッケージを別に作るのもあれなので、バインディング用のスクリプトも取り込みました。

それから、最初に書きましたが、LinuxでできるのならばOSXでもできるだろうということで、MacOSX対応にしました。pygameに依存したおかげで、それさえ入れられれば、あとは簡単に実現しました。

インストールの仕方とか、詳しくは、ダウンロードしたファイルを展開して出てくる mbtts.txt というファイルに全部書いていますので、それを読んでみてください。必要な外部ファイルがいろいろありますが、そのこともmbtts.txtに書いてあります。

基本的な使い方は、
>>> import mbtts
>>> tts = mbtts.create()
>>> tts.speak(u'あらゆる現実を、全て自分の方へ捻じ曲げたのだ。')
てな感じになります。

残念ながら、Unidicを使った日本語のアクセントやイントネーションの処理に関しては、間違いを修正したくらいでほとんど進歩はありません。

AquesTalkを組み込んだり、OpenJtalkを組み込んだりすることは、割と簡単にできるのではないかと思います。

最後に、先日、mmttsと名づけてみたのですが、mm というのは音声読み上げ対応ソフトで有名なmiyamiyaさんの一連のシリーズと語呂が同じになってしまうので、止めにします。mbtts にすることにします。


posted by takayan at 05:18 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする

2010年03月27日

ネット上の情報を音声で保存するサンプル

そういうわけで、それなりのパッケージが出来上がりました。
まだまだ改良の余地はあります。アルファベットの羅列でローマ字読みができるものは、仮名に変換して読ませたほうがいいことに今更気付いたりしています(次回更新時に実装します)。

このパッケージの問題として、py2exeで実行ファイルが作れないということがあります。これはかなり大きな問題だと思います。つまり、利用するときスクリプトの実行できる環境を自力で構築しなければならないという高いハードルが付きまといます。また、なんとか実行ファイルが作れたとしてもpygameを使っているのでMixer以外の使いもしない様々なファイルが組み込まれてしまいます。これは、非同期再生をもっと軽い方法で解決すればいいのですが。当分無理そうです。


さて、下のプログラムは、ホームページ上の情報を音声ファイルに変換するサンプルです。pyファイルとして保存し使います。

アサヒ・コムの天声人語を早口で録音します。視覚障害者の方は新聞の記事を手軽に読みたいという要望をよく聞くので、ためしに作ってみました。XMLできちんと整理されている情報だともっと簡単なのでしょうが、HTMLの特定部分を探し出し抽出しています。なお、このスクリプトによって生成される音声ファイルはアサヒ・コムの著作物の複製に当たると思われますので、私的使用のみに限って利用してください。

#!/usr/bin/env python
#-*-coding:utf8-*-
import urllib2
import re
import os
import sys
import mbtts
tts=mbtts.create()
tts.set_rate(1.5)
lines=[]
t=urllib2.urlopen('http://www.asahi.com/paper/column.html')
txt=t.read()
txt=unicode(txt,'eucjp')
r=re.compile(u'<strong>(.*?)</strong>')
d=r.search(txt).group(1)
name=d
lines.append(d)
r=re.compile(u'<div class="Utility mb0"><p>(.*?)付</p>')
d=r.search(txt).group(1)
name=name+u' '+d
if os.path.exists(name+u'.wav'):
 tts.speak(name+u'のファイルは既に存在するので作成は行いません。')
else:
 lines.append(d)
 r=re.compile(u'<p>\n(.*?)\n</p>')
 d=r.search(txt).group(1)
 d=re.sub(u'▼',u'。\n',d,0)
 lines.append(d)
 tts.speak_lines_to_file(lines,name+u'.wav')
 tts.speak(name+u'のファイルができました。')

こんな感じでいろいろ使えます。今回のパッケージを使いこなすにはPythonでプログラミングができないといけませんが、とても使いやすい言語なのでおすすめです。

動くように作った自分で言うのもなんですが、これがWindows7でも、MacOSXでも、Ubuntuでも動くというのは、やっぱり面白いですね。
今更ですが、素晴らしい技術やファイルを公開してくださっている Python,pygame,SDL,MBROLA,MeCab、そしてmuDaTTS.rbの開発者の方々に感謝します。


posted by takayan at 01:26 | Comment(2) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。