.net中语音识别和语音合成(二)语音合成提高篇

 

.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}
 

对于Speak方法的参数,第一个是一个字符串类型,第二个是一个SpeechVoiceSpeakFlags类型的枚举。当将其设置为SVSFDefault时,则第一个就是要读的文本,若将其设置为SVSFIsFilename时,第一个参数就是所要读的文本的文件名,而不是要读的内容。
 

下面介绍这个类的SpeakStream方法,这个方法有2个参数,第一个是SpeechBaseStream,第二和Speak一样,是一个SpeechVoiceSpeakFlags类型的枚举。SpeechBaseStream是一个接口,继承它的有3个对象,这3个都很相似,先介绍其中之一SpFileStreamSpFileStream3个比较常用的方法: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();
 

下面的代码将用于展示SpeakSpeakStream

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();

 

(这一篇是上一篇的补充,对合成的方法做了进一步的说明)

你可能感兴趣的:(.net)