スポンサーリンク

日本語のオンライン音声合成のWebサービスを10分で作る方法 (AquestalkでASP)


下記の記事がはてブにエントリーされていた。

JavaScript などで英語を喋らせる方法
http://builder.japan.zdnet.com/member/u336453/blog/2008/10/22/entry_27017272/


便乗して,一言書いておこうと思う。


日本語の音声をWebサイト上で音声合成し,しゃべらせるようなサービスはたった10分でできる。

その合成した音声をJavaScriptから呼び出すような事も,当然できる。



以下,そのシステムの作り方の概要。



システム概要


(1)ブラウザはサーバに,日本語の文字列を送信する。

(2)サーバはブラウザに,文字列を音声合成したwavファイルを返却する。

(3)ブラウザは,受け取ったwavファイルを,煮るなり,焼くなり,JavaScriptで呼び出すなり,自由に扱える。



(1)は普通のフォームだし,(3)も普通のwavダウンロードと同じ。
(2)で音声合成ソフトへのパイプを行なう所がポイントか。


(1)日本語文字列を送信するフォーム


a.html上にテキストボックスがある。

このボックスに日本語文字列(ひらがな限定)を入力し,送信ボタンを押すと,b.phpへ送信される。

methodはPOSTとする。

(ごくありきたりのformですね)


(2)PHPからパイプで音声合成

送信された文字列を $_POST[〜] で受け取る。(かりに $str とする)

そして,その文字列を,サーバ上の音声合成ソフト(かりに c.exe とする)にパイプで渡す。

	shell_exec( "c.exe " . $str );

そうすれば, c.exe は $str の内容を wav にして,特定のフォルダ上にファイルとして保存してくれる。



…という風にするためには,もちろん,まずコマンドラインで動作するような音声合成ソフトをあらかじめ作っておく必要がある。


しかしこれも簡単。


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

AquesTalkのダウンロード
http://www.a-quest.com/aquestalk/index_win.html

プログラミングガイドに,Visual C++ でのサンプルコードが載っている。(HelloTalk.cpp)
http://www.a-quest.com/aquestalk/prog_guide.pdf


なぜVBでは駄目かというと,VBにはポインタがないからだ。
メモリ上に生成された音声データを拾ってくる術がない。(VBを使っていてこれほど悲しくなる事はない。)


どうしてもVBでAquestalkを利用したいのなら,メモリにアクセスするためのDLLをVC++で作成し,そのDLLをVBで呼び出す,という手も一応ある。

メモリにアクセスする方法
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200202/02020002.txt

脇道にそれたが,とにかく,上記のプログラミングガイドに載っているままのコードをほんの少し書き変える。


引数に合成対象の文字列を取るようにすれば,任意の日本語文字列をwavファイルに変換できるようになる。

出力ファイル名も実行時に指定できるとよいだろう。


コンパイルし,c.exe で保存。それを b.php と同じディレクトリに設置。



b.phpは,この出力wavファイルへのリンクを作成・表示する。
(リンクではなくてもよい。例えば,JavaScriptのコードの一部という形式でよい。)


(3)ブラウザでwavを読み込み

ブラウザにb.phpが表示され,ユーザはwavのリンクをクリックし,wavをダウンロード。

クリック不要で自動再生にしてもよい。

WindowsMediaPlayer埋め込み用タグ自動生成
http://www.interq.or.jp/blue/inside/sourcemake/sourcemaker_w.html


もしくは,画面遷移をカットして,隠しiframeでb.phpを呼び出してもよい。(Ajaxでバイナリデータが扱えないので)

「文字列を渡してiframeで開く」までの過程をJavaScriptの一つの関数にやらせる事にすれば,「JavaScriptに日本語をしゃべらせる」事ができる。


なお,wavファイルをユーザにダウンロードさせたくないなら,Flash中でmp3をロードするようにすればいい。

この場合,音声合成実行時に,サーバ側でLAMEなどエンコードソフトを使ってmp3に変換しておく必要がある。


(4)ASPとして世の中に送り出す

(1)〜(3)をローカルのApacheで作成する。(サーバをレンタルする必要はない)


もし自分の契約しているプロバイダが固定IPであれば,ダイナミックDNS (DDNS)を使って,自分のPCに対し無料でドメインを割り当てることができる。

つまり,自宅PCのlocalhostで作ったWebアプリケーションを世の中の人達に利用してもらうため,個性的なドメイン名を使ってサービスを紹介+宣伝することができるわけだ。

Dynamic DO!.jp
http://ddo.jp/

固定IPが取得できない場合であっても問題ない。

DiceというフリーウェアをPCに常駐させておき,DDO-jpに定期的にIPアドレスを通知すればよいのだ。

自宅でインターネットサーバを立ち上げよう
http://www.hi-ho.ne.jp/yoshihiro_e/dice/

こうして,(1)〜(3)で作成したサービスが一人前のASPになったので,あとはサービス開始をネット上で告知するだけ。

(ただし,AquesTalkの作者様に連絡しておく必要があるかどうか,十分確認すること。)


必要な環境(VisualStudio+XAMPPなど)さえインストールされていれば,ここまで10分でできる。

費用は0円。


応用

このようなオンライン音声合成サービスが現れたら,何の役に立つだろうか。


音声合成ソフト自体がフリーで簡単に手に入る世の中なので,「オンラインで実行可能」である事の利点を生みださなければならない。

単に「合成ソフトがクラウドみたいになりました!!」では,需要が低すぎる。



一つの例として,エンターテイメント目的でFlashの中に動的な発話キャラクターを仕込むことができるのではないか。

現在時刻や入力した氏名を,Flash中のキャラクターにしゃべらせるような事は簡単にできる。(音質が問題になるが)


もうひとつは,テレフォニー目的で音声を作るというもの。

こちらは,すでにAquestalkがAsteriskの世界で使われるようになりだしていることから,一定の利用が見込まれる。

Asterisk を 試すメモシリーズ 音声合成 AquesTalk をAsteriskで試すメモ
http://asterisk.s242.xrea.com/aquestalk-a0.html

しかし,単独のWebサービスとしてとして生き残る事は難しいだろう。

音声合成ページに広告を貼り付けたところで,そのPC(自宅サーバ)を常時稼働させて置いた場合,インプレッション料だけではPCの電気代もまかなえないはず。

合成されるwavファイルの前後に音声広告を入れられるかというと,それほどのマーケットもない。



概念は大変面白いと思うのだが。

合成音をストリーミングで再生してくれるサイトならいくつかあるが,wavファイルそのものが手に入るサービスというのはみかけない。





誰かこのアイデアをうまくビジネスにしてくれませんか。


私はというと,寝るときには静かに寝るためPCの電源は切っておきたいので,やりません。 あしからず。