在.net中使用语音识别和语音合成技术,需要借助微软的Speech SDK,如果是要在Web应用程序中使用,则需要Speech Application SDK。其中Speech SDK可以在http://www.microsoft.com/speech/download/sdk51/下载,其中有两个文件Speech SDK 5.1和5.1 Language Pack,前者是开发包,但是其中只包含对英文的支持,后者是中文和日文的语言包,装完就能支持中文了。
SDK组成结构
演练
1. 打开vs2005,建立一个windows application,在设计窗体中加入一个label,一个richtextbox(用于输入要读的文本),以及一个button。并分别设置的label与button的Text属性。如下图
2. 添加必要的引用,项目->添加引用->COM 选择Microsoft Speech Object Library点确定退出。
3. 双击button,为其添加事件。在代码页顶端先添加命名空间,代码如:
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 | 阻塞进程,直到声音播放完毕或者超时。 |
public
bool
Analyse(
string
strSpeak)2

{3
int iCbeg = 0 ;4
int iEbeg = 0 ;5
bool IsChina = true ;6
for(int i=0;i<strSpeak.Length;i++)7

{8
char chr = strSpeak[i] ;9
if (IsChina)10

{11
if (chr<=122&&chr>=65)12

{13
int iLen = i - iCbeg ;14
string strValue = 15
strSpeak.Substring(iCbeg,iLen) ;16
SpeakChina(strValue) ;17
iEbeg = i ;18
IsChina = false ;19
}20
}21
else22

{23
if (chr>122||chr<65)24

{25
int iLen = i - iEbeg ;26
string strValue = 27
strSpeak.Substring(iEbeg,iLen) ;28
this.SpeakEnglishi(strValue) ;29
iCbeg = i ;30
IsChina = true ;31
}32
}33
}34
return IsChina;35
}
对于Speak方法的参数,第一个是一个字符串类型,第二个是一个SpeechVoiceSpeakFlags类型的枚举。当将其设置为SVSFDefault时,则第一个就是要读的文本,若将其设置为SVSFIsFilename时,第一个参数就是所要读的文本的文件名,而不是要读的内容。
下面介绍这个类的SpeakStream方法,这个方法有2个参数,第一个是SpeechBaseStream,第二和Speak一样,是一个SpeechVoiceSpeakFlags类型的枚举。SpeechBaseStream是一个接口,继承它的有3个对象,这3个都很相似,先介绍其中之一SpFileStream。SpFileStream有3个比较常用的方法:Read,Seek,Write。其中Read方法可以创建一个*.wav文件,以下代码演示了创建文件的步骤:
SpFileStreamClass fs1
=
new
SpFileStreamClass();
SpVoiceClass v
=
new
SpVoiceClass();
fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMCreateForWrite,
false
);
//
textBox1.text是要创建的文件的路径。
v.AudioOutputStream
=
fs1;
string
[] ss
=
new
string
[
4
]
{ "this", "is", "a", "demo" }
;
foreach
(
string
s
in
ss)
{
v.Speak(s, SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
fs1.Close();
下面的代码将用于展示Speak与SpeakStream:
SpFileStreamClass fs1
=
new
SpFileStreamClass();
SpFileStreamClass fs2
=
new
SpFileStreamClass();
SpVoiceClass v
=
new
SpVoiceClass();
fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMOpenForRead,
false
);
fs2.Open(textBox2.Text, SpeechStreamFileMode.SSFMOpenForRead,
false
);
v.Speak(
"
This is the first sound file
"
, SpeechVoiceSpeakFlags.SVSFlagsAsync);
v.SpeakStream(fs1, SpeechVoiceSpeakFlags.SVSFlagsAsync);
v.Speak(
"
This is the second sound file
"
, SpeechVoiceSpeakFlags.SVSFlagsAsync);
v.SpeakStream(fs2, SpeechVoiceSpeakFlags.SVSFlagsAsync);
fs1.Close();
fs2.Close();

本文介绍如何使用微软的SpeechSDK在.NET中实现语音合成技术,包括安装SDK、配置开发环境及编写代码等步骤,并提供了处理中英文混合文本的示例。
724





