zoukankan      html  css  js  c++  java
  • APP-8-文本语音

    1.百度语音合成JS文件

     baidu_tts_cors.js

    /**
     * 浏览器调用语音合成接口
     * @param {Object} param 百度语音合成接口参数
     * 请参考 https://ai.baidu.com/docs#/TTS-API/41ac79a6
     * @param {Object} options 跨域调用api参数
     *           timeout {number} 超时时间 默认不设置为60秒
     *           volume {number} audio控件音量,范围 0-1
     *           hidden {boolean} 是否隐藏audio控件
     *           autoDestory {boolean} 播放音频完毕后是否自动删除控件
     *           onInit {Function} 创建完audio控件后调用
     *           onSuccess {Function} 远程语音合成完成,并且返回音频文件后调用
     *           onError {Function}  远程语音合成完成,并且返回错误字符串后调用
     *           onTimeout {Function} 超时后调用,默认超时时间为60秒
     */
    function btts(param, options) {
        var url = 'http://tsn.baidu.com/text2audio';
        var opt = options || {};
        var p = param || {};
    
        // 如果浏览器支持,可以设置autoplay,但是不能兼容所有浏览器
        var audio = document.createElement('audio');
        if (opt.autoplay) {
            audio.setAttribute('autoplay', 'autoplay');
        }
    
        // 隐藏控制栏
        if (!opt.hidden) {
            audio.setAttribute('controls', 'controls');
        } else {
            audio.style.display = 'none';
        }
    
        // 设置音量
        if (typeof opt.volume !== 'undefined') {
            audio.volume = opt.volume;
        }
    
        // 调用onInit回调
        isFunction(opt.onInit) && opt.onInit(audio);
    
        // 默认超时时间60秒
        var DEFAULT_TIMEOUT = 60000;
        var timeout = opt.timeout || DEFAULT_TIMEOUT;
    
        // 创建XMLHttpRequest对象
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url);
    
        // 创建form参数
        var data = {};
        for (var p in param) {
            data[p] = param[p]
        }
    
        // 赋值预定义参数
        data.cuid = data.cuid || data.tok;
        data.ctp = 1;
        data.lan = data.lan || 'zh';
    
        // 序列化参数列表
        var fd = [];
        for(var k in data) {
            fd.push(k + '=' + encodeURIComponent(data[k]));
        }
    
        // 用来处理blob数据
        var frd = new FileReader();
        xhr.responseType = 'blob';
        xhr.send(fd.join('&'));
    
        // 用timeout可以更兼容的处理兼容超时
        var timer = setTimeout(function(){
            xhr.abort();
            isFunction(opt.onTimeout) && opt.onTimeout();
        }, timeout);
    
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                clearTimeout(timer);
                if (xhr.status == 200) {
                    if (xhr.response.type === 'audio/mp3') {
    
                        // 在body元素下apppend音频控件
                        document.body.append(audio);
    
                        audio.setAttribute('src', URL.createObjectURL(xhr.response));
    
                        // autoDestory设置则播放完后移除audio的dom对象
                        if (opt.autoDestory) {
                            audio.onended = function() {
                                document.body.removeChild(audio);
                            }
                        }
    
                        isFunction(opt.onSuccess) && opt.onSuccess(audio);
                    }
    
                    // 用来处理错误
                    if (xhr.response.type === 'application/json') {
                        frd.onload = function(){
                            var text = frd.result;
                            isFunction(opt.onError) && opt.onError(text);
                        };
                        frd.readAsText(xhr.response);
                    }
                }
            }
        }
    
        // 判断是否是函数
        function isFunction(obj) {
            if (Object.prototype.toString.call(obj) === '[object Function]') {
                return true;
            }
            return false;
        }
    }
    View Code

    2.HTML代码部分

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>JS Bin</title>
      <!--//跨域问题:调用JS文件-->
      <script type="text/javascript" src="../../js/tts/baidu_tts_cors.js"></script>
      <script type="text/javascript">
    
        // 初始化变量
        var audio = null;
        var playBtn = null;
    
        // dom加载完毕回调后注册按钮对象
        ready(function() {
            playBtn = document.getElementById('playBtn');
        });
    
        // 合成按钮
        function tts() {  
            var text = document.getElementById('txtts').value;
            playBtn.innerText = '准备中';
    
            // 调用语音合成接口 
            // 参数含义请参考 https://ai.baidu.com/docs#/TTS-API/41ac79a6
            audio = btts({
                tex: text,
                tok: '24.161aadc20db180b6f7246a9bde7cca09.2592000.1538896023.282335-11785013',
                spd: 4,
                pit: 5,
                vol: 15,
                per: 4
            }, {
                volume: 0.3,
                autoDestory: true,
                timeout: 10000,
                hidden: false,
                onInit: function (htmlAudioElement) {
    
                },
                onSuccess: function(htmlAudioElement) {
                    audio = htmlAudioElement;
                    playBtn.innerText = '播放';
                },
                onError: function(text) {
                    alert(text)
                },
                onTimeout: function () {
                    alert('timeout')
                }
            });
        }
    
        // 播放按钮
        function play() {
            if (audio === null) {
                alert('请先点击合成')
            } else {
                audio.play();
            }
        }
    
        // 暂停按钮
        function pause() {
            if (audio === null) {
                alert('请先点击合成')
            } else {
                audio.pause();
            }
        }
    
        // 取消按钮
        function cancel() {
            if (audio === null) {
                alert('请先点击合成')
            } else {
                audio.pause();
                document.body.removeChild(audio);
                audio = null;
                playBtn.innerText = '准备中';
            }
        }
    
        // dom加载完毕回调
        function ready(callback){
            var doc = document;
            if (doc.addEventListener) {
                doc.addEventListener('DOMContentLoaded', function() {
                    callback();
                }, false);
            } else if (doc.attachEvent) {
                doc.attachEvent('onreadystatechange', function() {
                    if (doc.readyState === 'complete') {
                        callback();
                    }
                });
            }
        }
      </script>
    </head>
    <body>
        <div>
              <!--文本转语音-->
            <input type="text" id='txtts' value='杭州吉利易云科技有限公司' style=' 500px;'>
            <button onclick='tts()'>合成</button>
            <button onclick='play()' id='playBtn'>准备中</button>
            <button onclick='pause()'>暂停</button>
            <button onclick='cancel()'>取消</button>
        </div>
        <div>
                    <!--语音转文本-->
            <input type="text" id='txstt' style=' 500px;'>
            <button onclick='stt()'>语音</button>
            <button onclick='start()' id='startBtn'>开始</button>
            <button onclick='end()' id='endBtn'>结束</button>
            <button onclick='sttcle()'>取消</button>
        </div>
    </body>
    </html>
    View Code

    3.百度应用生成签名

     APP-8.1-百度语音应用

     APP-8.2-Postman应用

     "access_token": "24.6e0c4cfea2a6bc6450537599470d7247.2592000.1552714003.282335-11785013"

     将Access_token值替换第二部分HTML代码中的tok值

     

    4.执行并测试

     

     

     点击合成并播放

     

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/ricoo/p/10370867.html
Copyright © 2011-2022 走看看