web端文字轉語音的幾種方案


最近在開發一個微信排隊取號的的系統,其中對於服務員端(管理端) 需要有呼叫功能,即點按鈕 就播出"xxx號顧客請就座"的聲音。

經過在網上一番搜索研究,web端實現指定文字的語音播放 方案有這幾種

1  免費在線服務,一些網站提供文字轉語音文件的功能,其中好像百度,訊飛還提供接口調用,但對我來說,需要聯網這個條件就被否決了。

2 使用微軟內置activatex語音控件,最簡單的但缺點也明顯,只能在IE上用,考慮到系統可能在平板電腦上使用,所以這個方案也被否決。

 js代碼   

   var VoiceObj = new ActiveXObject("Sapi.SpVoice");
   VoiceObj.Speak("xxx號顧客請就座", 1);

3  重點來了。 前端使用H5的audio播放組件,后台使用SpeechSynthesizer生成wav音頻文件流直接向播放器的src輸出。

   大致代碼如下:

前端html

<audio id="audioPlay">
<source type="audio/wav" /> 
</audio>

......

function play(callText) {
var audioPlay = document.getElementById("audioPlay");
audioPlay.src = "../voicehandler.ashx? voice=" + callText;
audioPlay.play();
}

c#后台代碼

public class VoiceHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {      

            Thread t = null; 
            context.Response.ContentType = "application/wav";
            using (MemoryStream ms = new MemoryStream())
            {
               
                t = new Thread(() =>
                {
                    SpeechSynthesizer ss = new SpeechSynthesizer();
                    try
                    {
                        ss.Rate = -5;
                        ss.Volume = 90;
                        ss.SetOutputToWaveStream(ms);
                        ss.Speak(context.Request["voice"]);
                    }
                    catch(Exception  ex)
                    {
                        ss.Dispose();
                        context.Response.Write(ex.Message);
                    }
                });
                t.Start();
                t.Join();
                ms.Position = 0;
                if (ms.Length > 0)
                {
                    ms.WriteTo(context.Response.OutputStream);
                }
                context.Response.End();
               
            }         

        }
}

 

由於語音要設置人聲,語速,然后合成語音等一個系列的過程,所以這里要注意的是需要通過異步線程方式調用 SpeechSynthesizer。

iis調用SpeechSynthesizer,還涉及權限問題,如果程序報出這個異常:

System.InvalidOperationException    Message=系統上未安裝語音,或沒有當前安全設置可用的語音。

那么,試試 

1. 權限問題;你可以嘗試把應用程序池的進程標識改成LocalSystem 

2. webconfig配置:<identity impersonate="true" userName="YourAdminUsr" password="YourAdminPwd"/>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM