赞
踩
本来一开始是因为项目中需要用到听书功能,就想用科大讯飞的语音合成Web API,本来官方文档已经提供了一个完整demo,不过根据自己的需求还是弄了一天左右o(╥﹏╥)o
官方文档: https://www.xfyun.cn/doc/tts/online_tts/API.html
根据文档接口调用流程
使用WebSocket请求接口与返回
function getAuthStr(date) {
let signatureOrigin = `host: ${config.host}\ndate: ${date}\nGET ${config.uri} HTTP/1.1`
let signatureSha = CryptoJS.HmacSHA256(signatureOrigin, config.apiSecret)
let signature = CryptoJS.enc.Base64.stringify(signatureSha)
let authorizationOrigin = `api_key="${config.apiKey}", algorithm="hmac-sha256", headers="host date request-line", signature="${signature}"`
let authStr = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(authorizationOrigin))
return authStr
}
// 获取当前时间 RFC1123格式
let date = (new Date().toUTCString())
let wssUrl = config.hostUrl + "?authorization=" + getAuthStr(date) + "&date=" + date + "&host=" + config.host
let ws = new WebSocket(wssUrl)
common
: app_id,见账号控制台business
:业务参数,只有两个参数是必填的
aue=lame且sfl=1
)data
:需要合成的文本//连接建立完毕,读取数据识别 ws.on('open', ()=>{ log.info("websocket connect!") // send(text) //传输数据 let frame = { "common": { "app_id": config.appid }, // 填充business "business": { "aue": "lame", "auf": "audio/L16;rate=16000", "vcn": "xiaoyan", "tte": "UTF8", "sfl": 1 }, // 填充data "data": { "text": Buffer.from(text).toString('base64'), "status": 2 } } ws.send(JSON.stringify(frame)) })
ws.on('message', (data, err)=>{ if(err){ return; } let res_data = JSON.parse(data) if(!res_data || res_data.code!==0){ return; } audioBuf.push(res_data.data.audio) let audio = Buffer.from(res_data.data.audio, 'base64') fs.appendFile(filePath, audio, 'binary', err=>{ }) if (res_data.code == 0 && res_data.data.status == 2) { //状态为2才表示合成结束,需要合并 ws.close() } })
到这里就结束了,真的很简单但是为什么弄了这么久呢o(╥﹏╥)o
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。