zoukankan      html  css  js  c++  java
  • 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。。这个我还没能实现。

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

  • 相关阅读:
    mysql数据库安装与配置
    redis主从配置+sentinel哨兵模式
    Oracle 本地验证和密码文件
    Oracle 12c hub和leaf的转换
    oracle 12c CPU资源隔离
    oracle12 listagg 与 wm_concat行列转换
    Oracle 12c rac搭建
    ClassLoader.loadClass()与Class.forName()的区别《 转》
    docker 安装mysql8.0
    spring boot @EnableWebMvc禁用springMvc自动配置原理。
  • 原文地址:https://www.cnblogs.com/WMTcore/p/3836136.html
Copyright © 2011-2022 走看看