2007年11月30日

オープンソースのスクリーンリーダNVDA

2011.12.1 この記事は古い情報です。
現在、NVDAにはJTalkが内蔵されているので、SAPI5、SAPI4対応の日本語音声合成エンジンを用意しなくても日本語を発声できます。
また、無償で配布されている Microsoft Server Speecht の音声にも対応しています。
詳しくは、下記の関連リンクでご確認ください。
追記終わり



いろいろ調べていると(記事末のリンク参照)、NVDAというオープンソースのスクリーンリーダがあることが分かった。今年、日本語化のプロジェクトも立ち上がったようで、とても楽しみにしている。

無料というところがとても魅力的。NVDAJpで配布されている日本語ファイルを使えば、日本語での利用もできる。

現在利用中の僕のノートパソコンだと処理のパワー不足でちょっと苦しいのでマウスでの操作は諦めないといけなくなるけど、OSの操作だけでなく、ワード、IE、Firefoxなどに対してもかなり高度なこともできるようだ。こういうのがオープンソースで開発されているのはとても頼もしい。開発言語がPythonなので、僕もPyhtonは分かるから何か手伝えるかもしれない。

eSpeakというフリーの多言語対応音声合成が最初から組み込まれているので対応言語圏の人ならば無料で自分のパソコンを音声パソコンかできる(残念ながら、eSpeakは日本語には対応していないらしい)。NVDAにはCDやUSBメモリ用のポータブル版もあるので、eSpeakの言葉が分かる人ならば、どのWindowsXP/VISTAでも簡単に音声パソコンにすることができる。とても素晴らしい!


日本語で使うためには、日本語のSAPI5かSAPI4を入れていなくてはいけないが、入れてあれば、上記日本語化サイトの手順「NVDAを日本語メッセージで実行する方法」に従って設定を変更し、その変更を保存すれば、日本語スクリーンリーダとして使えるようになる。

インストーラでのインストールが完了すれば、以後CTRL+ALT+NキーでいつでもピロロロンとNVDAが起動できるようになる。設定はINS+Nキーで表示されるウィンドウを使っておこなう。終了するときは、INS+Qキー。またINS+1キーでキーボードヘルプモードに切り替えられるので、このモードに入ってショートカットキーの確認をおこなえば、迷ったときはとても便利だろう。通常の状態に戻すにはもう一度INS+1キーを使えばいい。

このソフトは上記のようにINSキーとの同時押しを多用するが、テンキーにもとても便利な機能を割り当てられている。テンキーの下段123が文字読み、中段456が単語読み、上段789が行読みとなっている。そしてそれぞれの左側147が前、中央258が現在、右側369が次を読んでくれる。さらに上段と下段の右端と左端では、シフトキーは言うなれば「最も」という修飾子になっていて、SHIFTとそのテンキーを同時に押すことで行頭や最下行に移動させることができる。

このような基本的な操作は、NVDAのインターフェイスウィンドウに表示されているクイック・スタート・ドキュメントに書かれている。

残念なことにこれは日本語化されない。一番大切なところなのにと、書き換えられるなら書き換えようかとソースを調べてみたら、翻訳はちゃんとおこなわれていた。日本語化とは関係ないプログラムの方に問題があって表示されていないようだ。もしかすると表示されないのは、僕の設定の仕方がおかしいからなのかもしれない。
上の打ち消し部分の理由は僕が本家のリリース版に日本語文字列ファイルを入れたからだった。日本語化プロジェクトで公開されている開発版をそのまま利用すればよかった。またもう一つの方法として「NVDAを日本語メッセージで実行する方法」で示されているように、本家の開発版のインストーラかZIPを持ってきてインストールし、それに日本語文字列ファイルを入れればうまくいった。

とにかく、これは楽しみなプロジェクトだ。本家も日本語化プロジェクトも。無料だからと言って、ある程度サポートのしっかりした数万円もする有料のスクリーンリーダにすぐにでも取って代わるのは難しいだろうが、こういう公開された技術が世界中で広まっていることはとてもすばらしいことだと思う。


関連リンク


NVDA - Home 本家サイト
NVDAJp 日本語化プロジェクトページ
NonVisual Desktop Access - en.Wikipedia

今年2007年の2月にこのNVDAを解説した記事
オープンソースのスクリーン・リーダーNonVisual Desktop Access (NVDA) - アクセシビリティBlog

NVDA日本語化プロジェクトを紹介した記事
オープンソースのスクリーンリーダーNVDA - おさんぽさんぽ
Fw: NVDA日本語化プロジェクト - 覚え書き@kazuhi_to


まほろば NVDA関連ページリスト


2011.12.1 リンク先が変わっていたので修正しました。情報が充実している「まほろば」さんのサイトのリンクを追加しました。


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

2007年12月07日

日本語を音素に分解してくれるPythonスクリプト

NVDA JPを触っていたら、付属の音声合成eSpeakに日本語がないのはとても残念だと思った。NVDAのポータブル版にそれが入っていれば、USBメモリを差せばどのWindowsXPも、音声パソコンにすることができるから。そういうわけで、いろいろ調べてみた。結局まだできないのだけど、ちょっと面白いものができたので、公開してみることにする。

