随笔 - 35  文章 - 1 评论 - 94 trackbacks - 8



与我联系

搜索

 

常用链接

留言簿(6)

我参与的团队

随笔档案(35)

文章档案(1)

.NET英文资料

.NET中文资料

其他博客

最新随笔

积分与排名

  • 积分 - 43360
  • 排名 - 1063

最新评论

阅读排行榜

评论排行榜

 

     准备

.net中使用语音识别和语音合成技术,需要借助微软的Speech SDK,如果是要在Web应用程序中使用,则需要Speech Application SDK。其中Speech SDK可以在http://www.microsoft.com/speech/download/sdk51/下载,其中有两个文件Speech SDK 5.15.1 Language Pack,前者是开发包,但是其中只包含对英文的支持,后者是中文和日文的语言包,装完就能支持中文了。

      SDK组成结构

       

     演练

1.         打开vs2005,建立一个windows application,在设计窗体中加入一个label,一个richtextbox(用于输入要读的文本),以及一个button。并分别设置的labelbuttonText属性。如下图
           

2.         添加必要的引用,项目->添加引用->COM 选择Microsoft Speech Object Library确定退出。

3.         双击button,为其添加事件。在代码页顶端先添加命名空间,代码如:
             

using SpeechLib;


4.         button的事件处理程序代码如下。
       

        private void button1_Click(object sender, EventArgs e)
        
{
            SpVoiceClass voice 
= new SpVoiceClass(); 
            voice.Voice 
= voice.GetVoices(string.Empty, string.Empty).Item(3); //其中3为中文,024为英文
            voice.Speak(richTextBox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);
        }


5.         F5运行,在空白区域输入文字,点朗读,试试效果吧。

     SpVoiceClass详解

属性

描述

AlertBoundary

取得或设置停顿分界线。

AllowAudioOutputFormatChangesOnNextSet

设置是否允许声音自动调整到合适状态以适应其音频输出。

AudioOutput

.取得或设置当前声音使用的的音频输出对象

AudioOutputStream

取得或设置当前声音使用的的音频输出流对象。

EventInterests

取得或设置当前声音返回的事件类型。

Priority

取得或设置声音的优先级。

Rate

取得或设置阅读的速度。

Status

返回一个ISpeechVoiceStatus 对象用于显示当前阅读和事件的状态

SynchronousSpeakTimeout

取得或设置一个时间间隔,用于标识多久未获得一个输出设备后,一个同步的Speak SpeakStream将终止,以毫秒计算。

Voice

取得或设置发音对象。

Volume

取得或设置声音的大小

 

方法

描述

DisplayUI

是否在控制面板中展示详细设置。

GetAudioOutputs

返回一个可用的音频输出标记。

GetVoices

返回一个可用的发音对象。

IsUISupported

决定是否能通过控制棉板的音频设置来控制。

Pause

暂停朗读。.

Resume

恢复暂停,继续播放。

Skip

在当前输入的文本流中向前或向后跳一定距离再播放。

Speak

阅读一个字符串。

SpeakCompleteEvent

得到一个朗读完毕的时间句柄

SpeakStream

朗读一个文本流或一个声音文件。

WaitUntilDone

阻塞进程,直到声音播放完毕或者超时。.





.(本文只是这个系列的第一篇,至于其他内容将在后面的篇幅讲到,欢迎感兴趣的朋友和我交流.)
posted on 2005-12-10 18:07 圣炎¢天乐 阅读(3136) 评论(15)  编辑 收藏 网摘

FeedBack:
#1楼  2006-03-06 09:39 RedVesper [未注册用户]
在1.1里是否不能这样走呢?

我的调试结果是:

“DefaultDomain”: 已加载“c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll”,未加载符号。
“WindowsApplication1”: 已加载“F:\company\WindowsApplication1\bin\Debug\WindowsApplication1.exe”,符号已加载。
“WindowsApplication1.exe”: 已加载“c:\windows\assembly\gac\system.windows.forms\1.0.5000.0__b77a5c561934e089\system.windows.forms.dll”,未加载符号。
“WindowsApplication1.exe”: 已加载“c:\windows\assembly\gac\system\1.0.5000.0__b77a5c561934e089\system.dll”,未加载符号。
“WindowsApplication1.exe”: 已加载“c:\windows\assembly\gac\system.drawing\1.0.5000.0__b03f5f7f11d50a3a\system.drawing.dll”,未加载符号。
“WindowsApplication1.exe”: 已加载“f:\company\windowsapplication1\bin\debug\interop.speechlib.dll”,未加载符号。
“WindowsApplication1.exe”: 已加载“c:\windows\assembly\gac\mscorlib.resources\1.0.5000.0_zh-chs_b77a5c561934e089\mscorlib.resources.dll”,未加载符号。
未处理的“System.Runtime.InteropServices.COMException”类型的异常出现在 WindowsApplication1.exe 中。

其他信息: HRESULT 中的异常:0x8004503A。


未处理的异常: System.Runtime.InteropServices.COMException (0x8004503A): HRESULT 中的异常:0x8004503A。
at SpeechLib.SpVoiceClass.Speak(String Text, SpeechVoiceSpeakFlags Flags)
at WindowsApplication1.Form1.button1_Click(Object sender, EventArgs e) in f:\company\windowsapplication1\form1.cs:line 115
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.ComponentManager.System.Windows.Forms.UnsafeNativeMethods+IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WindowsApplication1.Form1.Main() in f:\company\windowsapplication1\form1.cs:line 108程序“[3136] WindowsApplication1.exe”已退出,返回值为 0 (0x0)。


