haoxiaobo

从C到C++又到.net, 有一些心得, 和大家交流下...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MS Speech api 5.0朗读引擎的多线程处理.

Posted on 2005-06-05 15:40  HAL9000  阅读(2794)  评论(1编辑  收藏  举报

同一个输出流, 不可以在多线程上共用. 如果要共用, 一定要使用临界段.
不同的输出流, 在多线程上并发处理时互相没有影响.
代码说话:

public static void testmulttts()
{
    Thread [] arT 
= new Thread[8];
    
for (int i = 0; i < arT.Length; i ++)
    {
        arT[i] 
= new Thread(new ThreadStart(testtts));
    }

    
foreach(Thread t in arT)
    {
        t.Start();
        Thread.Sleep(
500);
        System.Console.WriteLine(
"线程已经启动!");
    }            
}


public static void testtts()
{

    
///http://msdn.microsoft.com/library/default.asp?url=/library/en-us/SAPI51sr/html/ispvoice_speak.asp
    SpeechLib.SpVoiceClass sp = new SpeechLib.SpVoiceClass();            

    SpeechLib.SpFileStreamClass fs 
= new SpeechLib.SpFileStreamClass();            
    fs.Format.Type 
= SpeechLib.SpeechAudioFormatType.SAFT8kHz8BitMono;
    fs.Open(
"c:\\" + Guid.NewGuid().ToString() + ".wav" , SpeechLib.SpeechStreamFileMode.SSFMCreateForWrite, false);
    
// sp.AudioOutputStream = fs;
    
// The format of selection criteria is 
    
//"Attribute = Value" and "Attribute != Value." 
    
// Voice attributes include 
    
//"Gender," "Age," "Name," "Language," and "Vendor."
    
// 上述这些属性的值可以从注册表的
    
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSSimplifiedChineseVoice\Attributes
    
// 看到
    SpeechLib.ISpeechObjectTokens sps = sp.GetVoices("Language = 409""");
    
for (int i = 0; i < sps.Count; i ++)
    {
        sp.Voice 
= sps.Item(i);

        
lock(typeof(Class1))
        {
            sp.Speak(
"speak in English."
                SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault);
        }
    }
    sps 
= sp.GetVoices("Language = 804""");
    
if (sps.Count > 0)
    {
        sp.Voice 
= sps.Item(0);
        
lock(typeof(Class1))
        {
            sp.Speak(
"中华人民共和国, 中央人民政府, 成立了!"
                SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault);
        }
    }
    fs.Close();
    Marshal.ReleaseComObject(sp);
    Console.WriteLine(
"线程录音完成.");
}
}