eSpeakを調べていると、MBROLAという音声合成のプロジェクトを見つけた。世界中の音声が用意されていて、これで使える日本語音声も三種類公開されている。MBROLAのプログラムに音素で表記された文章を与えると、それを音声として読み上げてくれる。これはとても面白い。ということで、漢字仮名交じりの日本語をこれで使える音素に分解するスクリプトを作ってみることにした。

探してみると、既にこのようなプログラムは書かれていて、muDaTTS V0.2という名前で公開されていた。これはRubyというプログラミング言語で記述されていて、OSはlinux向けに書かれていた。これはとてもよくできていて、日本語の文書を渡すとその通りに発音してくれる。ただし抑揚はつけていないので、棒読みになる。

これをNVDAでも使えるようにと思って、NVDAを記述しているPythonというプログラミング言語で書き直してみた。結局まだどう組み込めばいいのかもわからないので、まだまだNVDA対応などではないけれど、とりあえず漢字仮名交じり文を音素に分解できるようになった。出力されるファイルをMBROLAのプレイヤーで開くとちゃんと棒読みで喋ってくれる。muDaTTSは数字の羅列をちゃんと日本語の数として読んでくれる。この再現にはかなり手こずったが、なんとかこちらでも読めるようになった。

基本的な部分はRubyからPythonへの翻訳なので原形をとどめているところもあれば、こんなふうにかなり変更してあるところもある。muDaTTSはアルファベットが読めなかったので、変換辞書を作って対応してみた。単語の日本語での読み方が用意してあればそれで読み、単語が分からないときは綴りを読むようにした。この辞書へは英単語以外も登録できる。muDaTTSでは、漢字から仮名への変換にChaSenというソフトを使っていたが、後発のmeCabというソフトを使ってみたかったので、そちらを使うように書きかえた。またkakasiというプログラムを仮名からローマ字への変換に使っていたが、ここのアルゴリズムを考えるのは面白そうだったので仮名文字から直接音素記号をはき出すように自分で書いてみた。

最終的にはこのスクリプトだけで、しゃべり出してくれることを目的としているけれど、まだMBROLAの扱い方が分からないので、今のところは日本語テキストを標準入力に与えると、音素に分解したテキストファイルを標準出力に吐きだすようになっている。ここで使われている音素の記号は後述するJP2で使われているものである。


とりあえず名前はPyDaTTSとしてみた。ダウンロードは次のリンクからできる。バージョンは0.5。WindowsXPのみ対象。
ダウンロード PyDaTTS.zip

解凍するといろんなファイルが出てくる。

※注意。スクリプトやバッチファイルもファイルの内容を理解してから実行してください。自己責任でご利用ください。ウィルス検査してからUPしてあります。しかし念のため確認してください。

これを動かすためには、四つのソフトがインストールされている必要がある。
・Python 2.5.1 Windows installer
・mecab-win32 0.96
・package (1.8 Mb) for using Mbrola with Windows
・jp2: Japanese Female (5.6Mb) MBROLA用日本語音声JP2

それぞれ以下のサイトのダウンロードページからダウンロードする。リンク先にインストールの指示もあると思うので、それにしたがって入れていけばいい。

Python Programming Language -- Official Website
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
The MBROLA Project
MBROLAのダウンロードページの下の方にJP2も用意されている。JP2を解凍したものをMBROLAがインストールされた場所にコピーする。コピーした中の付属のphoファイルをダウンロードすると、音声登録の指示が出るので、それにしたがって登録すればいい。


それから、今回は使わなかったけれど、muDaTTSでも使われている有名な形態素解析器ChaSen、と漢字かな変換プログラムkakasi
ChaSen -- 形態素解析器
KAKASI - 漢字→かな(ローマ字)変換プログラム



はっきりいって、これはまだプログラムの分からない人には扱えない。これが一般の人向けに利用できるようになるのはまだ当分先だろう。それを作るのは僕である必要もない。

バッチファイルを入れてあるので、「text.txt」に適当な文章を書いて、play.batをダブルクリックすれば、標準的なMBROLAのインストールをしていれば、そしてJP2という日本語音声を入れてあれば、たぶんしゃべり出してくれる。いろいろパラメータをいじるとJP2のサンプルのようにそれなりに抑揚もつけられるのだけど、その数値の意味をまだ理解していないし、たぶん難しいので、棒読み。

今回作ったサンプル音声は以下のリンクから聞くことができる。


本日は、晴天なり。
平成17年10月1日に調査された日本の総人口は、127,767,994人です。


「本日は、晴天なり。」に対して出力されるテキストの内容
_ 300
h 22
o 178
n: 200
dZ 80
i 120
ts 22
u 178
w 22
a 178
_ 80
s 40
e 160
i 200
t 22
e 178
n: 200
n 32
a 168
r 22
i 178
_ 200
_ 300



上記以外でとてもお世話になったページ
ctypes で MeCab 0.9rc6 を使う (2006/01/14)
Zaurusで日本語音声合成 MBROLA+muDaTTS


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

2008年04月10日

xpNavoでMisakiさん

