·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> asp.net 实现 tts

asp.net 实现 tts

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

asp.net 实现 tts

之前用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     }

(类TextToSpeak的代码在上一篇里)

希望有大神能看到帮我解决这个问题(若大神看不到,就只能自己慢慢纠结了>_<)-----如果想看解决方法的小伙伴,可以忽略上面的代码。。

尝试了好多方法,就这个能行(还要添加一个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。。这个我还没能实现。

先到这了,我还在慢慢调试,等搞出来了,立马发出来。。也希望有大神帮我解决下哇~~