スポンサーリンク

Windowsバッチで,手軽に日本語テキストを自動読み上げ(Text To Speech)する方法 …WSHでSAPIやSpeech.SpVoiceを使う音声合成の手順とサンプルコード


バッチで,手軽に文章を音声で読み上げよう。


Windowsには,Text To Speech(=TTS)のAPIが無料で提供されている。

英語や日本語の文章を動的にスピーカーから出力したり,読み上げ結果をWAVファイルに保存したりすることも簡単だ。


以下のサンプルコードは,WSH/JScriptで記述する。


(1)英語で読み上げて,スピーカーから出力(SAPI.SpVoice)

まずWindowsのデフォルトの機能で「SAPI.SpVoice」というのがある。

この機能を使うと,バッチで手軽に音声による自動読み上げができる。


下記のコードをhoge.jsで保存してダブルクリック:

var tts = WScript.CreateObject("SAPI.SpVoice");

tts.Speak("Hello world! おはよう! Konnichiwa!");

これを実行すると,まずHello, worldが英語で発音される。

残念ながらここでは,日本語の部分は無視される。

次いで,ローマ字表記の部分が英語的に読み上げられ,「コーニティーワ」と聞こえる。


非常に簡単に,英語の自動読み上げが実装できる。


参考:

あなたの Windows PC は男性 ? それとも女性 ? | スラッシュドット・ジャパン
http://slashdot.jp/story/11/02/14/032...

  • Windows 上でメモ帳かテキストエディタで CreateObject("SAPI.SpVoice").Speak"I love you" と入力


VBスクリプトについてかなり昔に有名(?)になった「...
http://detail.chiebukuro.yahoo.co.jp/...

  • かなり昔に有名(?)になった 「メモ帳を開いて[CreateObject("SAPI.SpVoice").Speak"Hello world"]をコピペ それを[***.vbs]で保存するとコンピューターの性別がわかる」 なんていうVBスクリプト


VBScript Tutorial - 日本語
http://www.instructables.com/id/VBScr...

  • Set Sapi = Wscript.CreateObject("SAPI.SpVoice") Sapi.speak "Hello."

この"SAPI.SpVoice"に長い文章を読み上げさせたい場合,

いろいろと制御の方法は存在する。

短文に区切って,文章を配列として渡すとか。

EXCELのVBAマクロでHTMLの文書を読み上げるプログラムを作っています。
http://detail.chiebukuro.yahoo.co.jp/...

  • 短い文章に分けて何回か連続して実行すれば長い文章のように聞こえます。タグごとに分割するか, 文字数で分割するか
  • しゃべっている間は実行中なら 次の行には進まないので 他の処理はできません

(2)英語で読み上げて,WAVファイルとして保存(同SAPI.SpVoice)

この「SAPI」は,読み上げ結果の出力先を,音声ファイルとすることもできる。

つまり,音声の読み上げWAVファイルをバッチから生成できるのだ。

下記をhoge2.jsとして保存:

var tts    = WScript.CreateObject("SAPI.SpVoice");
var stream = WScript.CreateObject("SAPI.SpFileStream");


// ストリームを開いて
stream.open( "fuga.wav", 3 );

// TTSの読み上げ先をストリームにセット
tts.AudioOutputStream = stream;

// しゃべる(WAVに書き込みされる)
tts.Speak("Hello world! Konnichiwa!");
tts.Speak("I think that that that that that boy wrote is wrong."); // 英語の早口言葉

// ストリームを閉じる
stream.close();

これをダブルクリックで実行すると,すぐに同じフォルダ上にWAVが生成される。

Speakメソッドに渡した内容が,ちゃんと英語の音声として記録されている。


Windowsにもとからある機能だけを使って,WSHでここまで可能というのはなかなかすごい。


参考:

SAPI5の音声ファイルを作るWSHスクリプト: takayanの雑記帳
http://neu101.seesaa.net/article/9312...

  • wavファイルに変換 stream.open( wavName, 3 ); voice.AudioOutputStream = stream;


I think that that that that that boy wrote is wrong.これってどうい...
http://detail.chiebukuro.yahoo.co.jp/...

  • 私はあの少年が書いたあの「that」は間違っていると思う。

(3)日本語テキストを読み上げるための無料ツールを導入(Speech.SpVoice)

SAPI.SpVoiceでは英語の音声読み上げだけだったが,

Speech.SpVoiceという最近の追加機能があって,日本語の読み上げも可能になった。


Speech.SpVoiceの機能のランタイムは,無料でマイクロソフトのサイトから入手できる。


ちなみにこのランタイムは,Windows Vista以降にのみインストール可能ということになっている。

(XPのサポート期間が切れた手前,XPでも動きます,とは公言できないのだ。でもWindows XPでも正常に動くのでご安心を。)

Windows 7なら,32ビットでも64ビットでも大丈夫。

Microsoft Speech Platform Version 11が公開されました。 | 初心者備忘録
http://www.ka-net.org/blog/?p=291

  • Runtimeの動作環境としてサポートされているのは”Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows Vista“となっていましたが、Windows XPでも動作確認できました


注意点として,ランタイムのバージョンがずれていると,インストールが成功しない。

事前に,コンパネ>プログラムと機能 から,

「Microsoft Server Speech 〜〜」と名前のつくものを探して,もしあればアンインストールしておこう。

下記では,バージョン11のランタイムをインストールする。



まず,下記のURLから基本ランタイムをダウンロードしてインストール。

Download Microsoft Speech Platform - Runtime (Version 11) from Official Microsoft Download Center
http://www.microsoft.com/en-us/downlo...

  • Allows developers to build and deploy Speech Recognition and Text-to-Speech applications

ダウンロードするファイルのファイル名:

64ビット版:
Runtime\x64\SpeechPlatformRuntime.msi

32ビット版:
Runtime\x86\SpeechPlatformRuntime.msi


64ビットOSでも,両方インストールすること。(実行時に不具合が出なくてすむ)



次に,下記のURLから,日本語のランゲージパックを入手する。

Download Microsoft Speech Platform - Runtime Languages (Version 11) from Official Microsoft Download Center
http://www.microsoft.com/en-us/downlo...

  • Speech Recognition and Text-to-Speech Engines for Microsoft supported Languages

日本語の読み上げは

  • LangPacks\MSSpeech_SR_ja-JP_TELE.msi

だ。下記のファイルは読み上げではなく,音声認識なので関係ない。

  • LangPacks\MSSpeech_TTS_ja-JP_Haruka.msi


インストールは無言で,ほぼ一瞬。


これでSpeech.SpVoiceの準備ができた。


参考:

COM講座第5回 - K3 計算技術研究会
http://k3tec.net/neko_wiki/index.php?...

  • 合成音声でしゃべらせるにはSpeechPlatformRuntimeが必要です。fileSpeechPlatformRuntime.msi
  • 日本語を喋らせるには日本語用の合成音声パックが必要です。 fileMSSpeech_TTS_ja-JP_Haruka.msi それぞれインストールします


黒い野良猫の日常: 音声読み上げ
http://blackstraycatreboot.blogspot.j...

  • windows7になってからSAPI.SpVoiceがまぁデフォルト英語のみでして不便だったんですが,Speech.SpVoiceを別途インストールすれば問題ない
  • まず実行に必要なランタイム。64bit:Runtime\x64\SpeechPlatformRuntime.msi  32bit:Runtime\x86\SpeechPlatformRuntime.msi  アプリ側が対象を判定するような場合,64bitならば両方インストールします
  • 次に音声合成エンジン。LangPacks\MSSpeech_TTS_ja-JP_Haruka.msi  をインストール。基本ランタイムがインストールされていないと動かないので注意


無料の音声合成エンジン 「Microsoft Speech Platform 11」::まほろば
http://mahoro-ba.net/index.php?j=1541

  • 旧バージョンと共存できないため、既に、Version 10.2 をインストールされている方は、事前にアンインストールが必要です

(4)日本語のテキスト読み上げ(Speech.SpVoice)

バッチで日本語を読み上げてみよう。


下記の内容をhoge3.jsで保存してダブルクリック:

var tts = WScript.CreateObject("Speech.SpVoice");
tts.Rate = 4; // 読み上げ速度は速め

// 読み上げ内容を動的に変更しながら読み上げる
for( var i = 1; i <= 10; i++ ){

	tts.Speak( i + "本でもニンジン。");

}

これを実行すると,「1本でもニンジン,2本でもニンジン,・・・,10本でもニンジン」と発音される。


読み上げの速度は,動的に変更できる。

下記の内容をhoge4.jsで保存してダブルクリック:

var tts = WScript.CreateObject("Speech.SpVoice");

