首页 > 解决方案 > Google Cloud Text-to-Speech 通过 Node.js API 读取输出数据文件并在媒体播放器中输出语音

问题描述

我正在尝试使用 Google texttospeech Wavenet 语音创建文本到语音的音频文件。

同时我希望设备扬声器输出语音。

换句话说,当生成 mp3 文件时,设备应该输出音频。我在 audioConfig 中尝试了各种 effectsProfileId 组合,但似乎没有任何效果

以下代码创建一个 mp3 文件。但是没有音频输出。一切正常,除了在生成 mp3 文件时设备扬声器没有声音。

const textToSpeech = require('@google-cloud/text-to-speech');
const fs = require('fs');
const util = require('util');

const client = new textToSpeech.TextToSpeechClient();

//Some text
const text1 = 'The rain in Spain stays mainly on the plain';

//define path to output mp3 file
const outputFile = './audiofiles/sample1.mp3';

//set environment variable
process.env.GOOGLE_APPLICATION_CREDENTIALS = "./key/runningzebra-7d04161f3149.json";


//define a voice
const voice1 = {
  languageCode:"en-US",
  ssmlGender:"MALE",
  name:"en-US-Wavenet-B"
}

//Define an audioConfig
//This should generate audio output on the device speakers
//But that is not working
const audioConfig1 = {
  effectsProfileId: ["headphone-class-device", "large-automotive-class-device", "telephony-class-application"],
  pitch: -10.0,
  speakingRate: 0.75,
  audioEncoding: "MP3"
}

const input1 = {
  text:text1
}

//Define a request
const request = {
  input:input1, voice:voice1, audioConfig:audioConfig1
}

async function getAudio(request, outputFile) {
    const [response] = await client.synthesizeSpeech(request);
    const writeFile = util.promisify(fs.writeFile);
    await writeFile(outputFile, response.audioContent, 'binary');
    console.log(`Audio content written to file: ${outputFile}`);
}



getAudio(request, outputFile);

有什么建议么

标签: node.jsaudiogoogle-cloud-platformtext-to-speech

解决方案


无法使用 Cloud Text-to-Speech API 进行实时转换。因为它提供了一个可播放的音频文件作为输出。但是,您可以在执行代码后下载转换后的音频文件后播放。我已经通过更改您的代码在 Linux 中测试了您的非实时要求,并且我能够读取和播放转换后的音频文件。在执行代码之前,请先安装以下软件包:

sudo apt-get install audacious
npm install play-sound

试试下面的代码:

const textToSpeech = require('@google-cloud/text-to-speech');
const fs = require('fs');
const util = require('util');

const client = new textToSpeech.TextToSpeechClient();

//Some text
const text1 = 'The rain in Spain stays mainly on the plain.';

//define path to output mp3 file
const outputFile = 'sample1.mp3';

//set environment variable
//process.env.GOOGLE_APPLICATION_CREDENTIALS = "./Composer/key.json";

//define a voice
const voice1 = {
 languageCode:"en-US",
 ssmlGender:"MALE",
 name:"en-US-Wavenet-B"
}

//Define an audioConfig
//This should generate audio output on the device speakers
//But that is not working
const audioConfig1 = {
 effectsProfileId: ["headphone-class-device", "large-automotive-class-device", "telephony-class-application"],
 pitch: -10.0,
 speakingRate: 0.75,
 audioEncoding: "MP3"
}

const input1 = {
 text:text1
}

//Define a request
const request = {
 input:input1, voice:voice1, audioConfig:audioConfig1
}

async function getAudio(request, outputFile) {
   const [response] = await client.synthesizeSpeech(request);
   const writeFile = util.promisify(fs.writeFile);
   await writeFile(outputFile, response.audioContent, 'binary');
   console.log(`Audio content written to file: ${outputFile}`);
}

getAudio(request, outputFile);


//play-sound is used for to play the audio file
//I have passed “audacious” as a player for play sound. You can also pass other media players into this. 
var player = require('play-sound')({player:"audacious"}) 

player.play(outputFile, function (err) {  
  if (err) throw err;
  console.log("Audio finished");
});


推荐阅读