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"/>
