如何用Node.js调用IBM Watson语音合成在浏览器直接播放无需生成WAV文件
如何让IBM Watson文本转语音服务在Node.js中直接在浏览器播放语音,无需生成本地文件?
我正在构建一个使用IBM Watson文本转语音(Text to Speech)服务的Node.js应用。目前我的代码会生成一个.wav文件来保存语音,但我希望不需要生成本地文件,直接在浏览器中播放语音。
以下是我当前的代码:
var express=require("express"); var app = express(); var fs=require("fs"); var watson = require('watson-developer-cloud'); app.get("/",function(req,res){ var text_to_speech = watson.text_to_speech({ username: '6c1248f9-0de8-450c-8816-44a89c0e1cba', password: 'NSkOgtjNeE5w', version: 'v1' }); var params = { text: 'Turkish Prime Minister Binali Yildirim today reversed an earlier offer of compensation to Russia for shooting down one of Moscow military jets in November, media reported.', voice: 'en-US_AllisonVoice', accept: 'audio/wav' }; // Pipe the synthesized text to a file. text_to_speech.synthesize(params) .pipe(fs.createWriteStream('lorem_ipsum.wav')); }); app.listen(9000,function(err) { if (err) { console.log('Error',err); } else{ console.log('Connected'); } });
请问该如何修改代码实现这个需求?
解决方案
其实很简单,你只需要把Watson返回的音频流直接pipe到Express的响应对象(res),而不是写到本地文件里,同时要设置正确的响应头,让浏览器知道这是音频数据。
修改后的代码如下:
var express = require("express"); var app = express(); var watson = require('watson-developer-cloud'); app.get("/", function(req, res) { var text_to_speech = watson.text_to_speech({ username: '6c1248f9-0de8-450c-8816-44a89c0e1cba', password: 'NSkOgtjNeE5w', version: 'v1' }); var params = { text: 'Turkish Prime Minister Binali Yildirim today reversed an earlier offer of compensation to Russia for shooting down one of Moscow military jets in November, media reported.', voice: 'en-US_AllisonVoice', accept: 'audio/wav' }; // 设置响应头,告诉浏览器这是WAV音频 res.setHeader('Content-Type', 'audio/wav'); // 直接把Watson的音频流pipe到响应 text_to_speech.synthesize(params).pipe(res); }); app.listen(9000, function(err) { if (err) { console.log('Error', err); } else { console.log('Connected to port 9000'); } });
关键修改点:
- 移除了
fs模块的依赖(因为不需要写文件了) - 添加了
res.setHeader('Content-Type', 'audio/wav'),确保浏览器能正确识别音频类型 - 把原来的
pipe(fs.createWriteStream('lorem_ipsum.wav'))改成了pipe(res),直接将音频流发送给浏览器
这样当你访问http://localhost:9000时,浏览器会直接加载并播放生成的语音,完全不需要本地文件啦!
内容的提问来源于stack exchange,提问作者Fahad Sabzwari
相关产品推荐
相关产品推荐

