转载地址:http://blog.csdn.net/purpleendurer/article/details/5750531
TTS是微软推出的一套文字朗读引擎(Text-To-Speech Engine),我们可以让它来为我们诵读网页中的文字信息,让眼睛休息一下。
在Microsoft Speech SDK 5.1的Samples/Scripts/SimpleTTS中已经提供了一个演示例子,不过是全英文的,在参考修改中遇到了一个问题,即
COM对象Sapi.SpVoice的实例变量的定义代码要和初始化及事件处理代码分开。
也就是说:Sapi.SpVoice的实例变量VoiceObj的定义代码:
- // Create the Sapi SpVoice object
- var VoiceObj = new ActiveXObject("Sapi.SpVoice");
要放在一个<script></script>中,或者放在一个.js文件中,如speak0.js。
Sapi.SpVoice的实例变量VoiceObj的初始化及事件处理代码:
- function InitializeControls()
- {
- // Initialize the Voices and AudioOutput Select boxes
- var VoicesToken = VoiceObj.GetVoices();
- var AudioOutputsToken = VoiceObj.GetAudioOutputs();
- }
- InitializeControls();
- function VoiceObj::EndStream()
- {
- idbSpeakText.value = "朗读";
- }
- function VoiceObj::StartStream()
- {
- idbSpeakText.value = "停止";
- }
要放在另一个<script></script>中,或者放在另一个.js文件中,如speak1.js。
常用API汇总:
- //创建 Sapi SpVoice object
- var VoiceObj = new ActiveXObject("Sapi.SpVoice");
-
- //朗读,使用
- VoiceObj.Speak(String,1); //'1'为语速
-
- //暂停,使用
- VoiceObj.Pause();
-
- //从暂停中继续刚才的朗读,使用
- VoiceObj.Resume();
-
- //停止功能
- VoiceObj.Speak("",2);
-
演示代码:
- <HTML>
- <HEAD>
- <SCRIPT LANGUAGE="JavaScript">
- // Create the Sapi SpVoice object
- var VoiceObj = new ActiveXObject("Sapi.SpVoice");
- </SCRIPT>
- <SCRIPT LANGUAGE="JavaScript">
- // Code in the BODY of the webpage is used to initialize controls and
- // to handle SAPI events
- /***** Initializer code *****/
- function InitializeControls()
- {
- // Initialize the Voices and AudioOutput Select boxes
- var VoicesToken = VoiceObj.GetVoices();
- var AudioOutputsToken = VoiceObj.GetAudioOutputs();
- }
- InitializeControls();
- // Handle EndStream event
- function VoiceObj::EndStream()
- {
- idbSpeakText.value = "朗读";
- }
- // Handle StartStream event
- function VoiceObj::StartStream()
- {
- idbSpeakText.value = "停止";
- }
- // SpeakText() function:
- // This function gets the text from the textbox and sends it to the
- // Voice object's Speak() function. The value "1" for the second
- // parameter corresponds to the SVSFlagsAsync value in the SpeechVoiceSpeakFlags
- // enumerated type.
- function SpeakText()
- {
- //alert(document.body.innerText);
- if (idbSpeakText.value == "朗读")
- {
- // Speak the string in the edit box
- try
- {
- VoiceObj.Speak(document.body.innerText, 1);
- }
- catch (exception)
- {
- alert("Error");
- }
- }
- else if(idbSpeakText.value == "停止")
- {
- // Speak empty string to Stop current speaking. The value "2" for
- // the second parameter corresponds to the SVSFPurgeBeforeSpeak
- // value in the SpeechVoiceSpeakFlags enumerated type.
- VoiceObj.Speak( "", 2);
- }
- }
- </script>
- <SCRIPT FOR="window" EVENT="OnQuit()" LANGUAGE="JavaScript">
- // Clean up voice object
- delete VoiceObj;
- </SCRIPT>
- </HEAD>
- <body>
- <BUTTON id="idbSpeakText" οnclick="SpeakText();">朗读</BUTTON>
- <P> 这场比赛跟我预想的一样,德国队被西班牙玩死了。</P>
- <P> 此前德国队横扫英格兰队和阿根廷队,立即吸引了众多墙头草,被捧为夺冠最大热门。</P>
- <P> 其实熟悉欧洲俱乐部赛事的人都知道,德国俱乐部球队遇上西班牙球队成绩都不太理想。即使在西班牙联赛中水平表现一般的赫塔菲都能给德甲领头羊拜仁慕尼黑制造难堪。作为西甲领头羊的巴萨这几年对德国球队更是捷报频传,对阵不莱梅、斯图加特、沙尔克04、拜仁慕尼黑,不仅比分占优,而且在控球、传球上的技术优势也非常明显。</P>
- <P> 此次西班牙对阵德国,西班牙队内首发的巴萨球员达到7人,除了巴尔德斯外,其他球员全部都上场了,普约尔和皮克坐镇后防线,哈维、布斯克茨、伊涅斯塔打中场,比利亚和佩德罗则打前锋。另外法布雷加斯和雷纳也出自巴萨青训营。而德国队首发阵容中来自拜仁的球员包括克洛泽、施魏因斯泰格和拉姆三人,如果不是托马斯-穆勒累积黄牌停赛,肯定也将是首发中的一员,而波多尔斯基和特罗肖夫斯基也曾在拜仁效力,另外替补席上的巴德施图贝尔、托尼-克罗斯、戈麦斯和布特也都是来自拜仁,也就是说这辆日尔曼战车同样有10名“拜仁帮”的球员。从一定意义上说,这场比赛就是 巴萨 vs 拜仁慕尼黑,西班牙队胜面很大。</P>
- </body>
- </html>
在Microsoft Speech SDK 5.1的Samples/Scripts/SimpleTTS中已经提供了一个演示例子:
<html>
<head><title>语音测试例子</title></head>
<body>
音量:
<input id="vol"></input>语速<input id="rat"></input>
<p>
朗读人:
<select id="speaker">
</select>
输出设备:
<select id="outputer">
</select>
<p>
<textarea id="text" rows="3" cols="80">
我们的教育真是问题成堆,很多情况下不是在培育英才而是在糟蹋人才。不上学大不了是个不识字的文盲,进校门后就可能成为弄虚作假的高手;不上大学可能还对学术有一份敬重,进大学后才知道学术是“什么玩艺儿”。一个人从幼儿园和小学开始,学校就逼着他如何搞形式,如何说假话,如何拉关系。只要在中国从幼儿园读到大学毕业,任何一个天真纯洁的孩子,都可能培养成为一个圆滑世故的老油条;任何一个真诚的儿童,都可能成为一个伪君子。
</textarea>
<p>
<button onClick="speak()">朗读</button><button onClick="stop()">停止</button>
<p>
<p id="test"></p>
<script >
var sap;
//初始化TTS
function init()
{
if(navigator.appName!="Microsoft Internet Explorer")
{
alert("请切换到IE内核");
return false;
}
try
{
sap= new ActiveXObject("Sapi.SpVoice");
}
catch(ex)
{
alert("初始化失败!"+ex);
return false;
}
if(sap==null)
{
alert("初始化失败!没有Sapi.SpVoice控件");
return false;
}
//
return true;
}
//初始化设置参数
function setting()
{
vol.value=sap.Volume;
rat.value=sap.Rate;
var VoicesToken = sap.GetVoices();
var AudioOutputsToken = sap.GetAudioOutputs();
//朗读引擎
for( var i=0; i <VoicesToken.Count; i++ )
{
var oOption = document.createElement("OPTION");
speaker.options.add(oOption);
oOption.innerText = VoicesToken.Item(i).GetDescription();
oOption.value = i;
}
//输出设备
for( var i=0; i <AudioOutputsToken.Count; i++ )
{
var oOption = document.createElement("OPTION");
outputer.options.add(oOption);
oOption.innerText = AudioOutputsToken.Item(i).GetDescription();
oOption.value = i;
}
}
//获取设置参数
function change()
{
try
{
sap.Volume=parseInt(vol.value);
sap.Rate=parseInt(rat.value);
sap.Voice = sap.GetVoices().Item(parseInt(speaker.value));
sap.AudioOutput = sap.GetAudioOutputs().Item(parseInt(speaker.value));
}
catch(err)
{
alert("设置出错!"+err);
}
}
if(init())
{
setting();
}
function speak()
{
change();
try
{
sap.speak(text.innerText,1);
}
catch(err)
{
alert("朗读出错");
}
}
function stop()
{
sap.speak("",2);
}
//语音朗读状态
function getStatus()
{
st=sap.Status;
msg="Status:"
+",\n CurrentStreamNumber:"+st.CurrentStreamNumber
+",\n InputSentenceLength:"+st.InputSentenceLength
+",\n InputSentencePosition:"+st.InputSentencePosition
+",\n InputWordLength:"+st.InputWordLength
+",\n InputWordPosition:"+st.InputWordPosition
+",\n InputWord:"+text.innerText.substring(st.InputWordPosition,st.InputWordPosition+st.InputWordLength )
+",\n LastBookmark :"+st.LastBookmark
+",\n LastBookmarkId :"+st.LastBookmarkId
+",\n LastHResult :"+st.LastHResult
+",\n LastStreamNumberQueued :"+st.LastStreamNumberQueued
+",\n PhonemeId :"+st.PhonemeId
+",\n RunningState :"+st.RunningState
+",\n VisemeId :"+st.PhonemeId
;
test.innerText=msg;
}
//getStatus();
setInterval("getStatus()",100);
</script>
</body>
</html>