部分转载:http://www.the5fire.net/?p=69
预先知识:
类型库导入程序 (Tlbimp.exe):类型库导入程序将 COM 类型库中的类型定义转换为公共语言运行库程序集中的等效定义。Tlbimp.exe 的输出为二进制文件(程序集),该文件中包含在原始类型库中定义的类型的运行库元数据。可以使用诸如 Ildasm.exe 这样的工具检查此文件。
附上原文的一部分:
-------------------------------------------------------------------------------------
首先下载sapi.dll文件: http://u.115.com/file/f4d3df0e16 【如果原作者的链接不好用了,联系偶】
然后要利用vs自带的工具Tlbimp.exe把sapi导出到托管动态链接库中,以便在.net环境中使用。具体操作就是在开始程序中找到vs的菜单,里面有Visual Studio Tools,然后打开Visual Studio 2008 命令提示。
输入命令tlbimp [sapi.dll完整目录] /out::DotNetSpeech.dll,忽略警告和错误。 【这个输出的直接到vc的根目录了,自己去找或者在这里指定目标位置】
完成之后你就就可以使用这个dll文件了。
打开vs2008,新建一个c#项目,添加引用,引用那个DotNetSpeech文件。
在文件上面引入命名空间:using DotNetSpeech;
测试代码如下:
class Program
{
static void Main(string[] args)
{
SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice sp = new SpVoice();
sp.Speak("哈哈,你好,我叫**",spFlags );
Console.Read();
}
}
我在vs2010下实验,上述的console条件下的没有通过,报错:
未处理的异常: System.InvalidCastException: 指定的转换无效。 在 DotNetSpeech.SpVoiceClass.Speak(String Text, SpeechVoiceSpeakFlags Flags) 在 qySpeechInDotNet2.Program.Main(String[] args) 位置 E:/CODE/C#开发文本朗读/ qySpeechInDotNet2/Program.cs:行号 14 |
但是如果是winform项目类型就可以,who kown why ?
附上原作者winform的demo的源代码,很简单的,就是读txt,然后再读出来。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using DotNetSpeech;
namespace SpeechDemo2 { public partial class frmMain : Form { SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice sp = new SpVoice(); private SpSharedRecoContext ssrc; private ISpeechRecoGrammar srg;
public frmMain() { InitializeComponent(); sp.Speak("你好,很高兴为你服务", spFlags); }
private void btnExit_Click(object sender, EventArgs e) { this.Close(); }
private void btnOpen_Click(object sender, EventArgs e) {
ofdSelect.ShowDialog(); Stream s = ofdSelect.OpenFile(); StreamReader sr1 = new StreamReader(s, Encoding.GetEncoding("GB2312")); String str = sr1.ReadToEnd(); rtbContent.Text = str; sp.Speak("载入完成", spFlags); }
private void btnRead_Click(object sender, EventArgs e) { sp.Speak(rtbContent.Text, spFlags); sp.Speak("完工了", spFlags); }
private void btnStop_Click(object sender, EventArgs e) { sp.Speak("还没开发", spFlags); }
private void btnListen_Click(object sender, EventArgs e) { } } |