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