Javascript meSpeak.js-使用回调方法时不播放第二个单词

Javascript meSpeak.js-使用回调方法时不播放第二个单词,javascript,text-to-speech,intervals,Javascript,Text To Speech,Intervals,我已经使用来自的MeSpeak库编写了一些简单的javascript 如果输入脚本包含括号和数字(即-“[3]”将暂停3秒),我尝试在单词之间暂停几秒钟 我已经在其他地方看到了一种更优雅的方法,但是,让我感到困惑的是,为什么下面的代码不使用第二个词?(在FireFox版本25.0.1和meSpeak版本1.8.1中测试) 代码如下: <html> <head> <script src="mespeak.js"></script> &

我已经使用来自的MeSpeak库编写了一些简单的javascript

如果输入脚本包含括号和数字(即-“[3]”将暂停3秒),我尝试在单词之间暂停几秒钟

我已经在其他地方看到了一种更优雅的方法,但是,让我感到困惑的是,为什么下面的代码不使用第二个词?(在FireFox版本25.0.1和meSpeak版本1.8.1中测试)

代码如下:

<html>
  <head>
    <script src="mespeak.js"></script>
  </head>
  <body>
    <button onclick="speakdata('Testing Word [2]Another [3]Again [5]Blah')">Talk</button>
    <div id="audio"></div>
                <script>
                meSpeak.loadConfig("mespeak_config.json");
                meSpeak.loadVoice("voices/en/en-us.json");
                var t=0;
                var speechArr = [];
                var pauseArr = [];
                var len =0;
                var recurseLoop = 0;
                function speakdata(spokendata) {
                    var looper = new Boolean();
                    looper = true;
                    var posCount = new Number(0);
                    var pauseCount = new Number(0);                 
                    while (looper)
                    {
                        if (spokendata.substring(posCount).indexOf("[") == -1) {
                            speechArr.push(meSpeak.speak (spokendata.substring(posCount)),{ 'rawdata': true });
                            pauseArr.push(0);
                            len++;
                            looper = false;
                        } else {
                            if (posCount == 0) {
                                speechArr.push(meSpeak.speak(spokendata.substring(posCount,spokendata.indexOf("[")-1),{ 'rawdata': true }));
                                pauseArr.push(0);
                                len++;
                            }
                            pauseCount += parseInt(spokendata.substring(posCount).substring(spokendata.substring(posCount).indexOf("[")+1, spokendata.substring(posCount).indexOf("]")))
                            posCount = parseInt(posCount+spokendata.substring(posCount).indexOf("]")+1)
                                if (spokendata.substring(posCount).indexOf("[") != -1) {
                                    var posCount2 = spokendata.substring(posCount).indexOf("[");
                                    speechArr.push(meSpeak.speak(spokendata.substring(posCount,posCount2+posCount),{ 'rawdata': true }));
                                    pauseArr.push(pauseCount*1000);
                                    len++;
                                    posCount = posCount2+posCount
                                    looper = true;
                                } else {
                                    speechArr.push(meSpeak.speak(spokendata.substring(posCount),{ 'rawdata': true }));
                                    pauseArr.push(pauseCount*1000);
                                    len++;
                                    looper = false;
                                    }
                                }
                    }
                    setTimeout(function(){meSpeak.play(speechArr[0],1,playNext)},pauseArr[0]);
                    recurseLoop++;                  
                }

                function playNext() {
                    if (recurseLoop < len) {
                        setTimeout(function(){meSpeak.play(speechArr[recurseLoop],1,playNext)},pauseArr[recurseLoop]);
                        recurseLoop++;
                    }
                }
                </script>
  </body>
</html>