高音質な美声で評判のMisakiさんについての続編。以前「VoiceTextのMisakiさん」に書いたときには、PC-TalkerとxpNavoというスクリーンリーダーでMisakiさんが使えると書いた。今回はそのxpNavoについての話。

スクリーンリーダーPC-Talkerの最新版ではMisakiさんがしゃべってくれるが、これはSAPI5音声を使ったものではないので、僕的にはいろいろ遊べない。一方のxpNavoでは、SAPI5の音声として利用できるので、他のSAPI5を使うソフトで簡単にMisakiさんの声を利用できるようになる。これは面白そう。

そういうわけで購入してみた。

このスクリーンリーダーxpNavoはWindowsXP用。VISTAには対応していないので注意。価格は合成音声搭載のものとしてはかなり安い方になる。搭載されている合成音声は、misakiのほかに、同じペンタックス製のMiyu(女声)、Show(男声)、Kate(英語女声)。

他に比べて安価ではあるが、xpNavoはスクリーンリーダーとして基本的な機能はおさえている。IEはもちろん、ワードやエクセルの読み上げ機能もある。具体的な操作方法は、設定画面のヘルプ中に記されているショートカットキーの一覧を読んで調べればいい。

このスクリーンリーダーには「自動読み上げモード」と「ワンタッチ読み上げモード」がある。「自動読み上げモード」はメニューの選択から何から音声で教えてくれるものだ。つまり通常のスクリーンリーダーらしく使える。一方の「ワンタッチ読み上げモード」は指示したときだけ読み上げてくれる。こちらは視覚に障害はないが読み上げ機能は使いたいという人に便利な機能だろう。

xpNavoをメインのスクリーンリーダーとして使う場合はちょっと注意が必要。視覚障害者用のソフトであっても、そのソフトの側で各スクリーンリーダーへの対応をしていないと問題が生じる場合がある。常用するソフトがこのxpNavoで使用できるかどうかはちゃんと確認しておく必要がある。ただそれがSAPI5対応のソフトであれば音声エンジンとして使える可能性は高いだろう。他のソフトに比べて値段も安く、高音質の音声で画面を読んでくれるので、お薦めのソフトにかわりはない。

↓購入はこちらで、どうぞ




このブログでは以前からFirefoxの拡張「Fire Vox」、「Click,Speak」を紹介しているが(カテゴリ:Fire Vox)、この拡張でもSAPI5のMisakiさんの声を利用できる。Fire VoxはxpNavoではマニュアルにも利用方法が紹介されている。音声の選択はFire Voxでは直接できないので、コントロールパネルの音声認識を開いて、音声合成タブにある音声選択コンボボックスでVM Misakiを選んでおく。

xpNavoを起動させていない状態でもSAPI5は有効なので、そのままMisakiさんの音声を利用できる。しかしこれだと文字入力が音読されない。文字入力は読ませなくてもいいというのなら、これでもいいのだが、文字入力を読ませる必要があるときにはxpNavoを起動し「自動読み上げモード」にしておかないといけない。

ただ「自動読み上げモード」にした場合、Fire Voxのオプションでイベント読み上げがチェックされていると、メニューなどが二重読みされる。煩いので、このチェックは外しておいたほうがいい。


以前、「オープンソースのスクリーンリーダNVDA」で紹介したNVDAでもちゃんとSAPI5のmisakiさんの声を利用できる。NVDAの日本語版は「NVDAJp」においてあるので、ダウンロードして、解凍し、nvda.exeを起動する。初期設定では表示も音声も英語になっているので、次の手順でMisakiさんに切り替える。
・メニューバーの「Preferences」メニューを開き、「User Interface」項目を選択する。
・「User interface settings」ダイアログが開くので、「Language」コンボボックスの値を、「ja_Japanese」に切り替える。
・再起動の旨のメッセージが表示されるので、OKボタンを押す。しばらく待つと、メッセージが日本語に切り替わって戻ってくる。
・メニューバーの「設定」メニューを開き、「出力先の選択」項目を選ぶ。
・「出力先」ダイアログが開くので、「出力先」コンボボックスを「sapi5」に切り替えて、OKボタンを押す。
・メニューバーの「設定」メニューを開き、「音声設定」項目を選ぶ。
・「音声設定」ダイアログが開くので、音声コンボボックスから「VW Misaki」を選んで、OKボタンを押す。

これで、NVDAでmisakiさんがしゃべってくれるようになる。ウィンドウズキーを押して矢印キーを動かすと項目を読み上げてくれるし、アプリケーション実行中にALTキーを押すとメニューを読み上げてくれる。基本的な使い方は、操作ウィンドウに表示される「NVDAクイックスタートドキュメント」に書いてある。


ちょっと残念なのは、xpNavoに音声ファイルを作成する機能はついていないこと。アイネットの「らくらくボイス」というソフトを使えば便利に音声ファイルを作成できる。でも無料でやろうと思えばできなくもない。次回はその方法をまとめてみるつもり。


それから、スクリーンリーダーではないけれど、「電子かたりべプレイヤー」でもMisaiさんはしゃべってくれるらしい。これはスタパ氏の記事「今時の音声合成ソフトウェア」を読んで分かった。

関連リンク:
株式会社ナレッジクリエーション » xpNavo

当ブログ関連記事:
VoiceTextのMisakiさん
オープンソースのスクリーンリーダNVDA
カテゴリ:Fire Vox
WindowsXPにSAPI5音声を入れるには


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

2008年04月12日

SAPI5の音声ファイルを作るWSHスクリプト

前回の続き。xpNavoを導入したので新しくSAPI5の音声が使えるようになった。この音声を使った音声ファイルを作るスクリプトを考えてみた。最初、pythonでpyTTSというモジュールを使ってやってみたら、意外に簡単にできた。でも、pythonよりもWSHで作った方が誰でも使えて便利だろう。WSHはWindowsXPならば標準装備の環境のはずだから、こっちのほうが役立つはずだ。

そういうわけでWSHで作ってみた。僕はBASICで考えるのが嫌いで嫌いでたまらないので、JScriptで書いてみた。JS拡張子は環境によってはスクリプトとして動かないので、wsf拡張子にした。なお、このスクリプトは、SAPI5が利用できるWindowsXPパソコンを対象としている。

お約束。私takayanは、このプログラムによって生じる一切の不具合、影響などに関する損害は一切感知しません。 それに同意いただいた方のみご利用ください。改変自由です。

↓↓↓ダウンロード
textvoice.zip

解凍ソフトを使って適当な場所で解凍すると二つのWSHのスクリプトが入っている。textvoice.wsfは文書ファイルを引数にして、それを音声ファイルに変換する。sendto.wsfは、このtextvoice.wsfのショートカットを「送る」メニューに登録する。

これがスクリプトの全文
var startTime = new Date();
var shell = WScript.CreateObject('WScript.Shell');
var fs = WScript.CreateObject('Scripting.FileSystemObject');
var voice = WScript.CreateObject('SAPI.SpVoice');
var stream = WScript.CreateObject('SAPI.SpFileStream');

var args = WScript.Arguments;
if ( args.length == 0 ){
shell.Popup( 'ファイル名を示す引数がないので、終了します'
, 0, '報告', 0 );
WScript.Quit();
}

var path = fs.GetParentFolderName( WScript.ScriptFullName );

for( var i = 0; i<args.length; i++ ) {

var name = args(i);

// ファイルの存在を確認しておく
if ( !fs.FileExists( name ) ) {
if ( fs.FolderExists( name ) ) {
shell.Popup( '"' + name + '"はフォルダなので変換をスキップします'
, 5, '報告', 0 );
} else {
shell.Popup( '"' + name + '"は存在しないので変換をスキップします'
, 5, '報告', 0 );
}
continue;
}

var txtName = name;
var wavName = name + '.wav';
var mp3Name = name + '.mp3';
var extendedName = txtName;

// 必要ならばテキストに変換
var extend = fs.GetExtensionName(txtName);
if ( extend != '' && extend != 'txt' ) {
// xdoc2txtがあれば、まずテキストに変換する
var d2t = fs.BuildPath( path, 'xdoc2txt.exe' );
if ( fs.FileExists( d2t ) ) {
extendedName = txtName + '.' + extend;
fs.CopyFile( txtName, extendedName );
var d2tcommand = '"' + d2t + '" -f -n "' + extendedName + '"';
shell.Run( d2tcommand, 0, true );
fs.DeleteFile( extendedName );
txtName += '.txt';
}
}

// wavファイルに変換
stream.open( wavName, 3 );
voice.AudioOutputStream = stream;
var h = fs.OpenTextFile( txtName );
while (!h.AtEndOfStream) {
var line = h.ReadLine();
voice.Speak( line, 0 );
}
h.Close();
stream.close();
var last = wavName;

// lameがあればさらにmp3に変換
var lame = fs.BuildPath( path, 'lame.exe' );
var lameoptions = '';
if ( fs.FileExists( lame ) ) {
last = mp3Name;
var lamecommand = '"' + lame + '" ' + lameoptions
+ ' "' + wavName + '" "' + mp3Name + '"' ;
shell.Run( lamecommand, 0, true );
fs.DeleteFile( wavName );
}

// 文書一時ファイルの削除
if (extendedName!=txtName) {
fs.DeleteFile( txtName );
}
}

// 経過時間の計算
var finishTime = new Date();
var timeStr = "";
var diff = finishTime.getTime() - startTime.getTime();
var hour = Math.floor(diff/(60*60*1000));
if (hour!=0) {
timeStr += hour + '時間';
}
diff -= hour * (60*60*1000);
var min = Math.floor(diff/(60*1000));
if (min!=0) {
timeStr += min + '分';
}
diff -= min * (60*1000);
var sec = diff / 1000;
if (timeStr) {
timeStr += Math.floor(sec+0.5) + '秒';
} else {
timeStr = sec + '秒';
}
WScript.Echo( '変換完了です\n経過時間:' + timeStr );



プログラムをみるとすぐに分かるが、外部実行ファイルとして、xdoc2txt.exeやlame.exeを使えるようにしてある。無くてもこのスクリプトは使えるが、あるといいことがある。

