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