最近在開發一個微信排隊取號的的系統,其中對於服務員端(管理端) 須要有呼叫功能,即點按鈕 就播出"xxx號顧客請就座"的聲音。html
通過在網上一番搜索研究,web端實現指定文字的語音播放 方案有這幾種前端
1 免費在線服務,一些網站提供文字轉語音文件的功能,其中好像百度,訊飛還提供接口調用,但對我來講,須要聯網這個條件就被否決了。web
2 使用微軟內置activatex語音控件,最簡單的但缺點也明顯,只能在IE上用,考慮到系統可能在平板電腦上使用,因此這個方案也被否決。c#
js代碼 api
var VoiceObj = new ActiveXObject("Sapi.SpVoice");
VoiceObj.Speak("xxx號顧客請就座", 1);安全
3 重點來了。 前端使用H5的audio播放組件,後臺使用SpeechSynthesizer生成wav音頻文件流直接向播放器的src輸出。微信
大體代碼以下:app
前端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#後臺代碼ide
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"/>