xdoc2txt.exeがスクリプトと同じフォルダにあると、PDFやワード文書などテキスト以外の文書ファイルでもまともに変換してくれるようになる。xdoc2txt.exeが無いと拡張子がなんであろうとテキストファイルとみなす。もう一つのlame.exeはwavファイルをmp3に変換するプログラム。これがスクリプトと同じフォルダにあると、最終的にできる音声ファイルはmp3形式になる。

これらは同梱していないので、必要ならばそれぞれ下記の場所からダウンロードしてスクリプトと同じフォルダに入れておく。

・xdoc2txt.exeの入手先
EB series support page

・lame.exeの主な入手先
Lame MP3 Encoder Binariesなど


青空文庫などにあるテキストファイルを音声ファイルに変換し、iPodなどで聞いてみるのもいい。ただそれをするにはこのままだと難しい。ルビもしくはルビが振られた漢字を正規表現を使って削除する操作が必要になるだろう。また章やサイズ毎にファイルを切り分ける工夫をしないと、まるのまま聞き続けるのは大変だろう。

ためしに、このスクリプトで「吾輩は猫である」を丸ごとmp3に変換してみた。すると完了するのに一時間以上かかってしまった。そんなものかもしれない。変換時間の見当が付かないときは、最初からあまり大きなファイルは変換しない方がいい。


おまけのスクリプトとして下に示す「送る」メニューに変換コマンドを登録するWSHスクリプトも作ってみた。手作業でやればいいことだけれど、自動化するとどうなるか、やってみた。

これを実行すると、textvoice.wsfを「音声ファイルに変換」という名前で登録する。文書ファイルを選択して、右クリックまたはアプリケーションキーでメニューを開き、送るメニューの「音声ファイルに変換」を選ぶと、選択されているファイルと同じ場所に生成してくれる。複数のファイルも選択できる。

下で配布しているファイルを適当な場所で解凍し、sendto.wsf を実行すると、「送る」メニューに登録をしてくれる。既に登録しているのであれば、今度は削除するかどうかを聞いてくる。そのあとで再度登録するかを聞いている。

var name    = '音声ファイルに変換';
var command = 'textvoice.wsf';

var shell = WScript.CreateObject('WScript.Shell');
var fs = WScript.CreateObject('Scripting.FileSystemObject');

var link = fs.BuildPath( shell.SpecialFolders('SendTo'), name + '.lnk' );

if ( fs.FileExists( link ) ) {
shell.Popup( '「' + name + '」は既に送り先に登録されています'
, 0, '報告', 0 );
var button = shell.Popup( '送り先から「' + name + '」を削除しますか?'
, 0, '確認', 4+32 );
if( button == 6 ) {
fs.DeleteFile( link );
shell.Popup( '送り先から「' + name + '」を削除しました'
, 0, '報告', 0 );
} else {
WScript.Quit();
}
}

var button = shell.Popup('送り先に「' + name + '」を登録しますか?'
, 0, '確認', 4+32 );

if( button == 6 ) {
var shortcut = shell.CreateShortcut(link);
var path = fs.GetParentFolderName( WScript.ScriptFullName );
shortcut.TargetPath = fs.BuildPath( path, command );
shortcut.Save();

shell.Popup( '送り先に「' + name + '」を登録しました', 0, '報告', 0 );
}



このスクリプトは僕が考えたものだけど、lame.exeやxdoc2txt.exeを使ったり、送るメニューなどを使うという手法は以前紹介した「ドキュメントトーカ」で使われているもの(関連記事:WindowsXPにSAPI5音声を入れるには)。misakiさんの声にこだわらなければ、「ドキュメントトーカ」は日本語合成音声の入手手段としておすすめである。このスクリプトを利用しなくても標準で音声ファイルに変換できるし、SAPI5だけでなくSAPI4の音声も使うことができる。

最近、「ドキュメントトーカ Plus V2.1」のフリー版が公開された。製品版に入っている日本語合成エンジンが入っていないなど、いくつかの制限がある。最初にアナウンスがはいるが音声ファイルも作成できる。

製品情報 ドキュメントトーカ 日本語音声合成エンジン for Windows - クリエートシステム開発株式会社


僕のプログラムは、基本的なことしかしていない。音質も生で聞くときよりも落ちている感じがする。他にもいろいろ改良の余地があるだろうが、とりあえず、ここまで。


更新:pathの獲得の仕方など、いろいろ気づいたところを修正(2008年4月12日23:50)


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

2008年04月15日

自分の声の合成音声

さっきNHKの9時のニュース「news watch 9」を見ていたら喉の癌で声帯を切除し自分の声を失った人が、自分の声の合成音声を使って仕事に復帰できたという話題をやっていた。この人は大学の先生なのだが、キーボードで文章を打ち込みながら、それを合成音声にしゃべらせて、講義をしていた。素晴らしいことだ。

大学の先生にとって声を失うということは、教壇に立て講義ができなくなるということ。この先生は声帯の摘出前にこのソフトを知ることができ、自分の声のデータベースを残すことができた。

そのご本人が牧 泉教授。ご自分のサイトでこのソフトについての説明している。
大阪芸術大学・牧泉先生のホームページ
ここには、以前の講演のときの音声と、それと同じ台詞を音声合成にしゃべらせた音声が公開されており、比較できる。

