在.net中语音识别和语音合成(一)入门篇中介绍了关于语音合成的一些基础知识,就是先j建立一个SpVoiceClass类的对象,然后调用对象的GetVoices方法取的一个发音的对象,但是通过设置该方法的参数只能建立中文发音或是英文发音的对象,而对于中英文混合的文本却没有办法。为解决这个问题,可以对字符串中的每的字符的ASC码进行判断,进而分辨传入的字符串是中文还是英文。以下是判断的代码。
1
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 =
15strSpeak.Substring(iCbeg,iLen) ;
16 SpeakChina(strValue) ;
17 iEbeg = i ;
18 IsChina = false ;
19 }
20 }
21 else
22 {
23 if (chr>122||chr<65)
24 {
25 int iLen = i - iEbeg ;
26 string strValue =
27strSpeak.Substring(iEbeg,iLen) ;
28 this.SpeakEnglishi(strValue) ;
29 iCbeg = i ;
30 IsChina = true ;
31 }
32 }
33 }
34 return IsChina;
35}
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 =
15strSpeak.Substring(iCbeg,iLen) ;
16 SpeakChina(strValue) ;
17 iEbeg = i ;
18 IsChina = false ;
19 }
20 }
21 else
22 {
23 if (chr>122||chr<65)
24 {
25 int iLen = i - iEbeg ;
26 string strValue =
27strSpeak.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();
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();
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();