之前用WinForm实现tts已经成功,就调用了下系统的类库。但我把相同的代码搬到asp.net上时却碰到了许多问题,查了好多网站、试过了很多方法,到现在算是做出了一部分吧。
之前调用微软的TTS是用的这个代码
1 SpeechSynthesizer speech = new SpeechSynthesizer(); 2 public void Speak(string text, int rate) 3 { 4 speech.Rate = rate; 5 speech.Speak(text); 6 speech.Dispose(); 7 }
在网页上,我把这个方法赋给了button的click事件。按第一次是有声音的,但声音播放完后后网页却仍在不停的载入,再按button也没反应了。跟着调试过了一遍,也发现事件明明都结束了。感觉很凌乱,然后想用Ajax让它后台自己执行并生成音频文件,第一次点击按钮时生成很顺利,但点击第二时就出现问题了,它过了好久才生成出来,就像卡住了,一小伙伴也遇到了同样的问题。先上Ajax代码:
1 <script type="text/javascript"> 2 $(document).ready(function() { 3 $("#bt_read").click(function () { 4 var url = window.location.href + "/TextSpeak"; 5 $.ajax({ 6 type: "POST", 7 url: url, 8 data: "{'text':'hello'}", 9 contentType: "application/json;charset=utf-8", 10 dataType: "json", 11 error: function() { 12 alert("error"); 13 } 14 }); 15 }); 16 }) 17 </script>
这是后台的代码:
1 [WebMethod] 2 public static void TextSpeak(string text) 3 { 4 TextToSpeak ttSpeak = new TextToSpeak(); 5 string x = DateTime.Now.ToString("yyyyMMddHHmmss"); 6 ttSpeak.SaveWaveFile("d:/" + x + ".wav", text, 1, "male"); 7 }
希望有大神能看到帮我解决这个问题(若大神看不到,就只能自己慢慢纠结了>_<)-----如果想看解决方法的小伙伴,可以忽略上面的代码。。
尝试了好多方法,就这个能行(还要添加一个DotNetSpeech.dll类库):
/// <summary> /// 网页上使用TTS /// </summary> /// <param name="path">路径</param> /// <param name="text">文本</param> /// <param name="rate">语速</param> /// <param name="gender">性别</param> public void SaveWaveFile(string path,string text,int rate,string gender) { Type type = Type.GetTypeFromProgID("SAPI.SpVoice"); dynamic spVoice = Activator.CreateInstance(type);//主要是用了这个来调用DotNetSpeech var obj = spVoice.GetVoices(); if (gender.ToLower()=="male") { for (int i = 0; i < obj.Count; i++) { string desc = obj.Item(i).GetDescription(); if (desc.Contains("Paul")) { spVoice.Voice = obj.Item(i); } } } else if(gender.ToLower()=="female") { for (int i = 0; i < obj.Count; i++) { string desc = obj.Item(i).GetDescription(); if (desc.Contains("Kate")) { spVoice.Voice = obj.Item(i); } } } spVoice.Rate = rate; SpeechStreamFileMode spfFileMode = SpeechStreamFileMode.SSFMCreateForWrite; SpFileStream spFileStream = new SpFileStreamClass(); spFileStream.Open(path, spfFileMode, false); spVoice.AudioOutputStream = spFileStream; spVoice.Speak(text); spVoice.WaitUntilDone(1000); spFileStream.Close(); }
为啥我没写speak的方法呢。。要在网页客户端上播放音频,让服务器speak有啥用。服务器喊哑了,客户端也是听不到的哦~~只能生成音频文件传到网页上用插件播放。为啥我说是半成品呢,因为我试过很多方法了,总找不到合适的插件解决播放的问题.
突然才发现原来它可以直接生成.MP3,网上都说要生成wav格式的,自己也没试试,直到看到小伙伴直接把路径写成*.MP3,并且能生成出来才知道原来是可以直接输出MP3哇。。那这样问题就不大了,找个插件把路径附进去就行啦~~
插件要满足这两个条件:
1.能动态添加链接。
2.能播放.wav格式。
我试过用自定义控件编写的mediaPlayer插件来播放 参考:http://www.cnblogs.com/insus/archive/2009/05/03/1448097.html
其实这个能把问题都解决了。。就是只有在ie上有效果,其他浏览器上都不行。。看了网页代码,音频链接都读取到了但就是不能播放~~
还有一个结果方法,就是让swf播放器能播放tts生成的wav文件,或者把wav转换成MP3。。这个我还没能实现。
先到这了,我还在慢慢调试,等搞出来了,立马发出来。。也希望有大神帮我解决下哇~~