Microsoft Speech Platform の日本語音声合成エンジン
2010年07月22日(木)23時55分
※「細かいことは置いといて、ともかく使ってみたい」という方のための簡単導入編(青空文庫や六法のオーディオブックを無料で作る方法)を書いてみました。
【追記:2010/10/16】関連記事「Microsoft Speech Platform を SAPI5 として使う」を書きました。
【追記:2011/09/04】このページはバージョン 10.1 に基づいて書かれています。バージョン 11 について「Microsoft Speech Platform 11」を書きました。
待望の?無料日本語音声合成エンジン
Windows には SAPI5 という音声認識・合成システムがあり Windows XP からは標準で搭載されています。
つまり XP 以降であれば特に何かを追加せずともコンピュータに文章を読み上げさせることができる、ということなんですが、標準でついているのは英語の読み上げ機能のみで、日本語で文章を読み上げさせる場合には、何かしらの製品を買ったりする必要がありました。
ところが、いつの間にか(Microsoft Office 2010 に合わせて?)Microsoft 社から日本語の音声合成エンジンが(タダで!)ダウンロードできるようになっていたのです。
と、いうことを最近になって知りましたので、今回はその Microsoft Speech Platform のお話です。
サンプル
では早速、読み上げ音声のサンプルです。
いかがでしょうか。
個人的にはかなり良い(使える)と思います(実は前回のスクリプトで作った Microsoft Helen も味があって結構好きだったりしますけれども)。
使用条件
Microsoft 社のサイトを見ていると「Microsoft Office 2010 をより便利にするために提供します」というような感じですが、例えば Microsoft Office IME 2010 のような「使用に際しては Office の利用者でなくてはいけない」といった決まりはないそうです。
動作環境
ダウンロード・サイトに記載された動作環境には残念なことに Windows XP が含まれていないのですが、別に WinXP でもインストーラで弾かれるというわけではありませんので、インストール可能です(Microsoft .NET Framework が必須なため、そういう意味では少なくとも素のままの WinXP ではインストール不可ということになりますが)。
ただし動作保障されているわけではないので環境によっては使えない場合もあるかもしれません。
例えば、英語版の Office.com の記事には「[Important]The Speak feature will not work with Windows XP.」と、WinXPでは動きませんとの記述があったりします。
インストール
まずは Server Runtime というランタイムをインストールします。
こちらのページから 32 ビット OS の場合は「Runtime\x86\SpeechPlatformRuntime.msi」を、64 ビット OS の場合は「Runtime\x64\SpeechPlatformRuntime.msi」を「ダウンロード」してダブルクリックするだけです。
【追記:2011/06/17】これは「OS が 32 ビット版か 64 ビット版か」ではなく「音声合成を使用しているアプリケーションが 32 ビット版か 64 ビット版か」で決めるそうです。つまり 64 ビット版 OS の場合は両方入れておけばいいのではないかと思われます。
次に日本語用の音声合成エンジンをインストールします。
こちらのページから「LangPacks\MSSpeech_TTS_ja-JP_Haruka.msi」を「ダウンロード」してダブルクリックしてください。
両方とも「インストールしますか?」とか「終了しました」といったメッセージも出ずに、いきなり始まって勝手に終了してしまいます(おかげで使えない理由がインストール失敗なのか他に理由があるのかわからず苦労しました)。
さまざまな言語が存在
音声合成エンジンのダウンロード・ページを見ていただければわかるように、日本語以外にもさまざまな言語の読み上げが可能になります(インストールすれば)。
英語に至っては、
- en-AU=オーストラリア英語(Australia)
- en-CA=カナダ英語(Canada)
- en-GB=イギリス英語(United Kingdom)
- en-IN=インド英語(India)
- en-US=アメリカ英語(United States)
と、実に5種類も存在します、…多分。
実際のところインストールして試したわけではなく、試したところで確認できるだけの語学力は持ち合わせていませんので、字面から予想で書いているだけなんですが。
.NET Framework 必須
ちなみに音声合成エンジンのみインストールすることもできますが、ランタイムがインストールされていなければ使えず、そしてランタイムは Microsoft .NET Framework がインストールされていないとエラーが出てインストールできません。
つまり Microsoft .NET Framework が必須ということです。
もっとも、確か Vista 以降は .NET Framework 標準搭載なので問題になることはないでしょう。
SAPI5 ではない
では早速、とコントロール・パネルの「音声認識」アイコンから「音声合成」タブを確認してみても、日本語の音声合成エンジンは追加されていません。
SAPI5 に対応したアプリケーションで確認しても選択できる音声の種類に変化はないのです。
インストールに失敗したのか?WinXP ではダメなのか(Win7 でも結果は一緒でした)?といろいろ悩み、あれこれした結果わかったのは「Microsoft Speech Platform は SAPI5 ではない」ということでした。
そういえば確かにダウンロード・サイトには「SAPI5」なんてことは全く書かれておりません。
と、言っても「全くの別物」というわけではなく、動作は「ほとんど一緒」、というよりむしろ中身は「全く同じ」と言ってもいいのではないかと思います。
SAPI5 との違い
では何が違うのかということですが、少し専門的?な話をしますと、SAPI5 は sapi.dll という DLL ファイルで実装されており、例えば JavaScript でこれを利用する場合は最初に「var VoiceObject=new ActiveXObject("SAPI.SpVoice");」という風に書きます。
対して Microsoft Speech Platform は mssps.dll に実装されており、JavaScript では「var VoiceObject=new ActiveXObject("Speech.SpVoice");」とする必要があります。
違いはたったこれだけのことで、そのあとの生成した Voice オブジェクトの利用方法などは両者とも全く同じです。
SAPI5 用ソフトでの対応
ですので対応は簡単で、ソースコードのたった一か所、「SAPI」の部分を「Speech」に書き換えるだけで済むのですが、逆に言えばソースコードを書き換える必要があるため、利用者の側では対応のしようがないとも言えます。
さらに言えば、これによって Microsoft Speech Platform が使えるようにはなりますが、今度は SAPI5 が使えなくなりますので、両対応にしようと思えば他にもいろいろと書き換える必要が生じてしまいます。
【追記:2010/10/16】関連記事「Microsoft Speech Platform を SAPI5 として使う」を書きました。
読み上げ・WAVE 出力用スクリプト
ということで、とりあえず以前書いた SAPI5 用のスクリプトを改造して、Microsoft Speech Platform に対応させ、ついでに録音(WAVE/MP3/AAC/FLAC ファイル出力)機能も追加してみました。
spcbght.txt ← 矢印左側の文字の上で右クリックし、「対象をファイルに保存(A)…」して保存します。
もし、保存した「spcbght.txt」を右クリックし「プロパティ」を見て「セキュリティ:このファイルは他のコンピュータから取得したものです。このコンピュータを保護するため、このファイルへのアクセスはブロックされる可能性があります。」と書かれている場合は「ブロックの解除」をしてください(しなくても使えますが)。
そして spcbght.txt の拡張子「.txt」を「.bat」に変更して spcbght.bat として実行してください。
品質は 8kHz 16Bit
多分 Microsoft 社の開発者向け?のサイトで「8k16bit」と書いてありますので、音質は「8000Hz 16Bit」であろうと思います。
もしかしたらこれは英語音声の話で、ほかの言語は違うという可能性もありますが、Microsoft Haruka もこの音質で録音した時が一番音質が安定しているように聞こえますので、おそらく「8000Hz 16Bit」ではないかと思われます。
【追記:2011/09/27】バージョン 11 から「16000Hz 16bit」に変更されたようです(参考「Microsoft Speech Platform の音質」)。
Microsoft Haruka は PRON タグ非対応
SAPI5 には PRON タグというのがあり、発音を指定して読ませることができるのですが、Microsoft Haruka はこれが使えないようです。
ただ、同じ Microsoft Speech Platform の Microsoft Helen では使えますので、Microsoft Speech Platform が非対応というわけではなく、Microsoft Haruka が対応していないだけだと思われます。
といっても、PRON タグを入れると読み方が変わったりする(指定した読み方をするわけではない)ことがありますし、まあ、それは文節区切りが変わることによる読みの変化かもしれませんが、PRON タグに発音文字として使えない文字(日本語エンジンではカタカナ指定になるので、ひらがなやアルファベット)を使うとエラーが出たりするので、完全に無視しているわけでもないようなのが不明なところです。
【追記:2011/09/04】バージョン 11 において、Microsoft Haruka も PRON タグに対応しました(参考「Microsoft Speech Platform 11」)。
nLite でスピーチのサポート(Speech support)を削っている場合
nLite で「スピーチのサポート」項目の説明には「必要なら後からでも追加できます」的なことが書いてあるのですが、実はあとから「Microsoft Speech SDK 5.1」等をインストールしても使えるようにならなかったりします。
ということで、自分は削らずに最初からインストールしてあるのですが、ひょっとしたら削っていると Microsoft Speech Platform も使えないかもしれません。
ということで、これを削っておられる方向けの復活のさせ方なんですが、こちらのページに詳しい情報が掲載されておりました。
一応、(サイト消失などに備えて)ここにもまとめておきます。
まず、「SAPI5」というフォルダ(実際にはフォルダ名は何でもいい)を作り、その中に「I386」というフォルダ(このフォルダ名は必須)を作ります。
その「I386」フォルダに、XPのインストール・ディスクから、以下のファイルを集めてコピーします。
- LTTS1033.LX_
- R1033TTS.LX_
- SAM.SD_
- SAM.SP_
- SAPI.CP_
- SAPI.DL_
- SAPI5.IN_
- SAPICPL.HL_
- SAPISVR.EX_
- SPCOMMON.DL_
- SPCPLUI.DL_
- SPEECH.CH_
- SPTTSENG.DL_
上記ファイルのうちの一つ、「SAPI5.IN_」を展開(コマンドラインで「expand SAPI5.IN_ SAPI5.inf」)して「SAPI5.inf」を取り出し、「SAPI5」フォルダに置きます(つまり「SAPI5」フォルダには「SAPI5.inf」と「I386」フォルダの二つが存在する状態になります)。
そしてその「SAPI5.inf」を右クリックから「インストール」します。
nLite で Indexing Service を削っている場合
この「Indexing Service」、「重いうえに通常利用では役に立たない邪魔なだけの存在」として削除が推奨されていることも多く、削っている方も多いのではないかと思われますが、これを削っていると Microsoft Haruka は読み上げに失敗します。
といっても Microsoft Haruka のためだけであれば、「Indexing Service」そのものを復活させる必要はなく、ただ「system32」フォルダに「msir3jp.dll」があればそれでかまわないようです。
ファイル名と「Indexing Service」に必要、ということからして、日本語の文章の文節区切りか、読み仮名の取得か、そういうものに利用されているのではないかと思います。
ということで、WinXP のインストール・ディスクから「MSIR3JP.DL_」を拾ってきて、コマンドラインで「expand MSIR3JP.DL_ msir3jp.dll」し、「system32」フォルダに入れておいてください。
あと、それに似たファイル名で「msir3jp.lex」というのがあり、これは別になくても読み上げに失敗することはないのですが、もしかすると「msir3jp.dll」の辞書的なもので、読み上げ精度に影響があったりするのかもしれません。
ということで、不安であれば「MSIR3JP.LE_」も一緒に拾ってきて「expand MSIR3JP.LE_ msir3jp.lex」して入れておいてください。
起爆剤に!
個人的に、音声合成(認識も)というジャンルはかなり好きな技術なんですが、現在のところ、いまいち、なんというか世間の注目を浴びることの少ない分野でもあります。
ちょっと前なら Adobe Flash、今ならニコニコ動画、あるいは少し毛色が違うものの VOCALOID 等で話題になることも増えてきたとはいえ、なかなかメジャーとは言い切れない存在だけに、これを機にいろいろと盛り上がって、あるいは一般に浸透して広く使われるようになるといいな、と思います。
- 関連記事
-
- Microsoft Speech Platform の音質
- Microsoft Speech Platform を SAPI5 として使う
- パソコンにいろいろな国の言葉をしゃべらせる
- 青空文庫や六法のオーディオブックを無料で作る方法
- Microsoft Speech Platform の日本語音声合成エンジン
- Microsoft Sam にカナを読み上げさせるスクリプト
- テキストを読み上げ・録音するスクリプト
trackback
BREAK☆THRU
Microsoft Speech Platform の日本語音声合成エンジン
コメントの投稿
音声ファイルを出力させる方法について
「spcbght.txt」を参考にさせていただき、以下のようなVBScriptを書いてみました。
-------------------------------------------
Set voice = CreateObject("Speech.SpVoice")
Set stream = CreateObject("Speech.SpFileStream")
stream.open "test.wav", 3
voice.AudioOutputStream = stream
voice.Speak "本日は晴天なり。", 0
stream.close()
-------------------------------------------
実行すると
-------------------------------------------
エラー:
オブジェクトでサポートされていないプロパティまたはメソッドです。:
'voice.AudioOutputStream'
-------------------------------------------
というエラーが出てしまいます。
voice.AudioOutputStream = stream
の箇所をコメントアウトするときちんと音声は出るのですが。。。
何が原因なのでしょう?
もしお気づきの点等ありましたら、ご教示いただければ幸いです。
Re: 音声ファイルを出力させる方法について
早速ご質問の件についてですが、どうやら頭に「Set」を付けて
Set voice.AudioOutputStream = stream
とすればよいようです。
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4d36908b-3264-49ef-b154-f23bf7f44ef4&displaylang=en
にあるヘルプファイル「MicrosoftSpeechSDK.chm」は全編英語記述ですが、
ソースコード部は基本的に日本語でも英語でも関係ないので参考になるかと思います。
今回のものもヘルプファイルの検索ボックスで「AudioOutputStream」して
出てきたサンプルコードで確認しました。
ヘルプファイルにある豊富なサンプルコードはほぼ全てVB系で書かれているため
特にVBScriptでの開発にはかなり役に立つと思います。
…おかげでJScriptでは翻訳が必要になり苦労することもあるのですが。
それでは。
Re: Re: 音声ファイルを出力させる方法について
回答ありがとうございました。
おかげさまで無事VBSでファイルを生成できるようになりました。
ちょっとそれてしまうかもしれないのですが...
同じコードを Excel VBA のプロシージャとして使用しようとしたところ、
「ActiveXコンポーネントはオブジェクトを作成できません。」と出てしまいました。
Sub MSSpeechPlatformSample()
Set voice = CreateObject("Speech.SpVoice")
Set stream = CreateObject("Speech.SpFileStream")
stream.open "test.wav", 3
Set voice.AudioOutputStream = stream
voice.Speak "本日は晴天なり。", 0
stream.close()
End Sub
解決したら改めて書き込みしますね。
まずは取り急ぎ御礼まで。
棒読みちゃん
2chとかTwitterとかクリップボードとか読みます
Re: 棒読みちゃん
VBAに関してはほとんど知識はないのですが、
http://snow-white.cocolog-nifty.com/first/2010/07/excel-2010-b6f0.html
http://www.ka-net.org/office/of31.html
あたりが参考になるのではないかなあと思います。
Microsoft Speech Platformに限った話ではありませんが
自分で制御できるようになると「あともうちょっと、ここがこうなら」
という点が解消できるようになって、より便利になりますので
ぜひ頑張ってください。
>>コイツさん
はじめまして。コメントありがとうございます。
「棒読みちゃん」、来ましたか!
AquesTalkも好きな自分にとっては「Softalk」と「棒読みちゃん」は
音声合成ソフト界の二大巨頭的な感覚を持っていますので、
その両者が共に対応となったことで、さらにこのジャンルが
手軽になり、より広く使われるようになることを期待したいと思います。
しかし「棒読みちゃん」が対応となった日の
このサイトのアクセスが前日の1.5倍くらいになっているのは
やはり「棒読みちゃん」サイトを見て
「Microsoft Speech Platform」ってなんだろう?
と検索されてきた方が多かったからでしょうか。
No title
アドバイスありがとうございます。
Windows7(64bit)+Office2010なのですが、
x86用のPlatformを入れることで動作させることができました。
以下のコードで動作を確認しています。
Sub MSSpeechPlatformSample()
Set voice = CreateObject("Speech.SpVoice")
Set stream = CreateObject("Speech.SpFileStream")
stream.open "test.wav", 3
Set voice.AudioOutputStream = stream
voice.Speak "本日は晴天なり。", 0
Call stream.close()
End Sub
また何かありましたら、よろしくお願いいたします。
SAPIでエンコード方式の変換
SAPIを使ってエンコード方式を変更して保存できないかと思っていろいろ試しています。
(たとえば、8KHz8bit PCM→16kHz16bit PCM へ変更する等)。
以下のようなコードを書いてみたのですが。。。
Set objInputStream = CreateObject("sapi.SpFileStream")
Set objOutputStream = CreateObject("sapi.SpFileStream")
objInputStream.Open InputFileName, 0
objOutputStream.Format.Type = 4
objOutputStream.Open OutputFileName, 3
'ここに書く処理
Call objInputStream.Close
Call objOutputStream.Close
Set objInputStream = Nothing
Set objOutputStream = Nothing
「'ここに書く処理」にどのような処理を書けばよいかわからず、困っています。
以前教えていただいたサイトを参考にしようとしたのですが、
Read、Writeの使い方がうまくつかめません。。
もしお気づきの点等ありましたら、ご教示いただければ幸いです。
Re: SAPIでエンコード方式の変換
もしSAPIで「録音時に出力形式を指定したい」ということであれば
事前に「Speech.SpFileStream」オブジェクトの「Format.Type」に
出力したい形式の番号を設定しておけば
指定した形式のWAVEファイルで出力されます。
例えば「16kHz16BitMono」ですと「18」と規定されていますので
以前にみうさんが書かれたサンプルですと以下のようになります。
Set voice = CreateObject("Speech.SpVoice")
Set stream = CreateObject("Speech.SpFileStream")
stream.Format.Type = 18
stream.open "test.wav", 3
Set voice.AudioOutputStream = stream
voice.Speak "本日は晴天なり。", 0
stream.close()
設定する数値に関しては
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4d36908b-3264-49ef-b154-f23bf7f44ef4&displaylang=en
の「MicrosoftSpeechSDK.chm」で
「SpeechAudioFormatType Enum」を検索すると一覧が出てきます。
ただ、例えば「48kHz16BitStereo」が「39」ですので
「stream.Format.Type = 39」とすれば
素晴らしく高音質な音声ファイルができるかといえば決してそういうことはなく、
むしろ質が悪いと感じられるのではないかと思います。
というのも、どうやらSAPIが持つWAVE形式変換エンジンは
あまり出来のいいものではないらしく、
音声合成エンジン本来の出力形式と違う形式で出力する場合、
なんとなく耳障りなノイズの乗った音声に変換されてしまいます。
ということで、例えば「MS Haruka」を使うならば「8kHz16BitMono」の
「6」に設定しておくのが、一番自然な音声になると思います。
もし、ご質問の意図が「既に録音済みのWAVEファイルを別形式に変換する目的に、
SAPIの機能を流用したい」ということであれば、
確かに多分SAPIでもなんとかすれば、変換はできるのではないかと思うのですが、
上記のような理由からその品質にはあまり期待できませんので、
何か別の高品質な変換ツールを探して利用されることをお勧めします。
Re: SAPIでエンコード方式の変換
返信ありがとうございました。
「既に録音済みのWAVEファイルを別形式に変換する目的に、
SAPIの機能を流用したい」と考え、質問させていただきました。
元データのストリームをReadメソッドでバッファにコピー?して
変換先のストリームに流し込んでみたのですが、
とんでもない音がスピーカーから流れる結果となってしまっています。
コマンドラインから使えるツールを探したほうがよさそうですね。
アドバイス、ありがとうございました!
Re: Re: SAPIでエンコード方式の変換
そういうことであれば、Voiceオブジェクトには
WAVEファイル(ストリーム)を再生する機能がありますので
これを利用して再生したものをそのまま録音すればいいかと思います。
ストリーム同士を直接連結してどうにかする方法もあるのだろうとは思いますが。
とりあえず「'ここに書く処理 」をこんな感じで。
Set voice = CreateObject("Speech.SpVoice")
Set voice.AudioOutputStream = objOutputStream
voice.SpeakStream objInputStream
Set voice.AudioOutputStream = Nothing
ただ、やはりあまり質のいい変換結果にはならないようです。
Win2000でも動く
http://blog.livedoor.jp/blackwingcat/archives/1307612.html
>このサイトのアクセスが前日の1.5倍くらいになっているのは
でしょうね。私もText To WavがMicrosoft Speech Platformに
対応したので、こんなの出たんだと知りましたから。
やはり、ソフトが対応して初めて知る人が多く、
Microsoft Speech Platformの利用を広める為にも、
ソフト側で対応させる意味があるんだなぁと、再確認しました。
Re: Win2000でも動く
黒翼猫さんの知識と技術力はすごいですね。
自分もWinXPへの移行が遅く、Win2kはかなり使い込んだつもりではありますが、
Microsoft Speech Platformのインストールは間違いなく挫折していたと思います。
そしてMicrosoft Speech Platform、というより日本語音声合成の次のステージは
やはりOS(Windows)への標準搭載かなと思ったりしています。
次期Windowsで、例えば起動音が「こんにちは○○さん」になるだけでも
少なくとも日本では結構なインパクトをもって迎えられ、
PC雑誌なんかでも「今度のWindowsはしゃべる!」とか、
しばらくは世間的に大きく取り上げられ注目を浴びるのではないか?
と考えるのは自分の趣味に偏った欲目でしょうか(笑)。
それでは、また機会がありましたらお立ち寄りください。
フランス語
上記ダウンロードページからフランス語のファイルを取得して問題なく動作しました。
ありがとうございました。
Re: フランス語
お役にたてて何よりです。
フランス語の勉強でしょうか?
がんばってください(違ったらすみませんが)。