﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我爱我的家园!-文章分类-音频开发</title><link>http://www.blogjava.net/Yipak/category/34383.html</link><description>成功在于你是否努力,希望在于你是否相信自己! </description><language>zh-cn</language><lastBuildDate>Thu, 04 Sep 2008 09:08:56 GMT</lastBuildDate><pubDate>Thu, 04 Sep 2008 09:08:56 GMT</pubDate><ttl>60</ttl><item><title>在C#中使用微软AGENT之TTS[1]</title><link>http://www.blogjava.net/Yipak/articles/227006.html</link><dc:creator>死神</dc:creator><author>死神</author><pubDate>Thu, 04 Sep 2008 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/Yipak/articles/227006.html</guid><wfw:comment>http://www.blogjava.net/Yipak/comments/227006.html</wfw:comment><comments>http://www.blogjava.net/Yipak/articles/227006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Yipak/comments/commentRss/227006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Yipak/services/trackbacks/227006.html</trackback:ping><description><![CDATA[
		<p>
				<strong>微软AGENT简介 <br /><br /></strong>微软Agent API能够提供卡通角色的显示，另外，它还可以支持语音识别，因此应用软件可以对语音命令作出反应，而卡通角色可以通过合成的语音、录制好的音频信号或文字对命令作出反应。</p>
		<p>
				<strong>使用微软AGENT的要求</strong>
		</p>
		<div class="Hhf636">
				<span id="TheWorldHiLightStyleID" style="BACKGROUND: #ff0000; COLOR: #000000">
				</span> </div>
		<p>
		</p>
		<p>要使用该技术，我们必须有下面的组件： <br /><br />·微软Agent核心组件 <br /><br />·微软Agent中的卡通角色━━Genie、Merlin、Robby和Peedy <br /><br />·微软Speech API 4.0a运行时间库 <br /><br />·微软语音识别引擎 <br /><br />·Lernout和Hauspie文字-语音引擎 <br /><br />上面的所有这些组件都可以从http://microsoft.com/products/msagent/downloads.htm下载。 <br /><br /><strong>语音技术简介 </strong><br /><br />文字-语音转换指的是计算机将文字信息转换为合成语音进行输出，语音识别是指计算机能够识别出说话者所说的话，接受说话者的命令和输入的数据。 <br /><br />语音识别和文字-语音转换都需要用到相关的引擎，几乎所有的语音识别引擎都是将输入的语音数据转换为与特定引擎相关的音素，然后这些音素被转换为应用程序能够使用的文字。 <br /><br />文本-语音转换的二种方式： <br /><br />1、合成文本-语音转换 <br /><br />2、连续文本-语音转换 <br /><br /><strong>合成文本-语音转换方式： </strong><br /><br />在合成的发音方式中，引擎处理每个单词，并产生该单词的发音音素，然后这些音素被转入一个复杂的算法中，模仿人类的发声方式，生成语音。 
</p>
		<p class="Hhf636">
				<span id="TheWorldHiLightStyleID" style="BACKGROUND: #ff0000; COLOR: #000000">
				</span> </p>
		<br />
		<br />
		<strong>连续文本-语音转换方式： </strong>
		<br />
		<br />在连续文本-语音转换方式中，引擎对文本信息进行处理，从一个预先录制好的语音库中找出句子、单词和短语，在这种方式中，生成的语音是连续的。<br /><br /><strong>语音应用程序的编程接口 </strong><br /><br />微软语音应用程序编程接口在Win32（Windows 95、Windows NT）下使用了OLE组件对象模式（COM）架构，微软的Agent架构在合成语音输出中使用了微软语音应用程序编程接口（SAPI），还使用SAPI支持语音输入（语音识别SR或文本-语音转换TTS）。微软的Agent定义了让应用程序访问其服务的接口，使得应用程序能够控制角色动画、支持用户输入事件，指定输出方式。 <br /><br /><strong>角色窗口 </strong><br /><br />在微软Agent应用程序中，卡通角色是在它们各自的窗口中被显示的，这些窗口总是出现在Z轴顺序的最顶端。用户可以通过鼠标左键拖动角色移动角色所在的窗口，角色的图像随着指针而移动。 <br /><br /><strong>说话汽球圈 </strong><br /><br />除了语音输出外，动画角色还支持以卡通类型说话汽球圈形式的文字字幕，角色说话时，所说的文字就出现在汽球圈儿中，当说完时，汽球圈也就不见了。 <br /><br /><strong>在互联网网页中使用微软AGENT <br /></strong><br /><br />要在互联网网页中使用微软Agent服务，可以在网页中的或元素中使用HTML标记，指定控制的CLSID（类标识符），另外，还需要使用CODEBASE参数指定微软Agent的安装文件的位置和版本号。 <br /><br />我们可以使用Vbscript、Javascript和Jscript在互联网网页中使用微软Agent。 
