You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:40:48