NodeJS 百度智能云文本转语音(实测)

时间:2024-11-16 13:50:32

        现在文本转语音的技术已经非常完善了,尽管网络上有许多免费的工具,还是测试了专业的服务,选择了百度的TTS服务。

        于是,在百度智能云注册和开通了文本转语音的服务,尝试使用NodeJS 实现文本转语音服务。但是百度的文档实在有点难以琢磨,网上也鲜有实例。本博文分享自己的代码。

百度智能云提供下面几种语音服务:

语音识别

语音合成

        短文本在线合成

        长文本在线合成

呼叫中心语音

我开通了长文本在线合成

百度语音合成分为三步

  •  建立一个任务
  • 查询任务是否完成
  • 下载MP3 文件

基于nodeJS 程序实现,分为两个程序

  •     提交任务程序
  •    检测任务是否完成,如果完成就下载到本地

代码 (提交任务)

const axios = require('axios');
const AK = "ZEnhIO3z******xX7v67k63"
const SK = "RtwuuVgPP******815aDIicddfnfW0"

async function main() {
    var options = {
        'method': 'POST',
        'url': 'https://aip.baidubce.com/rpc/2.0/tts/v1/create?access_token=' + await getAccessToken(),
        'headers': {
                'Content-Type': 'application/json',
                'Accept': 'application/json'
        },
        data: JSON.stringify({
                "format": "mp3-16k",
                "text":"传统广播电台是由电台的总编和记者为听众安排节目内容,互联网技术推动了按需播放的方式。按需播放的本质是由听众自己决定收听的内容。",
                "voice": 0,
                "lang": "zh",
                "speed": 5,
                "pitch": 5,
                "volume": 5,
                "enable_subtitle": 0
        })

    };

    axios(options)
        .then(response => {
            console.log(response.data);
        })
        .catch(error => {
            throw new Error(error);
        })
}
 
/**
 * 使用 AK,SK 生成鉴权签名(Access Token)
 * @return string 鉴权签名信息(Access Token)
 */
function getAccessToken() {

    let options = {
        'method': 'POST',
        'url': 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + AK + '&client_secret=' + SK,
    }
    return new Promise((resolve, reject) => {
      axios(options)
          .then(res => {
              resolve(res.data.access_token)
          })
          .catch(error => {
              reject(error)
          })
    })
}
 main();

代码结束后,返回

{
  log_id: 17316727496409212,
  task_status: 'Created',
  task_id: '67373aadfeff4300017cf079'
}

提取 task_id 填写到下面的程序中(task_ids) 。

注:voice 是音库

      精品音库:度逍遥(精品)=5003,度小鹿=5118,度博文=106,度小童=110,度小萌=111,度米朵=103,度小娇=5。默认为度小美

代码(检查任务是否完成并下载)

const axios = require('axios');
const fs = require('fs');
const AK = "ZEnhIO3z******X7v67k63"
const SK = "RtwuuVgP*******BVg815aDIicddfnfW0"
 
async function main() {
    var options = {
        'method': 'POST',
        'url': 'https://aip.baidubce.com/rpc/2.0/tts/v1/query?access_token=' + await getAccessToken(),
        'headers': {
                'Content-Type': 'application/json',
                'Accept': 'application/json'
        },
        "data": JSON.stringify({
            "task_ids": ['67371bf01305c600016c8451' ]
        })
    };

    axios(options)
        .then(response => {
            speech_url=response.data.tasks_info[0].task_result.speech_url;
            console.log(speech_url)
            downLoad(speech_url,"./audio.mp3")
        })
        .catch(error => {
            throw new Error(error);
        })
}
function downLoad(fileUrl,outputLocationPath){
    const writer = fs.createWriteStream(outputLocationPath);

    return axios({
      method: 'get',
      url: fileUrl,
      responseType: 'stream',
    }).then(response => {
  
     
  
      return new Promise((resolve, reject) => {
        response.data.pipe(writer);
        let error = null;
        writer.on('error', err => {
          error = err;
          writer.close();
          reject(err);
        });
        writer.on('close', () => {
          if (!error) {
            resolve(true);
          }
     
        });
      });
    });
}
/**
 * 使用 AK,SK 生成鉴权签名(Access Token)
 * @return string 鉴权签名信息(Access Token)
 */
function getAccessToken() {

    let options = {
        'method': 'POST',
        'url': 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + AK + '&client_secret=' + SK,
    }
    return new Promise((resolve, reject) => {
      axios(options)
          .then(res => {
              resolve(res.data.access_token)
          })
          .catch(error => {
              reject(error)
          })
    })
}
main();

在文档中看见了 audio.mp3.播放正常,音质还不错。