谈话
loadConfig(“meSpeak_config.json”);
loadVoice(“voices/en/en-us.json”);
var t=0;
var speechArr=[];
var PausArr=[];
var-len=0;
var recurseLoop=0;
函数speakdata(spokendata){
var looper=new Boolean();
looper=true;
var posCount=新编号(0);
var pauseCount=新编号(0);
while(活套)
{
if(spokendata.substring(posCount.indexOf(“[”)==-1){
speechArr.push(meSpeak.speak(spokendata.substring(posCount)),{'rawdata':true});
pausarr.push(0);
len++;
活套=假;
}否则{
if(posCount==0){
speechArr.push(meSpeak.speak(spokendata.substring(posCount,spokendata.indexOf(“[”)-1),{'rawdata':true}));
pausarr.push(0);
len++;
}
pauseCount+=parseInt(SpokeData.substring(posCount).substring(SpokeData.substring(posCount).indexOf(“[”+1,SpokeData.substring(posCount).indexOf(“]))
posCount=parseInt(posCount+spokendata.substring(posCount.indexOf(“])+1)
if(spokendata.substring(posCount.indexOf(“[”)!=-1){
var posCount2=spokendata.substring(posCount.indexOf(“[”);
speechArr.push(meSpeak.speak(spokendata.substring(posCount,posCount2+posCount),{'rawdata':true});
pauseArr.push(pausecoount*1000);
len++;
posCount=posCount2+posCount
looper=true;
}否则{
speechArr.push(meSpeak.speak(spokendata.substring(posCount),{'rawdata':true});
pauseArr.push(pausecoount*1000);
len++;
活套=假;
}
}
}
setTimeout(函数(){meSpeak.play(speechArr[0],1,playNext)},pausarr[0]);
递归LOP++;
}
函数playNext(){
if(递归LOOP
第一个if子句的括号中有一个错误:

if (spokendata.substring(posCount).indexOf("[") == -1) {
  speechArr.push(meSpeak.speak (spokendata.substring(posCount)),{ 'rawdata': true });
  /* ... */
} else {
  /* ... */
}
的确如此

  meSpeak( spokendata.substring(posCount) ), { 'rawdata': true }
其中“{rawdata':true}”未作为选项对象包含在speak()中。 (事实上,该对象形成了一个由逗号分隔的单独语句。)

So speak()返回“undefined”,因为调用它不是为了返回任何声音数据。 因此,未定义的将用作play()的参数(由于没有用于播放的声音数据,因此将失败)

你想要的是:

  speechArr.push(meSpeak.speak (spokendata.substring(posCount), { 'rawdata': true }));
其他:刚刚将meSpeak更新为v.1.8.3,该版本现在会记录转发到play()的任何错误类型。此外,在清理任何声音数据以解决Chrome的计时问题之前,现在有一个小的计时间隔(有时当达到报告的声音持续时间时,Chrome仍在播放)。此外,我们1)现在清理内部文件系统,2)返回一个新生成的唯一数组,以防调用speak()返回数组

直接在meSpeak中产生任何特殊间隙的方法:

a) 首先,最不可能的选项是:您可以使用“ssml”-选项尝试标记/HTML输入(可能任何标记都会产生任意长度的间隙)

b) 可能是最简单的选项:您可以使用换行符(“\n”)为“换行符”选项(例如“meSpeak.speak”(“这是一个\n暂停,{“换行符”:3})”)提供额外间隙的任何长度

c) 最后,您可以提供任何直接在输入字符串中产生暂停的音素(作为音素标记)。eSpeak文档为包含音素的输入字符串提供了以下示例:“[[D,是Iz”f@n“EtIk t'Ekst”输入]](见本页末尾)

关于音素,一般来说:“音素助记符可以直接用于输入espeak的文本中。它们用双方括号括起来。空格用于分隔单词,所有重音音节都必须明确标记。例如: [D,是Iz吗f@n‘EtIk t'Ekst’输入]]“()


eSpeak文档链接到以下资源,作为音素助记符的文档:

第一个if子句的括号中有一个错误:

if (spokendata.substring(posCount).indexOf("[") == -1) {
  speechArr.push(meSpeak.speak (spokendata.substring(posCount)),{ 'rawdata': true });
  /* ... */
} else {
  /* ... */
}
的确如此

  meSpeak( spokendata.substring(posCount) ), { 'rawdata': true }
其中“{rawdata':true}”未作为选项对象包含在speak()中。 (事实上,该对象形成了一个由逗号分隔的单独语句。)

So speak()返回“undefined”,因为调用它不是为了返回任何声音数据。 作为这个未定义的结果,然后作为一个参数来发挥作用
setTimeout(function(){meSpeak.play(speechArr[0],1,playNext)},pauseArr[0]);

function playNext() {
  if (++recurseLoop < len) {
    setTimeout(function(){meSpeak.play(speechArr[recurseLoop],1,playNext)},pauseArr[recurseLoop]);
  }
}
timeout to 0 Testing Word
playing "Testing Word"
timeout to 1 Another 
playing "Another "
timeout to 2 Again 
playing "Again "
timeout to 3 Blah
playing "Blah"
ended