ここで使われているソフトが、ポルックスター。
販売窓口:AQUARIUS最先端研究所 Polluxstar
ここでは、サンプル音声や、この製品を取り上げた新聞記事なども紹介されている。

Mクラス80万円(期間限定)か。自分の声帯を失ってしまうというのならば、自分の声を残すためならこれくらい安いのかもしれない。ソフト開発はOKI。


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

2008年05月07日

SleipnirでSAPI5合成音声を使うスクリプト

僕は、ブラウザはFirefox2も使っているが、メインはSleipnirのほう。
Sleipnirも、Firefox2とは違うがスクリプトを登録していろいろ機能を追加していける。ActiveXも使えるので、合成音声も簡単に扱えるようになる。DOMを使ってページ内の情報にも触れられそうなのでCLiCk,Speakがやっていることぐらいなら、いろいろできそうだ。

以下簡単な実験

■選択領域を英語の文章として読み上げてくれるスクリプト

次のスクリプトをjsという拡張子のついた名前で、例えば、「選択範囲を英語として読み上げる.js」で保存し、Sleipnirがインストールされているフォルダにある「script」フォルダにコピーする。

どこにインストールされているか分からなければ、デスクトップのSleipnirのショートカットアイコンのプロパティを開いて、「リンク先を探す」ボタンを押してエクスプローラのウィンドウを開かせて、ツールバーにある「上へ」ボタンを押せばいい。

var pnir     = new ActiveXObject("Sleipnir.API");
var id = pnir.GetDocumentID(pnir.ActiveIndex);
var document = pnir.GetDocumentObject(id);
var window = pnir.GetWindowObject(id);
var voice = new ActiveXObject('SAPI.SpVoice');
if (document && voice) {
var text = document.selection.createRange().text;
if ( text ) {
voice.Speak( "<lang langid='409'>" + text + "</lang>" , 0 );
}
}
voice = null;
window = null;
document = null;
id = null;
pnir = null;


既にSleipnirが起動しているならば、「ツール」メニューの「スクリプト」サブメニューにある「スクリプト再読込み」を選ぶと反映される。そしてページ内の領域を選択し、同じメニューにある「選択範囲を英語として読み上げる」を選べば、実行される。



もうちょっと便利に使えるようにしてみよう。Sleipnirは領域を選択すると、その左下か右下に一の字のアイコンが現れる。これにマウスを重ねると、虫眼鏡のアイコンが出てきて、さらにそれをクリックすると検索などの領域選択後に便利なコマンドリストが現れる。このリストへのスクリプトの登録の仕方を次に示す。

最新版のSleipnirをいれておいて、プラグインUserAction Extensionを入れておく。

組み込みスクリプトなので、上記スクリプトの一行目を次のように書き換える。
var pnir     = sleipnir.API;


Sleipnirを終了しておいて、先ほどのスクリプトファイルをSleipnirをインストールしたフォルダのpluginフォルダのscriptsフォルダにコピーする。そしてSleipnirを起動する。

「ツール」メニューの「Sleipnirオプション」を開いて、「ユーザーインターフェース」の「メニューエディタ」を選んで、「メニュー」リストの中から「SmartSearch」を選び、追加ボタンを押して「メニュー項目を追加」を選ぶ、「メニューエディタ」ダイアログが出てくるので、名前欄に「英語として読む」、アクション欄のメニューから、先にフォルダにコピーしたファイル名を選ぶ。選んだら「追加」ボタンを押してメニューエディタダイアログを閉じ、オプションダイアログの「OK」ボタンを押せば、登録完了。

これで、選択領域をスマートメニューを使って、読み上げることができる。


応用次第でいろいろ遊べるだろう。上記のスクリプトの409を他の番号にすると、他の言語で読み上げてくれる。もちろんその言語のSAPI5対応エンジンがパソコンに入っている必要があるけれど。他の言語で読ませたいときは、番号だけを変えて同じようなファイルを複数登録すればいい。

407 ドイツ語
409 英語
40a スペイン語
40c フランス語
410 イタリア語
411 日本語
412 韓国語
419 ロシア語
804 中国語


その他の言語および地域との組み合わせに使うlangidの番号は次のページにある。
Locale Identifier Constants and Strings


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

2008年05月09日

VDSの実験

マニュアルにある例文
ブログの投稿欄でできるかな




こんにちは、世界


これのこと
http://www.vdsapi.ne.jp/


結果:
ブログのトップページを開いて利用するときはうまくいくけれど、
http://neu101.seesaa.net/

記事単体として開いたときは、オブジェクトが作れない。登録したアドレスと違ってしまうからだろう。
http://neu101.seesaa.net/article/96184458.html

オブジェクトが作れなくても、成功するのは、セッションがまだ有効だからだとおもうが、よく分からない。


最初そう思ったが、もう一度確認してみたら、ブログのトップから開いても、記事単体で開いても、ちゃんと発音してくれる。ブログの反映にタイムラグがあったせいで、そう思ってしまったのかな。


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

2008年05月22日

Macの「システムの声」の変え方

簡単なことなのでわざわざ書くまでもないことだけど、恥ずかしいことに変え方を完全に忘れてしまって余計なプログラミングまでやってしまった。忘れないように書いておこう。