望指教!!拜谢。


  回复  引用    
#2楼  2006-03-25 17:02 李通通 [未注册用户]
您好,我是.NET的初学者,现在想要解决一个问题,要在C#中解决语音识别与语音合成的问题,我已经知道通过微软的SAPI,Speech SDK 5.1来解决,但是我安装好之后在.NET中找不到它,我的操作系统是WINDOWS SERVER 2003,听说是2003不支持,是这样吗?这个问题对我来说很重要,希望您帮我解决下,我的社会阅历比较少,这个项目是很重要的,拜托了,希望能认识你,谢谢。
  回复  引用    
#3楼 [楼主] 2006-03-25 17:13 圣炎¢天乐      
WINDOWS SERVER 2003应该是支持的吧,可能是某些服务没有启动,默认情况下,很多服务是没有启动的。如果在.net中找不到,可以通过添加引用来实现。
  回复  引用  查看    
#4楼  2006-04-06 20:26 士大夫 [未注册用户]
我是在VS2003下做的这个实验怎么不行啊???
  回复  引用    
#5楼  2006-04-06 20:29 士大夫 [未注册用户]
还有就是我在别的地方看见这个东东里的汉语是用0来表示的啊!!怎么不和你讲的一样啊,不过就是2个都没弄出来,请问是什么原因啊,又没有报错,编译都正确的》》》》。。。。。。。
  回复  引用    
#6楼  2006-04-09 20:39 士大夫 [未注册用户]
0才是中文哈
  回复  引用    
#7楼  2006-07-25 01:13 xbb7766 [未注册用户]
不一定。
因机而异。要看你的机器装了几个语音合成器了。

我看了下MS的SAMPLE,用一个COMBOBOX来显示已经安装的语音合成器列表,以供选择。

Dim voice As New SpVoice
Dim token As ISpeechObjectToken
For Each token In voice.GetVoices
ComboBox1.Items.Add(token.GetDescription())
Next

然后根据combobox的selectedindex就可以确定使用哪个合成器。
  回复  引用    
#8楼  2006-08-14 10:47 王玮 [未注册用户]
发现一个问题 读的时候老是停不下来 直到读完为止,另外一个用来发出pause命令的按钮根本点不动。
下面是部分代码
public partial class Form1 : Form
{

private SpVoiceClass voice = new SpVoiceClass();
//建立一个私有的发声对象实例
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(2);
//3为中文,024是英文
voice.Speak(richTextBox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);
richTextBox1.Text = voice.Volume.ToString();
}

private void button2_Click(object sender, EventArgs e)
{
voice.Pause();
}

private void button3_Click(object sender, EventArgs e)
{
voice.Resume();
}
  回复  引用    
#9楼  2006-08-14 19:32 zmsx      
你采用异步的方式读就可以用了。
  回复  引用  查看    
#10楼  2006-09-26 18:45 Alehro [未注册用户]
您好, 你说的你采用异步的方式读就可以用了。

请问一下怎么设置为异步?
  回复  引用    
#11楼  2007-01-08 21:30 黄晟 [未注册用户]
您好,有问题想请教,以下代码在本地运行没问题,但上传到服务器后浏览时会得到异常:
Try
If (Not Application("testingApplication") Is Nothing) Then
categoryNames = Application("testingApplication")
voice.Speak("You are browsing the product category", SpeechVoiceSpeakFlags.SVSFlagsAsync)
voice.Speak(categoryNames, SpeechVoiceSpeakFlags.SVSFlagsAsync)
voice.WaitUntilDone(5000)
End If
Catch ex As Exception
End Try

System.Runtime.InteropServices.COMException (0x8004503A): Exception from HRESULT: 0x8004503A at SpeechLib.SpVoiceClass.Speak(String Text, SpeechVoiceSpeakFlags Flags) at _Default.btnSpeak_Click(Object sender, EventArgs e) in D:\Websites\www.sheng-huang.com\Default.aspx.vb:line 85

第八十五行既是voice.Speak("You are browsing the product category", SpeechVoiceSpeakFlags.SVSFlagsAsync)

我是不是应该在服务器上注册SpeechLib.dll?

先谢了!

  回复  引用    
#12楼  2007-01-19 09:31 net [未注册用户]
老大:
下次介绍一下如何通过麦克风录音吧?
  回复  引用    
#13楼  2007-12-13 21:47 彭吉洪 [未注册用户]
5.1 Language Pack

我怎么找不到啊??
  回复  引用    
#14楼  2008-07-18 00:29 yeti_lfx [未注册用户]
为什么在Asp.net中不能调用!最奇怪的是在VS.net中都可以生成Wav文件,在IIS中死活不成,权限设置应该没问题啊,而且查了DCOM MS TTS~~都不让修改任何权限!我什么呢
  回复  引用    
#15楼  2008-10-22 02:10 PingDj [未注册用户]
Www.PingDj.Cn 平仔DJ站
望于同类站点交换连接。。。
  回复  引用    




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: