--/-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

09/04 2010

vdsフリーでvdsSpeakFinishCallbackを克服する!

 合成音声による聖書の音読を1日1章読む無料ブログソフトDTリスニングでお世話になっているのがWeb合成音声配信システムvoice delivery systemです。ウェブ上でテキストを合成音声読み上げしてくれるAPIです。1ヶ月5万字まで読み上げてくれる無料版があります。これほど優れた技術を無料で提供してくださるので、本当に感謝なことです。

 さて、vdsの無料版には、プログラム上、ちょっと困った点があります。それはvdsSpeakFinishCallback関数が使えないという点です。文章の読み上げが終了した時に呼び出される関数なのですが、有償版のみ使用ができることになっています。長文の読み上げには結構重要な関数なのです。といいますのも、vdsは読み込んだテキストをリアルタイムで音声にしてflashで再生する仕組みなので、その仕組み上、長文を一回ですべて読み込ませるとパンクしてしまいます。1000文字以内に細切れにしていく必要があるわけですが、そのときに「前の文章を読み終えたので、続けて次の文章を読んでください」という指示をプログラムしなければなりません。そのときに文章を読み終えたことを告げてくれるvdsSpeakFinishCallback関数をどうしても使いたくなるのです。これが使えればデモのような、読み上げの進行に合わせて、読み上げ部分を視覚的に示すようなことができるようになります。

 でもなんとかして無償版のまま文章を継続して読み続けたい!デモのようなことができるようになりたい!しかもvdsSpeakFinishCallback関数を利用せずに成し遂げたい!そんな願いを、音声の出力中であるか否かを調べるisSpeakingメソッド(無料版でも仕えるメソッド)のみを使ってやってみました・・・

isSpeakingメソッドによる連続読み上げデモ


 isSpeakingメソッドによるデモ

ソース(Javascript & jQuery)

var vdsp;
var vds;
window.onload=function(){
  try{
    vdsp = new VoiceDeliveryPlayer("vdsp");
    vds = new VoiceDelivery(vdsp, "vds");
    vds.setCast("KeikoJPf");
  } catch(e) {
    alert("Cannot Create Object");
  }
}

function readOut(){
  buf = (document.getElementById("readOutHere")).innerHTML;
  text = buf.split("。");
  text_len = text.length;
  tmp = "<div id='readOutHere'>";
  for(var i = 0; i < text_len; i++){
    tmp += "
<span>"+text[i] + "</span>";
  }
  tmp += "
</div>";
  $('#readOutHere').replaceWith(tmp);
  readOnebyOne(0,text_len);
}
            
function readOnebyOne(i,max){
  vds.speak($("
div#readOutHere span:eq("+i+")").text());
  $("
div#readOutHere span").css('background','none');
  $("div#readOutHere span:eq("+i+")").css('background-color','#f69');
  $.timer(100function (timer{
    if(vdsp.isSpeaking()==1){
      timer.stop();
      $.timer(100function (timer{
        if(vdsp.isSpeaking()==0){
          timer.stop();
          if(i+1<max){
            i++;
            readOnebyOne(i,max);
          }else{
            $("div#readOutHere span").css('background','none');
          }
        }
      });
    }
  });
}
注1:jQueryを使っています。
注2:jQueryのプラグインTimerを使っています。

解説

 readOut関数は、vdspeakFinishCallbackのデモとほぼ同じで、id="readOutHere"のdivタグで囲まれた日本語文章を「。」毎に区切ってspanタグで囲み、順番に読み上げていく準備をする関数です。spanタグにidをふらない、簡素な方法に改良しています。

 注目はreadOnebyOne関数です。この中で2つのタイマーが入れ子で二重になっています。内側のタイマーは「音声出力があるのをチェックし続けて、音声出力がなくなったら(つまり、1つの文章を読み終えたら)次の文章読み上げへと外側のタイマーへ飛ぶ」ためのタイマーです。そして外側のタイマーは「音声出力がない(つまり、vdsが1つの文章を読み上げ始めるための準備中である)のをチェックし続けて、音声出力が始まったら(つまり、vdsが音読準備を完了して1つの文章を読み上げ始めたら)、内側のタイマーへと飛ぶ」ためのタイマーです。外と内のタイマーを交互に稼働させながら、次々に文章を読み進める、というアルゴリズムです。以下のようなタイムテーブルです。

(1)文章1を読む準備をする・・・・・・・・・(isSpeaking==0 外タイマーでチェック)
(2)文章1を読む準備が完了して読み始める・・(isSpeaking==1 外から内タイマーへ)
(3)文章1を読む・・・・・・・・・・・・・・(isSpeaking==1 内タイマーでチェック)
(4)文章1を読み終え、文章2を読む準備をする(isSpeaking==0 内から外タイマーへ)
 ・
 ・
 ・

 これでDTリスニングも無料での配布が可能となりました。vds無償版にisSpeakingメソッドを残してくださったことに感謝!


blog comments powered by Disqus
このページのTOPへ
聖書リスニング
DTメンバー募集(無料!)

Devotion Timeのメルマガメンバーになりませんか!メンバー限定企画もあり!ご希望の方はメールアドレスを入力して下さい。(さらに詳しく >>)

Profile

ブロガー: 西原智彦
1972年広島生まれ。ロボットが好きで工学修士に(1996)。聖書に惚れ込み、実践神学修士に(2005)。(さらに詳しく >>)

カテゴリ
お問い合わせフォーム

個人的な感想、ご質問にどうぞ

お名前(ハンドルネームOKです):
メールアドレス:
件名:
本文:

Copyright © Devotion Time All Rights Reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。