対象はMac OSX 10.5 Leopard

画面左上のアップルマークをクリックして、アップルメニューを開いて「システム環境設定...」を選ぶ。



すると、次のウィンドウが開く。
この一番下の段「システム」に「スピーチ」がある。
これをクリック。



すると、次の画面に切り替わる。



システムの声がこの画像では「takashi」になっている。
日本語音声を入れてしまうと、自動的にこうなってしまう。

この声の名前が書いてあるところをクリックすると、次のようなメニューが出てくる。



そして、「表示する声を増やす」を選ぶ。
メニューが閉じるが、もう一度開くと、全ての音声が表示される。
この中から、好みの音声を選ぶ。




そして、音声の横にある「再生」ボタンで試聴する。
いろいろ試してみると面白い。おすすめはAlexとVicki。


それから、この設定画面にある「キーを押したときに選択しているテキストを読み上げる」をチェックするとキー操作だけで読み上げてくれるようになる。ショートカットキーは「キーを設定」ボタンを押して登録する。この読み上げは現時点では英文限定。


Macには標準でVoiceOverという機能がある。いわゆる操作を音声で読み上げてくれるスクリーンリーダ。これが多くの英語音声と共に最初から搭載されている。これだけでもMacは素晴らしい。Tigerのときには完全ではなかったがソフトを購入すれば日本語でもなんとか利用することができた。しかしLeopardでは今のところ日本語では使えない。


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

2008年09月08日

「DTalker for Mac OS Xのレパード対応アップデータ公開」

Mac OS Xで、日本語音声合成を使えるようにする「DTalker for Mac OS X」。
製品付属の専用ソフトでの音声読み上げなどはできていたのですが、目玉機能の一つであるVoice Overで使えないという大きな問題がありました。VoiceOverというのは、Mac OS Xで標準装備されているスクリーンリーダのことです。音声を買い足さなくても英語での読み上げ機能を持っています。前のMac OS X Tigerでは「DTalker for Mac OS X」をインストールするとVoiceOverで日本語を使える機能がなんとか使えていたのですが、レパードになって使えなくなってしまいました。同様にアプリケーションで音声合成を使うSpeech Managerでも、日本語音声が使えなくなっていました。

そんな状況だったのですが、公式サイトによると、2008年8月27日に、レパード対応アップデータがようやく公開されました。

公式サイト:
製品情報 DTalker for Mac OS X

待ちました。Leopard買ったのも、Tigerで中途半端だった機能が本格的に使えると信じたからでした。最初それが駄目だったときは、不可能だと悟るまで、何度もLeopardのクリーンインストールを試みるという涙ぐましいことをしたわけで。ほんと待ちに待ちました。

まだ、自分で入れていないので詳しいことは分かりませんが、分かったらすぐに報告したいと思います。しばらく、こちらに労力を振り分けようと思います。とりあえず、アップデータが出ていたという報告だけでも。


以前、このブログで書いたMacの音声の記事:
Macの「システムの声」の変え方
このときは、使えないはずの日本語音声が既定の音声になってしまうことへの対処法として書いたのに。


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

2010年02月19日

Open JTalkをVS2008で

ご無沙汰しています。
久しぶりに書いてます。
(2010.08.28 1.01向けに修正)

最近になって、Open JTalkというのを見つけたので、ちょっと試してみました。
OpenJTalkはオープンソース(New and Simplified BSD license)の音声合成システムです。linux向けのものですが、Windowsでもビルドし実行することができます。

参考にしたページは、研究室の片隅で○○を叫ぶの「Open JTalk をVS2005でコンパイルしてみた」と、そこで紹介されていた ja.nishimotz.com の「Open JTalk」です。前者はタイトル通りVisualStudio2005でのコンパイル方法が、後者ではUbuntuとWindowsのCygwin環境での動作例が解説されています。
今回は、手元にVS2008があるので、それでコンパイルしてみました。ちゃんと上記ページと同じwavファイルが作れました。

せっかくなので、そのとき作ったnmake向けの Makefile.mak を公開します。ソースを手を加えずにビルドするための単純なものです。

open_jtalk-1.01_vs_makefile.zip
(20100828 1.01向けに修正)

VS2008PRO向けに作りましたが、無料でダウンロードできる Express Edition の環境でもうまくいきました。それから現在Microsoftで評価版として公開されているVisualStudio2010RCをインストールした環境でも、ソースに2行書き加えればコンパイルできることも確認できました。


それでは、VS2008向けの手順です。分かりやすいようにバッチファイルの内容も書いておきます。

必要なのは以下の4つのファイルです。
hts_engine_API-1.03.tar.gz
hts_voice_nitech_jp_atr503_m001-1.01.tar.gz
open_jtalk_dic_shift_jis-1.00.tar.gz
open_jtalk-1.01.tar.gz

最初の一つは次のページから、
http://hts-engine.sourceforge.net/
残りの3つのは次のページから
http://open-jtalk.sourceforge.net/
持ってきます。
適当な新しいフォルダを作って、この4つのファイルをその中に入れます。

そして今回作ったMakefileを固めた open_jtalk-1.01_makefile.zip も同じフォルダに入れます。