tts.Speak("庭には二羽ニワトリがいる。");


// スピードを変更しながら繰り返し読み上げる
for( var i = 10; i >= -10; i -= 5 ){
	
	tts.Rate = i;
	
	tts.Speak("隣の客はよく柿食う客だ。");

}

読み上げのスピード(Rate)を-10に落とすと,ものすごくまどろっこしいが。


このように,ちゃんと日本語で読み上げてくれる。

日本人ならSAPIではなくSpeech.SpVoiceを使おう。


このコードを見て気がつくかもしれないが,使い方は(1)のSAPIのコードをまったく同じだ。

ただCreateObjectの際にSpeech.SpVoiceと指定する部分だけが異なる。

Microsoft Speech Platform の日本語音声合成エンジン - 電脳スピーチ blog
http://denspe.blog84.fc2.com/blog-ent...

  • いつの間にか(Microsoft Office 2010 に合わせて?)Microsoft 社から日本語の音声合成エンジンが(タダで!)ダウンロードできるようになっていた
  • SAPI5 は sapi.dll という DLL ファイルで実装されており、例えば JavaScript でこれを利用する場合は最初に「var VoiceObject=new ActiveXObject("SAPI.SpVoice");」という風に書きます
  • 対して Microsoft Speech Platform は mssps.dll に実装されており、JavaScript では「var VoiceObject=new ActiveXObject("Speech.SpVoice");」とする必要があります。 違いはたったこれだけのことで、そのあとの生成した Voice オブジェクトの利用方法などは両者とも全く同じ


電脳スピーチ blog Microsoft Speech Platform の日本語音声合成エンジン
http://denspe.blog84.fc2.com/?mode=m&...

  • 日本語でテキストを読み上げてWAVファイルに保存するサンプルコード
  • Set voice = CreateObject("Speech.SpVoice") Set stream = CreateObject("Speech.SpFileStream") stream.open "test.wav", 3 voice.AudioOutputStream = stream voice.Speak "本日は晴天なり。", 0 stream.close()


日本語で読み上げた内容をWAVファイルに書き出すことももちろん可能。

var tts    = WScript.CreateObject("Speech.SpVoice");
var stream = WScript.CreateObject("Speech.SpFileStream");


// ストリームを開いて
stream.open( "hoge.wav", 3 );

// TTSの読み上げ先をストリームにセット
tts.AudioOutputStream = stream;

// しゃべる(WAVに書き込みされる)
tts.Speak("こんにちは世界!ぁぁ。。。ゅぅぅっゎゃぁ。。。");

// ストリームを閉じる
stream.close();


もし難しい文章を間違えずに音読させたい場合は,
kakasiコマンドを使ってかな変換してから読ませる,
という手もある。

Windowsで「kakasi」のコマンドを使い,日本語文章を単語に分解,ローマ字変換する方法 (kakasiで形態素解析するWindowsバッチのサンプルコード)
http://language-and-engineering.hatenablog.jp/entry/20150109/KakasiOnWindowsU...


これで,Windows上で無料で,何の制限も無く日本語の音声合成が可能になった。

「AquesTalk」のような音声合成エンジンを使わなくても済むようになる。

日本語のオンライン音声合成のWebサービスを10分で作る方法 (AquestalkでASP)
http://language-and-engineering.hatenablog.jp/entry/20081025/1224869272

  • 「AquesTalk」という日本語音声合成用のフリーのDLLが存在し,親切な事にサンプルコードも提供されている


関連する記事:

Windowsバッチで,iTunesのプレイリストを読み書きして,音楽ファイルをまとめて抽出する方法 (WSH/JScriptでiTunesを自動操作)
http://language-and-engineering.hatenablog.jp/entry/20150114/iTunesAutomation...


コマンドラインからwaveファイルを作る方法  (テキストを.wavに変換)
http://language-and-engineering.hatenablog.jp/entry/20081107/1226080582


バッチで,wavなどの音声を再生しよう (コマンドプロンプトから音を鳴らす方法)
http://language-and-engineering.hatenablog.jp/entry/20100729/p1


iTunesで管理している音楽の「ボーカルキャンセル版」を作成する方法
http://language-and-engineering.hatenablog.jp/entry/20120128/p1


Androidで音声入力した内容を認識し,そのまま音声合成。「おうむ返し」アプリのソースコード
http://language-and-engineering.hatenablog.jp/entry/20121022/p1