使用Speech实现js播放音频

环境:

windows10;

IIS 10;

.Net4.5.2;

首先在程序中添加System.Speech的引用

在控制器中加入以下代码:

 1         public async Task GetSpeek(string context)
 2         {
 3             try
 4             {
 5                 using (SpeechSynthesizer hello = new SpeechSynthesizer())
 6                 {
 7                     var speek = hello.SpeakAsync(context);
 8                     while (!speek.IsCompleted)
 9                     {
10                         System.Threading.Thread.Sleep(100);
11                     }
12                     using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
13                     {
14                         hello.SetOutputToWaveStream(ms);
15 
16                         HttpContext.Response.ClearContent();
17                         HttpContext.Response.ContentType = "audio/mp3";
18                         HttpContext.Response.BinaryWrite(ms.ToArray());
19                         //Dispose
20                         await ms.FlushAsync();
21                         // ms.Dispose();
22                         ms.Close();
23                         
25                         HttpContext.Response.Close();
26                     }
27                 }
28             }
29             catch (Exception ex)
30             {
31 
32             }
33         }

注意:这里只能使用异步方法

为什么?异常会告诉你。

最后一句

HttpContext.Response.Close();

  

这句,为什么,等会我再解释,先上前端代码:

    function speckText() {
        try {
            var n = new Audio();

            var url = "http://localhost:8211/Home/GetSpeek?context=" + Math.random();
            n.src = url;
            n.loop = false;
            n.play();
        } catch (e) {

        }
    }

这里使用html5的audio控件,我这边加了一个

n.loop=false

但是,在测试时候,发现若后台不断开链接,该audio会重复读3遍。而在javascript加这句也没用。所以后台必须给前端一个停止的信息,用来停止这次链接。

这里就有一个不好的地方。

上图!!!

可以看出由于是后台发送停止的,所以前端这边都是显示链接失败,但是!语音的确是有的。

还有一个点就是,发布到IIS上时

进程模型=>标识=>修改为LocalSystem。

没了~

若大家有什么更好的可以推荐给我。有什么优化建议也可以交流交流。

灰常感谢

猜你喜欢

转载自www.cnblogs.com/FlyStupidBird/p/9634641.html