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。。这个我还没能实现。

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

 

 

posted @ 2014-07-10 17:11  WMTcore  阅读(1465)  评论(0编辑  收藏  举报