您的位置:首页 > 其它

[语音合成技术第一讲]web 页面中使用语音合成技术

2006-12-19 16:57 405 查看
web 页面中使用语音合成技术


前言:
语音合成技术其实并没有什么神秘的,也不像想象中的那么繁杂。今天我就与大家一起来看一下,怎么让我们网页为我们朗读文本。怎样做到在web中进行语音合成 。我也将使用最短的代码,最通俗话语来完成这篇文章。

环境要求:
首先我们需要一个微软的Speech SDK 5.1的安装包(当然你的机器的操作系统版本要在windows2000以上的这个范畴),来使得我们的机器具有语音识别的功能。安装包,您可以在这里找到:
http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en

安装说明:

· If you want to download sample code, documentation, SAPI, and the U.S. English Speech engines for development purposes, download the Speech SDK 5.1 file (SpeechSDK51.exe).
· If you want to use the Japanese and Simplified Chinese engines for development purposes, download the Speech SDK 5.1 Language Pack file (SpeechSDK51LangPack.exe) in addition to the Speech SDK 5.1 file.
· If you want to redistribute the Speech API and/or the Speech engines to integrate and ship as a part of your product, download the Speech 5.1 SDK Redistributables file (SpeechSDK51MSM.exe).
· If you want to get only the Mike and Mary voices redistributable for Windows XP, download Mike and Mary redistributables (Sp5TTIntXP.exe).
· If you only want the documentation, download the Documentation file (sapi.chm).
其实上面这些可以不看,请您下载并安装SpeechSDK51.exe 和 SpeechSDK51LangPack.exe 就可以了。

让我们开始:
环境已经准备好了,那就让我们正式开始吧。

首先我们需要一个能够"发声"的对象,暂时我们就称他为" 朗读人"。在不同的语音合成的程序中,他所出现的形式也是不同的,当然这是后话,以后我再告诉你(嘿嘿,不是卖关子,这是第一讲,咱们先让它能说话了先)。

在web 应用程序的 html 代码中创建" 朗读人"对象:



// Create the Sapi SpVoice object


var VoiceObj = new ActiveXObject("Sapi.SpVoice");


上面的代码是创建一个" 朗读人"对象,我们要将这个写在js中(有点废话,呵呵)。


下面的代码将告诉我们" 朗读人"是如何工作的:



VoiceObj.Speak(“hello world”);



下面的代码告诉了我们如何销毁我们的" 朗读人"



// Clean up voice object


delete VoiceObj;



当您如果读到了这里,我首先要感谢您的耐心。与此同时我也要恭喜你了,如果您是一个敏感的程序员。这个时候您可能已经开始编写您自己的语音合成代码了。因为我们知道了,如何创建对象,如何使用对象的方法,和如何delete它。


当然这些还远远不够,让我们再做的更好些:

控制声音的属性

控制音量(1~100):



VoiceObj.Volume = 80 ;


控制语速(-10~10)



VoiceObj.Rate = 0;

控制朗读人的声音


VoiceObj.Voice = "Microsoft Anna";

控制朗读人的硬件设备输出


VoiceObj.AudioOutput = "SoundMax Integrated";

好了 该知道的 我们都已经知道了 , 再让我们看一个完整的例子来结束我们这一次的语音合成的学习。

完整的例子:




<!-- Copyright @ 2001 Microsoft Corporation All Rights Reserved. -->


<HTML>


<HEAD>


<META HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8">


<TITLE>TTS Demo</TITLE>






<SCRIPT LANGUAGE="JavaScript">...




// Create the Sapi SpVoice object


var VoiceObj = new ActiveXObject("Sapi.SpVoice");




// ChangeVoice() function:


// This function sets the newly selected voice choice from the Voice


// Select box on the Voice object.




function ChangeVoice() ...{


var i = parseInt( idsVoices.value );


VoiceObj.Voice = VoiceObj.GetVoices().Item(i);


}




// ChangeAudioOutput() function:


// This function sets the newly selected audio output choice from the


// Audio Output Select box on the Voice object.




function ChangeAudioOutput() ...{


var i = parseInt( idsAudioOutputs.value );


VoiceObj.AudioOutput = VoiceObj.GetAudioOutputs().Item(i);


}




// IncRate() function:


// This function increases the speaking rate by 1 up to a maximum


// of 10.




function IncRate() ...{


if( VoiceObj.Rate < 10 )




...{


VoiceObj.Rate = VoiceObj.Rate + 1;


}


}




// DecRate() function:


// This function decreases the speaking rate by -1 down to a minimum


// of -10.




function DecRate() ...{


if( VoiceObj.Rate > -10 )




...{


VoiceObj.Rate = VoiceObj.Rate - 1;


}


}




// IncVol() function:


// This function increases the speaking volume by 10 up to a maximum


// of 100.




function IncVol() ...{


if( VoiceObj.Volume < 100 )




...{


VoiceObj.Volume = VoiceObj.Volume + 10;


}


}




// DecVol() function:


// This function decreases the speaking volume by -10 down to a minimum


// of 0.




function DecVol() ...{


if( VoiceObj.Volume > 9 )




...{


VoiceObj.Volume = VoiceObj.Volume - 10;


}


}




