Node.js開發入門—語音合成樣本
出於項目需要,搞了一個語音合成(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', 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 - %s', url);var encodedUri = encodeURI(url);console.log('encodedUri - %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 -%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做一些小實驗、小工具還是比較方便,它內建了很多模組,比如http、crypto(加密),簡單好用。
需要注意的一點是OKVoice的API,在使用hmac產生signature時傳入的資料,是UTF8資料。文本長度(這裡是調用encodeURI之後query string裡text的長度)不能大於256。
另外我在測試時,輸入中文文本,選擇英文聲音,會失敗,也就是說,英文聲音只能讀取純英文……中英文混合的,就得選擇中文聲音。
與Node.js開發入門——使用http訪問外部世界不同,我們這次的處理,使用Readable流的pipe方法,把Readable留直接連到了Writable流上,簡單多了。
這個小樣本使用http模組時,我還處理了301、302等重新導向訊息,以便能下載到實際的內容。Node.js開發入門——使用http訪問外部世界則沒考慮這一點。