これらの5つのファイルを圧縮解凍ソフトの手順に従って展開します。例えば、7-zipを入れていれば、次のようにしてコマンドラインで展開します。(7-zipのインストール先が違うときは書き換えてください。)
extract.bat
set PATH=%ProgramFiles%\7-Zip;%PATH%
7z x hts_engine_API-1.02.tar.gz
7z x hts_engine_API-1.02.tar
7z x hts_voice_nitech_jp_atr503_m001-1.00.tar.gz
7z x hts_voice_nitech_jp_atr503_m001-1.00.tar
7z x open_jtalk_dic_shift_jis-1.00.tar.gz
7z x open_jtalk_dic_shift_jis-1.00.tar
7z x open_jtalk-1.01.tar.gz
7z x open_jtalk-1.01.tar
del *.tar
7z x open_jtalk-1.01_vs_makefile.zip
展開がすんだら、次のビルド用のコマンドを実行します。
build.bat
call "%VS90COMNTOOLS%\vsvars32.bat"
cd hts_engine_API-1.02
nmake /f Makefile.mak
nmake /f Makefile.mak install
cd ..
cd open_jtalk-1.01
nmake /f Makefile.mak
copy bin/open_jtalk.exe ..
cd ..
最初の行がVisualStudio2008の環境設定です。そのあとhts_engine_APIをビルドして、そのあとopen_jtalkを作ります。
うまくいけば、これで open_jtalk.exeがアーカイブを入れたフォルダに出来上がります。

そして、実行テストです。何でもいいのですが、比較して確認できるように先人を踏襲します。
次の内容のシフトJIS形式でtest.txtと名前をつけて保存します。
新成人のみなさん、おめでとうございます。私も成人したころを懐かしく思い出します。
そして、次の内容のバッチファイル test.bat を作り、同じフォルダに入れます。
@echo off
set VOICE=hts_voice_nitech_jp_atr503_m001-1.00
open_jtalk ^
-td %VOICE%/tree-dur.inf ^
-tf %VOICE%/tree-lf0.inf ^
-tm %VOICE%/tree-mgc.inf ^
-md %VOICE%/dur.pdf ^
-mf %VOICE%/lf0.pdf ^
-mm %VOICE%/mgc.pdf ^
-df %VOICE%/lf0.win1 ^
-df %VOICE%/lf0.win2 ^
-df %VOICE%/lf0.win3 ^
-dm %VOICE%/mgc.win1 ^
-dm %VOICE%/mgc.win2 ^
-dm %VOICE%/mgc.win3 ^
-ef %VOICE%/tree-gv-lf0.inf ^
-em %VOICE%/tree-gv-mgc.inf ^
-cf %VOICE%/gv-lf0.pdf ^
-cm %VOICE%/gv-mgc.pdf ^
-k  %VOICE%/gv-switch.inf ^
-x open_jtalk_dic_shift_jis-1.00 ^
-ow _hoge.wav ^
-ot _log.txt ^
test.txt
test.bat を実行すると、音声が出力されるはずです。フォルダには音声ファイルとログファイルができているはずです。

nishimotz 氏の 上記サイトと同じファイルができたでしょうか?音声をパソコンから出力せずに音声ファイルだけを作る改造の仕方はそのページに書いてあります。


実際ビルドしてみると分かるのですが、ビルド時にメモリ リークの可能性という警告がでてしまいます。音を出してみるのが目的だったので、今回はそのままにしています。本格的に使うときには修正が必要かもしれません。

それから、このプログラムでは内部で MeCab を利用していますが、ソースを確認すると Open_Jtalk 向けに十数か所書き換えらたものが使われていて、本家の libmecab.dll を利用するようにはできていないようです。ビルドの仕方によっては Open_JTalk向け libmecab.dll を生成するようにもできますが、今回は生成しないようにしています。

OpenJtalk は、商用の音声合成に比べれば物足りなさを感じますが、フリーでここまでできれば十分だと思います。開発された方々に感謝します。 今後 Windowsで使いやすいように dll化したり、SAPI5で使えるようにしたり、いろいろできたらいいですね。でももっと興味があるのがLinuxでの利用です。いままでも、制限付きのAquesTalkの試用版を使ったり、MBROLAを使ったりすれば、お金をかけずにLinuxでの日本語の発音もできたのですが、ソースが公開されていなかったり、ライセンス的にいろいろ面倒でした。でもこのOpen_JTalkはオープンソースということなのでいろいろ自由にやれそうです。


最後に、次は参考までに現在評価版として入手できるVS2010RCでのビルド手順です。

ファイルの展開までは上記とまったく同じです。しかしこのままmakeしても途中で止まってしまいます。問題は back_inserter() のようです。回避するには、この関数が現れるファイルの先頭の方に #include <iterator> を挿入すればいいようです。具体的には、mecab/srcフォルダの dictionary_rewriter.cpp 、viterbi.cpp の2つのファイルを修正します。この修正のあと上記のビルド用のバッチファイルの一行目を 「call "%VS100COMNTOOLS%\vsvars32.bat"」に書き換えて実行すれば、open_jtalk.exe が生成されるはずです。


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

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