// 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() ...{


if( idbSpeakText.value == "SpeakText" )




...{


// Speak the string in the edit box


try




...{


VoiceObj.Speak( idTextBox.value );


}


catch(exception)




...{


alert("Speak error");


}


}


else if( idbSpeakText.value == "Stop" )




...{


// 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( "");


}


}




</SCRIPT>






<SCRIPT FOR="window" EVENT="OnQuit()" LANGUAGE="JavaScript">...


// Clean up voice object


delete VoiceObj;


</SCRIPT>




</HEAD>












<BODY>


<H1 align=center>Simple TTS (DHTML)</H1>


<H1 align=center><FONT size=3>        </FONT>


<IMG alt="" border=2 hspace=0 id=idImage src="mouthclo.bmp">  </H1>


<H1 align=center>


<TEXTAREA ID=idTextBox COLS=50 ROWS=10 WRAP=VIRTUAL>Enter text you wish spoken here</TEXTAREA>


</H1>




<P align=center><STRONG><STRONG>


Rate <STRONG>


<INPUT id=idbIncRate name=button1 type=button onclick=IncRate() value=" + "></STRONG> 


<INPUT id=idbDecRate name=button2 type=button onclick=DecRate() value=" - " style="LEFT: 237px; TOP: 292px">     </STRONG> 




Volume <STRONG><STRONG>


<INPUT id=idbIncVol name=button3 onclick=IncVol() style="LEFT: 67px; TOP: 318px" type=button value=" + "> 


<INPUT id=idbDecVol name=button4 onclick=DecVol() type=button value=" - " style="LEFT: 134px; TOP: 377px">


</STRONG></STRONG></STRONG></P>





<P align=center><STRONG><BUTTON id=idbSpeakText onclick=SpeakText();


style="HEIGHT: 24px; LEFT: 363px; TOP: 332px; WIDTH: 178px">SpeakText</BUTTON></STRONG></P>





<P align=center><STRONG>Voice                                             


<STRONG>Audio Output </STRONG></STRONG></P>


<P align=center>




<SELECT id=idsVoices name=Voices onchange=ChangeVoice() style="FONT-FAMILY: serif; HEIGHT: 21px; WIDTH: 179px"> </SELECT>


           




<SELECT id=idsAudioOutputs name=AudioOutputs onchange=ChangeAudioOutput() style="HEIGHT: 22px; WIDTH: 179px"> </SELECT>









<SCRIPT LANGUAGE="JavaScript">...


// Code in the BODY of the webpage is used to initialize controls and


// to handle SAPI events






/**//***** Initializer code *****/


InitializeControls();




function InitializeControls()




...{


// Initialize the Voices and AudioOutput Select boxes


var VoicesToken = VoiceObj.GetVoices();


var AudioOutputsToken = VoiceObj.GetAudioOutputs();




// Add correct strings to Voice Select box


for( var i=0; i<VoicesToken.Count; i++ )




...{


var oOption = document.createElement("OPTION");


idsVoices.options.add(oOption);


oOption.innerText = VoicesToken.Item(i).GetDescription();


oOption.value = i;


}




// Add correct strings to Audio Output Select box


for( var i=0; i<AudioOutputsToken.Count; i++ )




...{


var oOption = document.createElement("OPTION");


idsAudioOutputs.options.add(oOption);


oOption.innerText = AudioOutputsToken.Item(i).GetDescription();


oOption.value = i;


}


}






/**//***** Event handling code *****/


// These functions are used to handle the SAPI events




// Handle StartStream event




function VoiceObj::StartStream() ...{


idbSpeakText.value = "Stop";


}




// Handle EndStream event




function VoiceObj::EndStream() ...{


idbSpeakText.value = "SpeakText";


idImage.src = "mouthclo.bmp";


}




// Handle Viseme event




function VoiceObj::Viseme(StreamNum, StreamPos, Duration, VisemeType, Feature, VisemeId) ...{


// Map the VisemeId to the appropriate .bmp


if( VisemeId == 15 || VisemeId == 17 || VisemeId == 18 || VisemeId ==21 )




...{


idImage.src = "mouthop1.bmp";


}


else if( VisemeId == 14 || VisemeId == 16 || VisemeId == 19 || VisemeId == 20 )




...{


idImage.src = "mouthop2.bmp";


}


else if( VisemeId == 4 || VisemeId == 6 || VisemeId == 9 || VisemeId == 12 )




...{


idImage.src = "mouthop3.bmp";


}


else if( VisemeId == 1 || VisemeId == 2 || VisemeId == 3 || VisemeId == 11 )




...{


idImage.src = "mouthop4.bmp";


}


else if( VisemeId == 7 || VisemeId == 8 )




...{


idImage.src = "mouthnar.bmp";


}


else if( VisemeId == 5 || VisemeId == 10 || VisemeId == 13 )




...{


idImage.src = "mouthmed.bmp";


}


else




...{


idImage.src = "mouthclo.bmp";


}


}


</SCRIPT>








<STRONG>


<HR></STRONG>


<P></P>




</BODY>


</HTML>







如果您要转载文章,请注明出处,谢谢。

木头写于2006年12月19日
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