基於JavaScript語音播報功能展示

1、首先定義播報方法

可以把這個方法寫在一個js文件裏面,例如定義一個js文件名稱爲:Speech.js,文件內容如下:

"use strict";
var isLoading = false;
var VoiceReader = function () {
    var VoiceReader = function VoiceReader(readWords, readButtonId) {
        return new VoiceReader.fn.init(readWords, readButtonId);
    };

    VoiceReader.fn = VoiceReader.prototype = {
        constructor: VoiceReader,
        init: function init(readWords, callback, eachcallback, readButtonId) {
            VoiceReader.readWords = readWords;
            VoiceReader.inited = 0;
            //VoiceReader.voiceObj = null;
            this.read = function (callback, eachcallback) {
                VoiceReader.fn.stop();
                VoiceReader.readIndex = 0;
                VoiceReader.isStoped = 0;
                VoiceReader.sayutil = null;
                VoiceReader.callback = callback;
                VoiceReader.eachcallback = eachcallback;
                VoiceReader.buttonid = readButtonId;
                this.readVoice();
            };
        },
        callback: function callback() {
            
        },
        eachcallback: function eachcallback(i) {
            
        },
        readVoice: function readVoice() {
            var currentBrowser = GetCurrentBrowser();
            switch (currentBrowser) {
                case "Chrome":
                case "FF":
                case "Opera":
                case "Safari":
                    if (VoiceReader.isStoped == 0) {
                        VoiceReader.sayutil = new window.SpeechSynthesisUtterance(VoiceReader.readWords[VoiceReader.readIndex]);
                        //播報結束事件
                        VoiceReader.sayutil.onend = function (callback) {
                            VoiceReader.readIndex++;
                            if (VoiceReader.readWords.length > VoiceReader.readIndex - 1) {
                                if (typeof VoiceReader.eachcallback == "function") {
                                    VoiceReader.eachcallback(VoiceReader.readIndex - 1);
                                }
                                VoiceReader.fn.readVoice();
                            } else {
                                VoiceReader.readIndex = 0;
                                VoiceReader.isStoped = 1; //播放停止
                                isLoading = false;
                                if (typeof VoiceReader.callback == "function") {
                                    VoiceReader.callback();
                                }
                            }
                        };
                        window.speechSynthesis.speak(VoiceReader.sayutil);
                    };
                    break;
                case "IE55":
                case "IE6":
                case "IE7":
                case "IE8":
                case "IE9":
                case "IE10":
                case "IE11":
                    if (VoiceReader.isStoped == 0) {
                        if (VoiceReader.inited == 0) {
                            try {
                                loadScriptString("VoiceReader.voiceObj = new ActiveXObject('Sapi.SpVoice');"); //此對象需要在單獨的script對象中定義,方可動態綁定事件
                                //播報結束事件
                                var endFunc = function endFunc() {
                                    VoiceReader.readIndex++;
                                    if (VoiceReader.isStoped == 1) {
                                        VoiceReader.readIndex = 0;
                                    }
                                    if (VoiceReader.readWords.length > VoiceReader.readIndex - 1) {
                                        if (typeof VoiceReader.eachcallback == "function") {
                                            VoiceReader.eachcallback(VoiceReader.readIndex - 1);
                                        }
                                        VoiceReader.fn.readVoice();
                                    } else {
                                        VoiceReader.readIndex = 0;
                                        VoiceReader.isStoped = 1; //播放停止
                                        isLoading = false;
                                        if (typeof VoiceReader.callback == "function") {
                                            VoiceReader.callback();
                                        }
                                    }
                                };
                                var startFunc = function startFunc() { };
                                var voiceScript = "function VoiceReader.voiceObj::EndStream(){" + endFunc.toString().match(/(?:\/\*[\s\S]*?\*\/|\/\/.*?\r?\n|[^{])+\{([\s\S]*)\}$/)[1] + "}";
                                voiceScript += "function VoiceReader.voiceObj::StartStream(){" + startFunc.toString().match(/(?:\/\*[\s\S]*?\*\/|\/\/.*?\r?\n|[^{])+\{([\s\S]*)\}$/)[1] + "}";
                                loadScriptString(voiceScript);
                                VoiceReader.inited = 1;
                            } catch (e) {
                                alert("ActiveXObject沒有安裝,請在IE選項中修改相應設置!請設置該瀏覽器:Internet選項->安全->自定義級別->對標記爲可安全執行腳本ActiveX控件執行腳本 該項設置啓用! " + e.message);
                                isLoading = false;
                                if (typeof VoiceReader.callback == "function") {
                                    VoiceReader.callback();
                                }
                            }

                        }
                       
                        if (VoiceReader.voiceObj) {
                            VoiceReader.voiceObj.Resume();
                            VoiceReader.voiceObj.Speak(VoiceReader.readWords[VoiceReader.readIndex], 1);
                        } else {
                            alert("ActiveXObject沒有安裝,請在IE選項中修改相應設置!請設置該瀏覽器:Internet選項->安全->自定義級別->對標記爲可安全執行腳本ActiveX控件執行腳本 該項設置啓用! ");
                            isLoading = false;
                            if (typeof VoiceReader.callback == "function") {
                                VoiceReader.callback();
                            }
                        }
                    }
                    break;
            }
        },
        stop: function stop(callback) {
            var currentBrowser = GetCurrentBrowser();
            switch (currentBrowser) {
                case "Chrome":
                case "FF":
                case "Opera":
                case "Safari":
                    window.speechSynthesis.cancel();
                    VoiceReader.readIndex = 0;
                    VoiceReader.isStoped = 1;
                    break;
                case "IE55":
                case "IE6":
                case "IE7":
                case "IE8":
                case "IE9":
                case "IE10":
                case "IE11":
                    if (VoiceReader.inited == 1) {
                        if (VoiceReader.voiceObj) {
                            VoiceReader.isStoped = 1;
                            VoiceReader.voiceObj.Speak("", 2);
                            VoiceReader.readIndex = 0;
                        }
                    }
                    break;
            }
            if (typeof callback == "function") {
                callback();
            }
        },
        pause: function pause(callback) {
            var currentBrowser = GetCurrentBrowser();
            switch (currentBrowser) {
                case "Chrome":
                case "FF":
                case "Opera":
                case "Safari":
                    window.speechSynthesis.pause();
                    break;
                case "IE55":
                case "IE6":
                case "IE7":
                case "IE8":
                case "IE9":
                case "IE10":
                case "IE11":
                    if (VoiceReader.voiceObj) {
                        //VoiceReader.isStoped = 1;
                        VoiceReader.voiceObj.Pause();
                    }
                    break;
            }
            if (typeof callback == "function") {
                callback();
            }
        },
        resume: function resume(callback) {
            var currentBrowser = GetCurrentBrowser();
            switch (currentBrowser) {
                case "Chrome":
                case "FF":
                case "Opera":
                case "Safari":
                    window.speechSynthesis.resume();
                    window.speechSynthesis.resume();
                    break;
                case "IE55":
                case "IE6":
                case "IE7":
                case "IE8":
                case "IE9":
                case "IE10":
                case "IE11":
                    if (VoiceReader.voiceObj) {
                        //VoiceReader.isStoped = 0;
                        VoiceReader.voiceObj.Resume();
                    }
                    break;
            }
            if (typeof callback == "function") {
                callback();
            }
        }
    };

    VoiceReader.fn.init.prototype = VoiceReader.fn;
    return VoiceReader;
} ();

//添加jscode
function loadScriptString(code) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    try {
        script.appendChild(document.createTextNode(code));
    } catch (ex) {
        script.text = code;
    }
    document.body.appendChild(script);
}

//獲取當前瀏覽器類型
//myBrowser() start
function GetCurrentBrowser() {
    //取得瀏覽器的userAgent字符串
    var userAgent = navigator.userAgent.toLocaleLowerCase();
    var isChrome = userAgent.indexOf("chrome") > -1; //判斷是否谷歌瀏覽器
    var isOpera = userAgent.indexOf("opera") > -1; //判斷是否Opera瀏覽器
    var isIE = userAgent.match(/msie/) != null || userAgent.match(/trident/) != null; //userAgent.indexOf("compatible") > -1 && userAgent.indexOf("msie") > -1 && !isOpera; //判斷是否IE瀏覽器
    var isFF = userAgent.indexOf("firefox") > -1; //判斷是否Firefox瀏覽器
    var isSafari = userAgent.indexOf("safari") > -1; //判斷是否Safari瀏覽器	
    if (isIE) {
        var IE5, IE55, IE6, IE7, IE8, IE9, IE10, IE11;
        IE5 = IE55 = IE6 = IE7 = IE8 = IE9 = IE10 = IE11 = false;
        /*
        var reIE = new RegExp("msie (\\d+\\.\\d+);");
        reIE.test(userAgent);
        var fIEVersion = parseFloat(RegExp["$1"]);
        */
        var fIEVersion = userAgent.match(/msie ([\d.]+)/) != null ? userAgent.match(/msie ([\d.]+)/)[1] : userAgent.match(/rv:([\d.]+)/)[1];
        IE55 = fIEVersion == 5.5;
        IE6 = fIEVersion == 6.0;
        IE7 = fIEVersion == 7.0;
        IE8 = fIEVersion == 8.0;
        IE9 = fIEVersion == 9.0;
        IE10 = fIEVersion == 10.0;
        IE11 = fIEVersion == 11.0;
        if (IE55) {
            return "IE55";
        }
        if (IE6) {
            return "IE6";
        }
        if (IE7) {
            return "IE7";
        }
        if (IE8) {
            return "IE8";
        }
        if (IE9) {
            return "IE9";
        }
        if (IE10) {
            return "IE10";
        }
        if (IE11) {
            return "IE11";
        }
    } //isIE end
    if (isFF) {
        return "FF";
    }
    if (isOpera) {
        return "Opera";
    }
    if (isChrome) {
        return "Chrome";
    }
} //myBrowser() end

 2、調用播報事件

根據實際的業務需求來獲取播報的內容信息。 

<script type="text/javascript" charset="utf-8" src='@Url.Content("~/Scripts/jquery.min.js")'> </script>
<script type="text/javascript" charset="utf-8" src='@Url.Content("~/Scripts/Speech.js")'> </script>

<div>
<button type="button" onclick="GetVoiceSpeech()">
                    播報</button>
                <button type="button" onclick="GetVoiceSpeechPause()">
                    播報暫停</button>
                <button type="button" onclick="GetVoiceSpeechResume()">
                    播報繼續</button>
                <button type="button" onclick="GetVoiceSpeechStop()">
                    播報停止</button>
</div>

<script type="text/javascript">
    var readStrArr = [];
    var reader = null;
    var readIndex = 0;
    "use strict";
    //開始播報
    function GetVoiceSpeech() {
        if (isLoading) return;
        isLoading = true;
        $.ajax({
            type: 'post',
            url: "url",
            dataType: "json",
            data: {},
            cache: false,
            success: function (json) {
                for (var i = 0; i < json.list.length; i++) {
                    readStrArr.push(json.list[i].name + "  ");
                }
                reader = VoiceReader(readStrArr, "");
                reader.read(function () {
                }, function (i) {
                });
                readStrArr = [];
            },
            error: function (e) {
                isLoading = false;
            }
        });

    }
    //暫停播報
    function GetVoiceSpeechPause() {
        reader.pause(function () {
        });
    }
    //繼續播報
    function GetVoiceSpeechResume() {
        reader.resume(function () {
        });
    }
    //停止播報
    function GetVoiceSpeechStop() {
        reader.stop(function () {
            isLoading = false;
        });
    }
</script>



//以下是測試內容,供參考
<div>
<button type="button" onclick="GetVoiceSpeechTest()">
                    播報</button>
                <button type="button" onclick="GetVoiceSpeechPauseTest()">
                    播報暫停</button>
                <button type="button" onclick="GetVoiceSpeechResumeTest()">
                    播報繼續</button>
                <button type="button" onclick="GetVoiceSpeechStopTest()">
                    播報停止</button>
</div>

<script type="text/javascript">
    var readStrArr = [];
    readStrArr.push("我是張三 大家好");
    readStrArr.push("我是李四 大家好");
    readStrArr.push("我是王五 大家好,歡迎來我校");
    var reader = null;
    var readIndex = 0;
    "use strict";
    //開始播報
    function GetVoiceSpeechTest() {
        if (isLoading) return;
        reader.read(function () {}, function (i) {});
        readStrArr = [];
    }
    //暫停播報
    function GetVoiceSpeechPauseTest() {
        reader.pause(function () {
        });
    }
    //繼續播報
    function GetVoiceSpeechResumeTest() {
        reader.resume(function () {
        });
    }
    //停止播報
    function GetVoiceSpeechStopTest() {
        reader.stop(function () {
            isLoading = false;
        });
    }
</script>





 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章