[语音合成技术第一讲]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日
前言:
语音合成技术其实并没有什么神秘的,也不像想象中的那么繁杂。今天我就与大家一起来看一下,怎么让我们网页为我们朗读文本。怎样做到在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日
相关文章推荐
- [语音合成技术第三讲]C# 中使用语音合成技术(二)
- web个性化,web版tts语音合成技术,cs架构语音合成技术,web时时推送技术,异步调用多线程技术
- [语音合成技术第二讲]C# 中使用语音合成技术(一)
- Web页面标签技术的使用(收集整理)
- [语音合成技术第四讲]使用C++实现语音识别
- 如何在web页面使用自定义字体
- JSP页面中使用分页技术(整理)
- 使用面向对象的技术创建高级 Web 应用程序
- QT使用插件QAxWidget来展示web页面
- asp.net多线程在web页面中简单使用
- 使用XmlHttp编写兼容多浏览器的ajax WEB页面
- JavaScript: 使用面向对象的技术创建高级 Web 应用程序
- AJAX技术与asp.net 2.0的完美结合之Timer的web应用 及使用AJAX控件时的“Sys 未定义”错误解决办法
- 使用HttpURLConnection访问web页面
- JavaScript: 使用面向对象的技术创建高级 Web 应用程序 (转)
- JAVA_WEB Struts2学习:使用验证框架进行校验JSP页面元素 反编译工具的配置 Strtuts2 国际化学习
- Web端服务器推送技术原理分析及dwr框架简单的使用
- 【Android】Web开发之使用WebView控件展示Web页面
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- Web页面技术综述(包括fastm)