码迷,mamicode.com
首页 > Web开发 > 详细

Node.js开发入门—语音合成示例

时间:2015-09-28 07:42:30      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:node.js   语音合成   http   

出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice

我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/file.php

直接上代码吧,okVoiceTts.js,内容如下:

var http = require(‘http‘);
var fs  =require(‘fs‘);
var crypto = require(‘crypto‘);
var util = require(‘util‘);

var apiSecretKey = ‘1a3c1500ab253b636100c053e1ebea87‘;

var options = {
  apiKey: ‘2594280bed1522810d28a717f57c64db‘,
  expires: 0,
  format: ‘MP3‘,
  speed: 1,
  text: ‘张三丰是武当派的开山祖师,知名的弟子有宋远桥等。‘,
  voice: ‘cnfemale‘
};

var curDate = new Date();
options.expires = Date.UTC(curDate.getFullYear(), curDate.getMonth(), curDate.getDate(), curDate.getHours(), curDate.getMinutes(), curDate.getSeconds())/1000 + 100;

var query = util.format(‘apiKey=%s&expires=%d&format=%s&speed=%d&text=%s&voice=%s‘, options.apiKey, options.expires, options.format, options.speed, options.text, options.voice);

console.log(‘query - %s\n‘, query);

var hmac = crypto.createHmac(‘sha1‘, apiSecretKey);
var data = new Buffer(query, ‘utf8‘);
hmac.update(data);
var signatureResult = hmac.digest(‘hex‘);

console.log(‘signatureResult - %s‘, signatureResult);

var url = "http://api.okvoice.com/tts?" + query + "&signature=" + signatureResult;
console.log(‘url - \n%s‘, url);
var encodedUri = encodeURI(url);
console.log(‘encodedUri - \n%s‘, encodedUri);
var req = http.get(encodedUri);

function handleError(e){
  console.log(e);
}

function handleResponse(res){
  console.log(‘statusCode - ‘, res.statusCode);
  console.log(‘contentLength - ‘, res.headers[‘content-length‘]);

  if(res.statusCode == 200){
    var savedAudio = fs.createWriteStream(‘okVoice_en_cn.mp3‘);
    savedAudio.on(‘finish‘, function(){
      console.log(‘savedAudio finished.‘);
      process.exit(0);
    })
    res.pipe(savedAudio);
  }else if(res.statusCode == 301 || res.statusCode == 302){
    console.log(‘redirect to -\n%s‘, res.headers[‘location‘]);
    req = http.get(res.headers[‘location‘]);
    req.on(‘error‘, handleError);
    req.on(‘response‘, handleResponse);
  }else{
    console.log(‘statusCode - %d‘, res.statusCode);
    process.exit(1);
  }
}

req.on(‘error‘, handleError);
req.on(‘response‘, handleResponse);

用Node.js做一些小实验、小工具还是比较方便,它内置了很多模块,比如httpcrypto(加密),简单好用。

需要注意的一点是OKVoice的API,在使用hmac生成signature时传入的数据,是UTF8数据。文本长度(这里是调用encodeURI之后query string里text的长度)不能大于256。

另外我在测试时,输入中文文本,选择英文声音,会失败,也就是说,英文声音只能读取纯英文……中英文混合的,就得选择中文声音。

Node.js开发入门——使用http访问外部世界不同,我们这次的处理,使用Readable流的pipe方法,把Readable留直接连到了Writable流上,简单多了。

这个小示例使用http模块时,我还处理了301、302等重定向消息,以便能下载到实际的内容。Node.js开发入门——使用http访问外部世界则没考虑这一点。


其它文章:

版权声明:本文为foruok原创文章,未经博主允许不得转载。

Node.js开发入门—语音合成示例

标签:node.js   语音合成   http   

原文地址:http://blog.csdn.net/foruok/article/details/48780135

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!