同一个输出流, 不可以在多线程上共用. 如果要共用, 一定要使用临界段.
不同的输出流, 在多线程上并发处理时互相没有影响.
代码说话:
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("线程录音完成.");
}
}
{
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("线程录音完成.");
}
}
分类:
技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架