uniapp对接科大讯飞实现语音合成

import CryptoJS from 'crypto-js'
import { fromByteArray } from 'base64-js'
import { Buffer } from 'buffer'

const config = {
				hostUrl: 'wss://tts-api.xfyun.cn/v2/tts',
				host: 'tts-api.xfyun.cn',
				appid: '',
				apiSecret: '',
				apiKey: '',
				uri: '/v2/tts'
			}
			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
			}


const readText = ()=>{
				
				
				if(!tip){
				    return
				}
				let date = (new Date().toUTCString())
				let wssUrl = config.hostUrl + "?authorization=" + getAuthStr(date) + "&date=" + date + "&host=" + config.host
				let ws = new WebSocket(wssUrl)
				
				console.log(ws)
				//连接建立完毕,读取数据识别
				let buff = []
				let nowAudio = 0;
				let innerAudioContext = uni.createInnerAudioContext();
				
				ws.addEventListener('open',()=>{
				    console.log("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(tip).toString('base64'),
				            "status": 2
				        }
				    }
				    ws.send(JSON.stringify(frame))
				
				    ws.addEventListener('message',(data,err)=>{
				        if(err){
				            return;
				        }
				
				        let res_data = JSON.parse(data.data)
				        // console.log(res_data.data)
				
				
				        // 解码音频数据
				        let audioData = res_data.data.audio;
				        buff.push(audioData)
				        if (res_data.code == 0 && res_data.data.status == 2) {
				            //状态为2才表示合成结束,需要合并           
				            ws.close()
				            playAudio(0); //开始播放音频
				        }
				    })
				})
				
				function playAudio(cur) {
				    if (cur >= buff.length) {
						innerAudioContext.stop()
				        return;
				    }
				    innerAudioContext.src = 'data:audio/mp3;base64,' + buff[cur];
				    innerAudioContext.onCanplay(()=>{
				        innerAudioContext.play()
				        innerAudioContext.onEnded(()=>{
				            playAudio(cur+1); //递归调用下一次播放
				        })
				    })
				}
				
			}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值