3分钟

任务 3 将合成语音上传至腾讯云COS

任务目的

在云函数中已经可以调用TTS接口,但TTS接口返回的是Base64加密的字符串,无法听到合成语音的效果,而且合成的语音需要有一个外网地址小程序才可以播放。所以需要将TTS返回的结果进行解密并上传至腾讯云COS。

任务步骤

1.创建腾讯云COS桶

在腾讯云官网搜索“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桶中,看到我们合成的语音文件,这也说明上传成功。

合成语音上传至COS桶中