任务 3 将合成语音上传至腾讯云COS
任务目的
在云函数中已经可以调用TTS接口,但TTS接口返回的是Base64加密的字符串,无法听到合成语音的效果,而且合成的语音需要有一个外网地址小程序才可以播放。所以需要将TTS返回的结果进行解密并上传至腾讯云COS。
任务步骤
1.创建腾讯云COS桶
在腾讯云官网搜索“COS”,搜索出来对象存储,点击【立刻使用】
在对象存储控制台点击【存储桶列表】,点击【创建存储桶】。
在弹出的创建选项中进行设置,图中存储桶名称为“upload-record-1257864487”,所属地域为广州,访问权限注意设为“公有读私有写”,点击确定即可。
2.改写 invokeTTS 云函数
首先改写 package.json 中的内容
{
"name": "invokeTTS",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"wx-server-sdk": "latest",
"tencentcloud-sdk-nodejs": "latest",
"cos-nodejs-sdk-v5": "latest",
"moment":"latest"
}
}
这里在 dependencies 下添加了两个依赖:cos-nodejs-sdk-v5 和 moment 。其中 cos-nodejs-sdk-v5 是上传至COS中必须的依赖;moment依赖是为了将录音名字改为上传时间需要用到的,如果不需要,可以不添加 moment 依赖。
接着将 index.js 进行改写
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
//引入腾讯云sdk的依赖
const tencentcloud = require("tencentcloud-sdk-nodejs");
//设置成自己的secretId,secreteKey
const secretId = "yourSecretId" # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
const secretKey = "yourSecretKey" # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
//添加上传至COS桶的名称和地域
const bucketName = "upload-record-1257864487"
const bucketRegion ="ap-guangzhou"
//调用TTS接口
function invokeTTS(transObj) {
const TtsClient = tencentcloud.tts.v20190823.Client;
const models = tencentcloud.tts.v20190823.Models;
const Credential = tencentcloud.common.Credential;
const ClientProfile = tencentcloud.common.ClientProfile;
const HttpProfile = tencentcloud.common.HttpProfile;
let cred = new Credential(secretId, secretKey); # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
# 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
let httpProfile = new HttpProfile();
httpProfile.endpoint = "tts.tencentcloudapi.com";
let clientProfile = new ClientProfile();
clientProfile.httpProfile = httpProfile;
let client = new TtsClient(cred, "ap-guangzhou", clientProfile);
let req = new models.TextToVoiceRequest();
let params = `{"Text":"${transObj.content}","SessionId":"session-1","ModelType":1,"VoiceType":"${transObj.voiceType}","Codec":"mp3"}`
req.from_json_string(params);
return new Promise((resolve, reject) => {
client.TextToVoice(req, function (errMsg, response) {
if (errMsg) {
console.log(errMsg);
reject(errMsg)
}
resolve(response)
})
}).then((res) => {
//调用上传至COS桶的函数
return uploadToCos(res.Audio)
})
}
//添加上传至COS桶函数
function uploadToCos(base64Str){
let buffer = Buffer.from(base64Str,'base64')
let COS = require("cos-nodejs-sdk-v5")
let cos = new COS({
SecretId: secretId, # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
SecretKey: secretKey, # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
});
let moment = require('moment')
let name = moment().utcOffset(8).format('YYYY-MM-DD HH:mm:ss') + ".mp3";
return new Promise((resolve, reject) => {
cos.putObject({
Bucket: bucketName,
Region: bucketRegion,
Key: name,
Body: buffer,
}, function (err, data) {
resolve(data)
})
}).then((res) => {
return "https://"+res.Location
})
}
// 云函数入口函数
exports.main = async (event, context) => {
return invokeTTS(event.transObj)
}
新的 index.js 添加了存储桶的信息。
//添加上传至COS桶的名称和地域
const bucketName = "upload-record-1257864487"
const bucketRegion ="ap-guangzhou"
新添加了 uploadToCos 函数。这个函数接受的参数为Base64编码的字符串,将字符串进行解码,将解码后的结果以当前时间重命名并上传至COS中,最后返回音频COS中的地址。
//添加上传至COS桶函数
function uploadToCos(base64Str){
//将Base64进行解码
let buffer = Buffer.from(base64Str,'base64')
//引入COS类
let COS = require("cos-nodejs-sdk-v5")
//创建cos对象
let cos = new COS({
SecretId: secretId, # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
SecretKey: secretKey, # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
});
//将名字设置为当前时间.mp3
let moment = require('moment')
let name = moment().utcOffset(8).format('YYYY-MM-DD HH:mm:ss') + ".mp3";
//返回异步调用结果
return new Promise((resolve, reject) => {
cos.putObject({
Bucket: bucketName,
Region: bucketRegion,
Key: name,
Body: buffer,
}, function (err, data) {
resolve(data)
})
}).then((res) => {
return "https://"+res.Location
})
}
3.重新测试云函数
重新上传云函数。云函数上传完成后,进入云开发控制台,选用已经建好的 testTTS 模板,对云函数进行云端测试。
测试后【调用状态】为成功,【返回结果】是一个cos地址
将得到的地址复制,粘贴到浏览器中可以得到合成的语音,则说明上传至COS成功。
同时,可以在COS桶中,看到我们合成的语音文件,这也说明上传成功。
学员评价