现在文本转语音的技术已经非常完善了,尽管网络上有许多免费的工具,还是测试了专业的服务,选择了百度的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.播放正常,音质还不错。