<p></p><table><tbody><tr><td><p align="center"><img class="fit-image" onmousewheel="javascript:return big(this)" style="WIDTH: 424px; CURSOR: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.3s8.cn/upimg/allimg/070203/0136460.gif" width="548" onload="javascript:if(this.width&gt;498)this.style.width=498;" border="0" /><br /><br />图1 
</p><div class="Hhf636"> </div><p></p></td></tr></tbody></table><p><br /><br /><strong>在.NET架构中使用微软AGENT </strong></p><div class="Hhf636"><span id="TheWorldHiLightStyleID" style="BACKGROUND: #ff0000; COLOR: #000000"></span> </div><p></p><p>微软Agent不是以ActiveX控制DLL的形式提供的。要在.NET中使用它，可以使用由.NET框架SDK提供的AxImp.exe工具： <br /><br />AxImp --&gt;&gt; ActiveX控制-Win窗体组合体生成器　 <br /><br />　 Syntax: AxImp [/? | [[/source] OCXName]] <br /><br />Aximp agentctl.dll <br /><br />上面的命令生成二个文件：AxAgentObjects.dll和AgentObjects.dll。通过使用这二个文件，我们就可以在.NET中使用Agent了。 
</p><p class="Hhf636"><span id="TheWorldHiLightStyleID" style="BACKGROUND: #ff0000; COLOR: #000000"></span> </p><p></p><p><strong>C#中的微软Agent： <br /><br /></strong>要在C#中使用微软Agent，我们必须在程序中添加二个DLL文件：AxAgentObjects.dll和AgentObjects.dll。加载动画角色的代码是相当简单的： 
</p><div class="Hhf636"><span id="TheWorldHiLightStyleID" style="BACKGROUND: #ff0000; COLOR: #000000"></span> </div><p></p><p><br />======================================================================================================================<br /><br /><br /></p><style><![CDATA[.Aek119 { display:none; } ]]&gt;</style><p></p><p></p><table><tbody><tr><td>AxAgent.Characters.Load("Genie",(object)"C:/Windows/Msagent/chars/GENIE.acs"); <br /><br />Character = AxAgent.Characters["Genie"]; <br /><br />file://将语言设置为美国英语 <br /><br />Character.LanguageID = 0x409; <br /><br />file://该行代码显示角色 <br /><br />Character.Show(null); </td></tr></tbody></table><br /><br />让角色说话的代码如下所示： <br /><br />　 Character.Speak ("Welcome you sir VISIT www.onlinecsharpteach.netfirms.com ",null); <br /><br />下面我们来看一个例子： <br /><br />The Example: <br /><br /><table><tbody><tr><td><br /><br />using System; <br /><br />using System.Drawing; <br /><br />using System.WinForms; <br /><br />using AgentObjects; <br /><br />public class Hello: Form <br /><br />{ <br /><br />private System.ComponentModel.Container components; <br /><br />private System.WinForms.Button button2; <br /><br />private System.WinForms.Button button1; 
<div class="Aek119"> </div><br /><br />private System.WinForms.TextBox textBox1; <br /><br />private AxAgentObjects.AxAgent AxAgent; <br /><br />private IAgentCtlCharacterEx Character; <br /><br />public Hello() <br /><br />{ <br /><br />InitializeComponent(); <br /><br />} <br /><br />public static void Main(string[] args) <br /><br />{ <br /><br />Application.Run(new Hello()); <br /><br />} <br /><br />private void InitializeComponent() <br /><br />{ <br /><br />this.components = new System.ComponentModel.Container(); <br /><br />this.button1 = new System.WinForms.Button(); <br /><br />this.button2 = new System.WinForms.Button(); <br /><br />this.textBox1 = new System.WinForms.TextBox(); <br /><br />this.AxAgent = new AxAgentObjects.AxAgent(); <br /><br />AxAgent.BeginInit(); <br /><br />button2.Click += new System.EventHandler(button2_Click); <br /><br />button1.Location = new System.Drawing.Point(88, 208); <br /><br />button1.BackColor = <br /><br />(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)128, (byte)128);  <br /><br />button1.Size = new System.Drawing.Size(152, 32); <br /><br />button1.TabIndex = 1; <br /><br />button1.Text = "Load character"; <br /><br />button2.Location = new System.Drawing.Point(120, 240); <br /><br />button2.BackColor = <br /><br />(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)128, (byte)128); <br /><br />button2.Size = new System.Drawing.Size(96, 24); <br /><br />button2.TabIndex = 2; <br /><br />button2.Text = "SPEAK"; <br /><br />textBox1.Location = new System.Drawing.Point(48, 8); <br /><br />textBox1.Text = " "; <br /><br />textBox1.Multiline = true; <br /><br />textBox1.TabIndex = 0; <br /><br />textBox1.Size = new System.Drawing.Size(248, 200); <br /><br />textBox1.BackColor = <br /><br />(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)128, (byte)128); <br /><br />this.Text = "MSAGENT DEMO"; <br /><br />this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); <br /><br />this.WindowState = System.WinForms.FormWindowState.Maximized; <br /><br />this.BackColor = <br /><br />(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)192, (byte)192); <br /><br />this.ClientSize = new System.Drawing.Size(344, 301); <br /><br />this.Controls.Add(button2); <br /><br />this.Controls.Add(button1); <br /><br />this.Controls.Add(textBox1); <br /><br />this.Controls.Add(AxAgent); <br /><br />button1.Click += new System.EventHandler(button1_Click); <br /><br />AxAgent.EndInit(); <br /><br />} <br /><br />protected void button2_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />if(textBox1.Text.Length == 0) <br /><br />return; <br /><br />Character.Speak(textBox1.Text, null); <br /><br />} <br /><br />protected void button1_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />OpenFileDialog openFileDialog = new OpenFileDialog(); <br /><br />openFileDialog.AddExtension = true; <br /><br />openFileDialog.Filter = "Microsoft Agent Characters (*.acs)|*.acs"; <br /><br />openFileDialog.FilterIndex = 1 ; <br /><div class="Aek119"> </div><br />openFileDialog.RestoreDirectory = true ; <br /><br />if(openFileDialog.ShowDialog() != DialogResult.OK) <br /><br />return; <br /><br />try { AxAgent.Characters.Unload("CharacterID"); } <br /><br />catch { } <br /><br />AxAgent.Characters.Load("CharacterID", (object)openFileDialog.FileName); <br /><br />Character = AxAgent.Characters["CharacterID"]; <br /><br />Character.LanguageID = 0x409; <br /><br />Character.Show(null); <br /><br />Character.Play ("announce"); <br /><br />Character.Speak ("welcome you sir",null); <br /><br />} } <br /><br /></td></tr></tbody></table>输出： <br /><br /><table><tbody><tr><td><p align="center"><img class="fit-image" onmousewheel="javascript:return big(this)" style="WIDTH: 424px; CURSOR: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.3s8.cn/upimg/allimg/070203/0136461.gif" width="533" onload="javascript:if(this.width&gt;498)this.style.width=498;" border="0" /></p><p class="Aek119"><span id="TheWorldHiLightStyleID" style="BACKGROUND: #ff0000; COLOR: #000000"></span> </p><br /><br />图2 
<p class="Aek119"> </p><p></p></td></tr></tbody></table><br /><br /><div class="Aek119"> </div><p></p><p></p><table><tbody><tr><td><p align="center"><img class="fit-image" onmousewheel="javascript:return big(this)" style="WIDTH: 424px; CURSOR: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.3s8.cn/upimg/allimg/070203/0136462.gif" width="544" onload="javascript:if(this.width&gt;498)this.style.width=498;" border="0" /><br /><br />图3 </p></td></tr></tbody></table><br /><br /><strong>结束语： </strong><br /><br />微软的Agent API提供了支持动画角色显示的服务，被配置为OLE Automation（COM）服务器时，它能够使多个被称为客户或客户端应用软件的应用程序同时托管或使用其动画、输入、输出服务。 <br /><img src ="http://www.blogjava.net/Yipak/aggbug/227006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Yipak/" target="_blank">死神</a> 2008-09-04 16:42 <a href="http://www.blogjava.net/Yipak/articles/227006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>语音合成与识别技术在C#中的应用[1]</title><link>http://www.blogjava.net/Yipak/articles/226965.html</link><dc:creator>死神</dc:creator><author>死神</author><pubDate>Thu, 04 Sep 2008 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/Yipak/articles/226965.html</guid><wfw:comment>http://www.blogjava.net/Yipak/comments/226965.html</wfw:comment><comments>http://www.blogjava.net/Yipak/articles/226965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Yipak/comments/commentRss/226965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Yipak/services/trackbacks/226965.html</trackback:ping><description><![CDATA[我们要想实现中文发音或中文语音识别，必需先安装微软的Speech Application SDK（SASDK），它的最新版本是 SAPI 5.1 他能够识别中、日、英三种语言，你可以在这里下载：http://www.microsoft.com/speech/download/sdk51/,需要安装这两个文件Speech SDK 5.1和5.1 Language Pack，其中5.1 Language Pack可以选择安装支持的语言。 安装好以后，我们就可以开始进行语音程序的开发了。 <br /><br />下面我们设计一个能够朗读中英文混合语言的类： <br /><br />我们将用单例模式实现该类，类的代码如下，我们将详细解释： <br /><br />public class Speach <br /><br />{ <br /><br />　 private static Speach _Instance = null ; <br /><br />　 private SpeechLib.SpVoiceClass voice =null; <br /><br />　 private Speach() <br /><br />　 { <br /><br />BuildSpeach() ; <br /><br />　 } <br /><br />public static Speach instance() <br /><br />{ <br /><br />　 if (_Instance == null) <br /><br />_Instance = new Speach() ; <br /><br />return _Instance ; <br /><br />} <br /><br />private void SetChinaVoice() <br /><br />{ <br /><br />　 voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ; <span class="Ptp171">中国3S吧 3s8.cn</span><br /><br />} <br /><br />private void SetEnglishVoice() <br /><br />{ <br /><br />　 voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(1) ; <br /><br />} <br /><br />private void SpeakChina(string strSpeak) <br /><br />{ <br /><br />　 SetChinaVoice() ; <br /><br />　 Speak(strSpeak) ; <br /><br />} <br /><br />private void SpeakEnglishi(string strSpeak) <br /><br />{ <br /><br />　 SetEnglishVoice() ; <br /><br />　 Speak(strSpeak) ; <br /><br />} <br /><br />public void AnalyseSpeak(string strSpeak) <br /><br />{ <br /><br />　 int iCbeg = 0 ; <br /><br />　 int iEbeg = 0 ; <br /><br />　 bool IsChina = true ; <br /><br />　 for(int i=0;i&lt;strSpeak.Length;i++) <br /><br />　 { <br /><br />char chr = strSpeak[i] ; <br /><br />if (IsChina) <br /><br />{ <br /><br />　 if (chr&lt;=122&amp;&amp;chr&gt;=65) <br /><br />　 { <br /><br />int iLen = i - iCbeg ; <br /><br />string strValue = strSpeak.Substring(iCbeg,iLen) ; <br /><br />SpeakChina(strValue) ; <br /><br />iEbeg = i ; <br /><br />IsChina = false ; <span class="Ptp171">中国3S吧 3s8.cn</span><br /><br />　 } <br /><br />} <br /><br />else <br /><br />{ <br /><br />　 if (chr&gt;122||chr&lt;65) <br /><br />　 { <br /><br />int iLen = i - iEbeg ; <br /><br />string strValue = strSpeak.Substring(iEbeg,iLen) ; <br /><br />this.SpeakEnglishi(strValue) ; <br /><br />iCbeg = i ; <br /><br />IsChina = true ; <br /><br />　 } <br /><br />} <br /><br />　 }//end for <br /><br />　 if (IsChina) <br /><br />　 { <br /><br />int iLen = strSpeak.Length - iCbeg ; <br /><br />string strValue = strSpeak.Substring(iCbeg,iLen) ; <br /><br />SpeakChina(strValue) ; <br /><br />　 } <br /><br />　 else <br /><br />　 { <br /><br />int iLen = strSpeak.Length - iEbeg ; <br /><br />string strValue = strSpeak.Substring(iEbeg,iLen) ; <br /><br />SpeakEnglishi(strValue) ; <br /><br />　 } <br /><br />} <br /><br />private void BuildSpeach() <br /><br />{ <br /><br />　 if (voice == null) <br /><br />voice = new SpVoiceClass() ; <br /><br />} <br /><br />public int Volume <br /><br />{ <br /><br />　 get <br /><br />　 { <br /><p class="Ptp171">中国3S吧 3s8.cn</p><br />return voice.Volume ; <br /><br />　 } <br /><br />　 set <br /><br />　 { <br /><br />voice.SetVolume((ushort)(value)) ; <br /><br />　 } <br /><br />} <br /><br />public int Rate <br /><br />{ <br /><br />　 get <br /><br />　 { <br /><br />return voice.Rate ; <br /><br />　 } <br /><br />　 set <br /><br />　 { <br /><br />voice.SetRate(value) ; <br /><br />　 } <br /><br />} <br /><br />private void Speak(string strSpeack) <br /><br />{ <br /><br />　 try <br /><br />　 { <br /><br />voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; <br /><br />　 } <br /><br />　 catch(Exception err) <br /><br />　 { <br /><br />throw(new Exception("发生一个错误："+err.Message)) ; <br /><br />　 } <br /><br />} <br /><br />public void Stop() <br /><br />{ <br /><br />　 voice.Speak(string.Empty,SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak) ; <br /><br />} <br /><br />public void Pause() <br /><br />{ <br /><br />　 voice.Pause() ; <br /><br />} <br /><br />public void Continue() <br /><br />{ <font color="#ffffff">专业的3S站 3s8.cn</font><br /><br />　 voice.Resume() ; <br /><br />} <br /><br />}//end class <br /><br /><br /><br /><br />=========================================================================<br /><br />在 private SpeechLib.SpVoiceClass voice =null;这里，我们定义个一个用来发音的类，并且在第一次调用该类时，对它用BuildSpeach方法进行了初始化。 <br /><br />我们还定义了两个属性Volume和Rate，能够设置音量和语速。 <br /><br />我们知道，SpVoiceClass 有一个Speak方法，我们发音主要就是给他传递一个字符串，它负责读出该字符串，如下所示。 <br /><br /><table><tbody><tr><td>private void Speak(string strSpeack) <br /><br />{ <br /><br />　 try <br /><br />　 { <br /><br />voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; <br /><br />　 } <br /><br />　 catch(Exception err) <br /><br />　 { <br /><br />throw(new Exception("发生一个错误："+err.Message)) ; <br /><br />　 } <br /><br />} <br /><br /></td></tr></tbody></table>其中SpeechVoiceSpeakFlags.SVSFlagsAsync表示异步发音。 <br /><br /><img class="fit-image" onmousewheel="javascript:return big(this)" style="WIDTH: 498px; CURSOR: pointer; ZOOM: 110%" onclick="javascript:window.open(this.src);" alt="" src="http://www.3s8.cn/upimg/allimg/070203/0131540.jpg" onload="javascript:if(this.width&gt;498)this.style.width=498;" border="0" /> 但是，这个方法本身并不知道你给的字符串是什么语言，所以需要我们它这个字符串用什么语言读出。SpVoiceClass 类的Voice 属性就是用来设置语种的，我们可以通过SpVoiceClass 的GetVoices方法得到所有的语种列表，然后在根据参数选择相应的语种，比如设置语种为汉语如下所示： 
<div class="Dnf119">中国3S吧 3s8.cn</div><br /><br /><table><tbody><tr><td>private void SetChinaVoice() <br /><br />{ <br /><br />　 voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ; <br /><br />} </td></tr></tbody></table><br /><br />0表示是汉用，1234都表示英语，就是口音不同。 <br /><br />这样，我们就设置了语种，如果结合发音方法，我们就可以设计出一个只发汉语语音的方法 <br /><br /><table><tbody><tr><td>private void SpeakChina(string strSpeak) <br /><br />{ <br /><br />　 SetChinaVoice() ; <br /><br />　 Speak(strSpeak) ; <br /><br />} </td></tr></tbody></table><br /><br />只发英语语音的方法也是类似的，上面程序里有。 <br /><br />对于一段中英文混合的语言，我们让程序读出混合语音的方法就是：编程把这段语言的中英文分开，对于中文调用SpeakChina方法，英文调用SpeakEnglishi方法；至于怎样判断一个字符是英文还是中文，我采用的是判断asc码的方法，具体的类方法是通过AnalyseSpeak实现的。 <br /><br />这样，对于一段中英文混合文字，我们只需把它作为参数传递给AnalyseSpeak就可以了，他能够完成中英文的混合发音。 <br /><br /><br /><br /><br />============================================================================================================<br /><br /><br />当然，对于发音的暂定、继续、停止等操作，上面也给出了简单的方法调用，很容易明白。 <br /><br />下面简单介绍一下中文语音识别的方法： <br /><br />先把该语音识别的类源代码贴在下面，然后再做说明： <br /><br /><table><tbody><tr><td>public class SpRecognition <br /><br />{ <br /><br />　 private static SpRecognition _Instance = null ; <br /><br />　 private SpeechLib.ISpeechRecoGrammar isrg ; <br /><br />　 private SpeechLib.SpSharedRecoContextClass ssrContex =null; <br /><br />　 private System.Windows.Forms.Control cDisplay ; <br /><br />　 private SpRecognition() <br /><br />　 { <br /><br />ssrContex = new SpSharedRecoContextClass() ; <br /><br />isrg = ssrContex.CreateGrammar(1) ; <br /><br />SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle = new _ISpeechRecoContextEvents_RecognitionEventHandler(ContexRecognition) ; <br /><br />ssrContex.Recognition += recHandle ; <br /><br />　 } <br /><br />　 public void BeginRec(Control tbResult) <br /><br />　 { <span class="Tuk379">中国3S吧 3s8.cn</span><br /><br />isrg.DictationSetState(SpeechRuleState.SGDSActive) ; <br /><br />cDisplay = tbResult ; <br /><br />　 } <br /><br />　 public static SpRecognition instance() <br /><br />　 { <br /><br />if (_Instance == null) <br /><br />　 _Instance = new SpRecognition() ; <br /><br />　 return _Instance ; <br /><br />　 } <br /><br />　 public void CloseRec() <br /><br />　 { <br /><br />isrg.DictationSetState(SpeechRuleState.SGDSInactive) ; <br /><br />　 } <br /><br />　 private void ContexRecognition(int iIndex,object obj,SpeechLib.SpeechRecognitionType type,SpeechLib.ISpeechRecoResult result) <br /><br />　 { <br /><br />cDisplay.Text += result.PhraseInfo.GetText(0,-1,true) ; <br /><br />　 } <br /><br />} <br /><br /></td></tr></tbody></table>我们定义了ssrContex 和isrg为语音识别的上下文和语法，通过设置isrg的DictationSetState方法，我们可以开始或结束识别，在上面的程序中是BeginRec和CloseRec方法。cDisplay 是我们用来输出识别结果的地方，为了能够在大部分控件上都可以显示结果，我用了一个Control 类来定义它。当然，每次语音识别后都会触发ISpeechRecoContextEvents_RecognitionEventHandler 事件，我们定义了一个这样的方法ContexRecognition来响应事件，并且在这个方法里输出识别结果。<br /><img src ="http://www.blogjava.net/Yipak/aggbug/226965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Yipak/" target="_blank">死神</a> 2008-09-04 15:08 <a href="http://www.blogjava.net/Yipak/articles/226965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用C#实现语音技术</title><link>http://www.blogjava.net/Yipak/articles/226960.html</link><dc:creator>死神</dc:creator><author>死神</author><pubDate>Thu, 04 Sep 2008 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/Yipak/articles/226960.html</guid><wfw:comment>http://www.blogjava.net/Yipak/comments/226960.html</wfw:comment><comments>http://www.blogjava.net/Yipak/articles/226960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Yipak/comments/commentRss/226960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Yipak/services/trackbacks/226960.html</trackback:ping><description><![CDATA[“电脑朗读”（英文）一个很好的触发点，通过它可以实现电子小说阅读、英文听力测试、英文单词学习... <br /><br />下面的Speech已对MSTTS作了简单封装。 <br /><br />1.安装好MSTTS（如果你有装金山词霸，系统就已经安装了）,可以在winnt\speech中打到vtxtauto.tlb文件； <br /><br />2.用.Net SDK自带的tlbimp工具把vtxtauto.tlb转换成.dll格式: <br /><br />tlbimp vtxtauto.tlb /silent /namespace:mstts /out:mstts.dll <br /><br />这时的mstts.dll已成为.net framework运行库的一个类。 <br /><br />3.编写一个封装vtxtauto的简单类:Speech . <br /><br />//========================Speech.cs====================== <br /><br />using System； <br /><br />using mstts； //MSTTS名称空间 <br /><br />namespace Bedlang{ //定义名称空间 <br /><br />public class Speech{ <br /><br />private VTxtAuto VTxtAutoEx； <br /><br />public Speech（）{ <br /><br />VTxtAutoEx = new VTxtAuto（）； <br /><br />VTxtAutoEx.Register（" "," "）； //注册COM组件 <br /><br />} <br /><br />public void Speak（String text）{ <br /><br />VTxtAutoEx.Speak（text, 0）； //发音 
<p class="Lpj418">专业的3S站 3s8.cn</p><br /><br />} <br /><br />} <br /><br />} <br /><br />//========================Speech.cs====================== <br /><br /><br />4.编译Bedlang.Speech <br /><br />csc /target:library /out:Bedlang.dll speech.cs /r:mstts.dll <br /><br />如果用vs.net开发，可直接生成项目就可以了。 <br /><br />5.发音实现 <br /><br />//========================demo.cs====================== <br /><br />分别加入Label,TextBox,Button控件各一个到windows Form中，修改它们的属性，源代码如下： <br /><br />using System； <br /><br />using System.Drawing； <br /><br />using System.Collections； <br /><br />using System.ComponentModel； <br /><br />using System.Windows.Forms； <br /><br />using System.Data； <br /><br />namespace Bedlang <br /><br />{ <br /><br />/// <br /><br />/// Form1 的摘要说明。 <br /><br />/// <br /><br />public class demo : System.Windows.Forms.Form <br /><br />{ <br /><br />private System.Windows.Forms.Label label1； <br /><br />private System.Windows.Forms.TextBox textBox1； <br /><br />private System.Windows.Forms.Button button1； 
<p class="Lpj418">专业的3S站 3s8.cn</p><br /><br />/// <br /><br />/// 必需的设计器变量。 <br /><br />/// <br /><br />private System.ComponentModel.Container components = null； <br /><br />public demo（） <br /><br />{ <br /><br />// <br /><br />// Windows 窗体设计器支持所必需的 <br /><br />// <br /><br />InitializeComponent（）； <br /><br />// <br /><br />// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 <br /><br />// <br /><br />} <br /><br />/// <br /><br />/// 清理所有正在使用的资源。 <br /><br />/// <br /><br />protected override void Dispose（ bool disposing ） <br /><br />{ <br /><br />if（ disposing ） <br /><br />{ <br /><br />if （components != null） <br /><br />{ <br /><br />components.Dispose（）； <br /><br />} <br /><br />} <br /><br />base.Dispose（ disposing ）； <br /><br />} <br /><img src ="http://www.blogjava.net/Yipak/aggbug/226960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Yipak/" target="_blank">死神</a> 2008-09-04 15:02 <a href="http://www.blogjava.net/Yipak/articles/226960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#获取WAVE文件文件头信息</title><link>http://www.blogjava.net/Yipak/articles/226957.html</link><dc:creator>死神</dc:creator><author>死神</author><pubDate>Thu, 04 Sep 2008 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/Yipak/articles/226957.html</guid><wfw:comment>http://www.blogjava.net/Yipak/comments/226957.html</wfw:comment><comments>http://www.blogjava.net/Yipak/articles/226957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Yipak/comments/commentRss/226957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Yipak/services/trackbacks/226957.html</trackback:ping><description><![CDATA[
		<p>using System; <br /><br />using System.IO; <br /><br />using System.Text; <br /><br />namespace WAV <br /><br />{ <br /><br />/// &lt;summary&gt; <br /><br />/// Summary description for Wav. <br /><br />/// &lt;/summary&gt; <br /><br />public class Wav <br /><br />{public Wav() <br /><br />{ // <br /><br />// TODO: Add constructor logic here <br /><br />// <br /><br />} <br /><br />[STAThread] <br /><br />static void Main(string[] args) <br /><br />{ <br /><br />// <br /><br />// TODO: Add code to start application here <br /><br />// <br /><br />string strpath=@"C:\Documents and Settings\Administrator\桌面\trojan\怀念战友.wav";//=@"F:\Music"; <br /><br />if(args.Length&gt;0) <br /><br />{ strpath=args[0].Trim(); <br /><br />} <br /><br />if(File.Exists(strpath)) <br /><br />{ GetWavInfo(strpath); <br /><br />Console.WriteLine("GetWavInfo Successfully!"); <br /><br />//Console.WriteLine(""); <br /><br />} <br /><br />else <br /><br />{ Console.Write("Please Enter the write filepath!\n"); 
</p>
		<p class="Hqk128">专业的3S站 3s8.cn</p>
		<br />
		<br />Console.Write("用法: WAV [Full Path Of Your WAV filepath]"); <br /><br />} <br /><br />} <br /><br />public struct WavInfo <br /><br />{ public string groupid; <br /><br />public string rifftype; <br /><br />public long filesize; <br /><br />public string chunkid; <br /><br />public long chunksize; <br /><br />public short wformattag; //记录着此声音的格式代号，例如WAVE_FORMAT_PCM，WAVE_F0RAM_ADPCM等等。 <br /><br />public ushort wchannels; //记录声音的频道数。 <br /><br />public ulong dwsamplespersec;//记录每秒取样数。 <br /><br />public ulong dwavgbytespersec;//记录每秒的数据量。 <br /><br />public ushort wblockalign;//记录区块的对齐单位。 <br /><br />public ushort wbitspersample;//记录每个取样所需的位元数。 <br /><br />public string datachunkid; <br /><br />public long datasize; <br /><br />} <br /><br />public static void GetWavInfo(string strpath) <br /><br />{ <br /><br />WavInfo wavInfo = new WavInfo(); <br /><br />FileInfo fi = new FileInfo(strpath); <br /><br />System.IO.FileStream fs=fi.OpenRead(); <span class="Hqk128">中国3S吧 3s8.cn</span><br /><br />if(fs.Length&gt;=44) <br /><br />{ <br /><br />byte[] bInfo=new byte[44]; <br /><br />fs.Read(bInfo,0,44); <br /><br />System.Text.Encoding.Default.GetString(bInfo,0,4); <br /><br />if(System.Text.Encoding.Default.GetString(bInfo,0,4)=="RIFF"&amp;&amp;System.Text.Encoding.Default.GetString(bInfo,8,4)=="WAVE"&amp;&amp;System.Text.Encoding.Default.GetString(bInfo,12,4)=="fmt ") <br /><br />{ <br /><br />wavInfo.groupid = System.Text.Encoding.Default.GetString(bInfo,0,4); <br /><br />System.BitConverter.ToInt32(bInfo,4); <br /><br />wavInfo.filesize = System.BitConverter.ToInt32(bInfo,4); <br /><br />//wavInfo.filesize = Convert.ToInt64(System.Text.Encoding.Default.GetString(bInfo,4,4)); <br /><br />wavInfo.rifftype = System.Text.Encoding.Default.GetString(bInfo,8,4); <br /><br />wavInfo.chunkid = System.Text.Encoding.Default.GetString(bInfo,12,4); <br /><br />wavInfo.chunksize = System.BitConverter.ToInt32(bInfo,16); <br /><br />wavInfo.wformattag = System.BitConverter.ToInt16(bInfo,20); 
<p class="Hqk128">专业的3S站 3s8.cn</p><br /><br />wavInfo.wchannels = System.BitConverter.ToUInt16(bInfo,22); <br /><br />wavInfo.dwsamplespersec = System.BitConverter.ToUInt32(bInfo,24); <br /><br />wavInfo.dwavgbytespersec = System.BitConverter.ToUInt32(bInfo,28); <br /><br />wavInfo.wblockalign = System.BitConverter.ToUInt16(bInfo,32); <br /><br />wavInfo.wbitspersample = System.BitConverter.ToUInt16(bInfo,34); <br /><br />wavInfo.datachunkid = System.Text.Encoding.Default.GetString(bInfo,36,4); <br /><br />wavInfo.datasize = System.BitConverter.ToInt32(bInfo,40); <br /><br />System.Console.WriteLine("groupid:"+wavInfo.groupid); <br /><br />System.Console.WriteLine("filesize:"+wavInfo.filesize); <br /><br />System.Console.WriteLine("rifftype:"+wavInfo.rifftype); <br /><br />System.Console.WriteLine("chunkid:"+wavInfo.chunkid); <br /><br />System.Console.WriteLine("chunksize:"+wavInfo.chunksize); <br /><br />System.Console.WriteLine("wformattag:"+wavInfo.wformattag); <br /><br />System.Console.WriteLine("wchannels:"+wavInfo.wchannels); 
<div class="Hqk128">中国3S吧 3s8.cn</div><br /><br />System.Console.WriteLine("dwsamplespersec:"+wavInfo.dwsamplespersec); <br /><br />System.Console.WriteLine("dwavgbytespersec:"+wavInfo.dwavgbytespersec); <br /><br />System.Console.WriteLine("wblockalign:"+wavInfo.wblockalign); <br /><br />System.Console.WriteLine("wbitspersample:"+wavInfo.wbitspersample); <br /><br />System.Console.WriteLine("datachunkid:"+wavInfo.datachunkid); <br /><br />System.Console.WriteLine("datasize:"+wavInfo.datasize); <br /><br />} <br /><br />} <br /><br />} <br /><br />} <br /><br />} <img src ="http://www.blogjava.net/Yipak/aggbug/226957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Yipak/" target="_blank">死神</a> 2008-09-04 15:00 <a href="http://www.blogjava.net/Yipak/articles/226957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>