vue 语音合成

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、百度语音 
restAPI https 请求,在线语音合成免费 
    tex 必填 合成的文本,使用UTF-8编码。小于2048个中文字或者英文数字。(文本在百度服务器内转换为GBK后,长度必须小于4096字节) 
    tok 必填 开放平台获取到的开发者 
    access_token(见上面的“鉴权认证机制”段落)
    cuid 必填 用户唯一标识,用来计算UV值。建议填写能区分用户的机器 
    MAC 地址或 IMEI 码,长度为60字符以内 
    ctp 必填 客户端类型选择,web端填写固定值1 
    lan 必填 固定值zh。语言选择,目前只有中英文混合模式,填写固定值zh spd 选填 语速,取值0-15,默认为5中语速 
    pit 选填 音调,取值0-15,默认为5中语调 vol 选填 音量,取值0-15,默认为5中音量 
    per 选填 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声 
    aue 选填 3为mp3格式(默认); 4为pcm-16k;5为pcm-8k;6为wav(内容同pcm-16k); 

     注意aue=4或者6是语音识别要求的格式,但是音频内容不是语音识别要求的自然人发音,所以识别效果会受影响。

     重点****关闭 mock , 定义axios返回数据类型 responseType blob 
     重点****关闭 mock , 定义axios返回数据类型 responseType blob 
     重点****关闭 mock , 定义axios返回数据类型 responseType blob 

     核心代码 如下

    

import util from './util'
import { otherServiceGet,otherServiceBlobPost } from '../api/api'

const audio = {}

/**
 * 浏览器调用语音合成接口
 * @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秒
 */
const isFunction = (obj) => {
    if (Object.prototype.toString.call(obj) === '[object Function]') {
        return true
    }
    return false
}

let canPlay = true;

const btts = function (param, options, audioTextArr) {
    let url = 'http://tsn.baidu.com/text2audio'
    let opt = options || {}
    let p = param || {}

    // 如果浏览器支持,可以设置autoplay,但是不能兼容所有浏览器
    let 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秒
    let DEFAULT_TIMEOUT = 30000
    let timeout = opt.timeout || DEFAULT_TIMEOUT

    // 创建form参数
    let data = {}
    for (let p in param) {
        data[p] = param[p]
    }

    // 赋值预定义参数
    data.cuid = data.cuid || data.tok
    data.ctp = 1
    data.lan = data.lan || 'zh'

    otherServiceBlobPost(url,data).then(res => {
        const fileReader = new FileReader();
        if (res.data.type === 'audio/mp3') {
            // 在body元素下apppend音频控件
            document.body.append(audio)
            let urlObject = window.URL || window.webkitURL || window
            let src = urlObject.createObjectURL(res.data)
            audio.setAttribute('src', src)
            // autoDestory设置则播放完后   移除audio的dom对象
            if (opt.autoDestory) {
                audio.onended =  () => {
                    canPlay = true
                    document.body.removeChild(audio)
                    audioTextArr.splice(0,1)
                }
            }
            isFunction(opt.onSuccess) && opt.onSuccess(audio)
        }
        // 用来处理错误
        if (res.type === 'application/json') {
            fileReader.onload =  () => {
                let text = fileReader.result
                isFunction(opt.onError) && opt.onError(text)
            }
            fileReader.readAsText(res)
        }
    })
}

audio.text2Audio = function (audioTextArr) {
    //https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=*******S&client_secret=*******
    // 调用语音合成接口
    // 参数含义请参考 https://ai.baidu.com/docs#/TTS-API/41ac79a6
    if(canPlay && audioTextArr.length != 0){
        canPlay = false
        btts({
            tex: audioTextArr[0],
            tok: '24.35df59bd2429785a878672f52e6de877.2592000.1547271881.282335-15133749',
            spd: 6,
            pit: 5,
            vol: 15,
            per: 0
        }, {
            volume: 0.3,
            autoDestory: true,
            timeout: 10000,
            hidden: true,
            autoplay: true,
            onInit: function (htmlAudioElement) {

            },
            onSuccess: function (htmlAudioElement) {
                htmlAudioElement.play()
            },
            onError: function (text) {
                util.log.danger(text)
            },
            onTimeout: function () {
                util.log.warning('timeOut')
            }
        },audioTextArr)
    }
}

export default audio

   

 2、科大讯飞 合成语音api类型 java php node a ndroid ios


 

转载于:https://my.oschina.net/dreambreeze/blog/2990017

你可能感兴趣的:(vue 语音合成)