Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.

Commit

Permalink
Samples: Synthesize Speech (text, ssml, string, local file)
Browse files Browse the repository at this point in the history
  • Loading branch information
Rebecca Taylor committed Mar 23, 2018
1 parent 880cb25 commit fbe2481
Show file tree
Hide file tree
Showing 5 changed files with 270 additions and 42 deletions.
7 changes: 7 additions & 0 deletions samples/resources/hello.ssml
@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/10/synthesis
http://www.w3.org/TR/speech-synthesis/synthesis.xsd" xml:lang="en-US">
Hello there.
</speak>
1 change: 1 addition & 0 deletions samples/resources/hello.txt
@@ -0,0 +1 @@
Hello there.
42 changes: 0 additions & 42 deletions samples/system-test/synthesizeText.test.js

This file was deleted.

97 changes: 97 additions & 0 deletions samples/system-test/textToSpeech.test.js
@@ -0,0 +1,97 @@
/**
* Copyright 2018, Google, Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

const fs = require(`fs`);
const path = require(`path`);
const test = require(`ava`);
const tools = require(`@google-cloud/nodejs-repo-tools`);

const cmd = `node textToSpeech.js`;
const cwd = path.join(__dirname, `..`);
const text = `Hello there.`;
const ssml = `<?xml version="1.0"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/10/synthesis
http://www.w3.org/TR/speech-synthesis/synthesis.xsd" xml:lang="en-US">
Hello there.
</speak>`;
const outputFile = `test-output.mp3`;
const files = [
`hello.txt`,
`hello.ssml`,
].map(name => {
return {
name,
localPath: path.resolve(path.join(__dirname, `../resources/${name}`)),
};
});

test.before(tools.checkCredentials);

test.after.always(async () => {
await fs.unlink(outputFile);
});

test(`should list voice`, async t => {
const output = await tools.runAsync(
`${cmd} list-voices`,
cwd
);
t.true(output.includes(`SSML Gender: FEMALE`));
t.true(output.includes(`Natural Sample Rate Hertz: 24000`));
});

test(`should synthesize audio from text`, async t => {
t.false(fs.existsSync(outputFile));
const output = await tools.runAsync(
`${cmd} synthesize-text '${text}' --outputFile '${outputFile}'`,
cwd
);
t.true(output.includes(`Saved synthesized text to local audio file ${outputFile}`));
t.true(fs.existsSync(outputFile));
});

test(`should synthesize audio from ssml`, async t => {
t.false(fs.existsSync(outputFile));
const output = await tools.runAsync(
`${cmd} synthesize-ssml '${ssml}' --outputFile '${outputFile}'`,
cwd
);
t.true(output.includes(`Saved synthesized text to local audio file ${outputFile}`));
t.true(fs.existsSync(outputFile));
});

test(`should synthesize audio from text file`, async t => {
t.false(fs.existsSync(outputFile));
const output = await tools.runAsync(
`${cmd} synthesize-text-file '${files[0].localPath}' --outputFile '${outputFile}'`,
cwd
);
t.true(output.includes(`Saved synthesized text to local audio file ${outputFile}`));
t.true(fs.existsSync(outputFile));
});

test(`should synthesize audio from ssml file`, async t => {
t.false(fs.existsSync(outputFile));
const output = await tools.runAsync(
`${cmd} synthesize-ssml-file '${files[1].localPath}' --outputFile '${outputFile}'`,
cwd
);
t.true(output.includes(`Saved synthesized text to local audio file ${outputFile}`));
t.true(fs.existsSync(outputFile));
});
165 changes: 165 additions & 0 deletions samples/textToSpeech.js
Expand Up @@ -42,6 +42,134 @@ function listVoices() {
// [END tts_list_voices]
}

function synthesizeText(text, outputFile) {
// [START tts_synthesize_text]
const textToSpeech = require('@google-cloud/text-to-speech');
const fs = require('fs');

var client = new textToSpeech.TextToSpeechClient();

/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const text = 'Text to synthesize, eg. hello';
// const outputFile = 'Local path to save audio file to, e.g. output.mp3';

var request = {
input: { text: text },
voice: { languageCode: 'en-US', ssmlGender: 'FEMALE' },
audioConfig: { audioEncoding: 'MP3' }
};

client.synthesizeSpeech(request)
.then(results => {
const audioContent = results[0].audioContent;

fs.writeFileSync(outputFile, audioContent, 'binary');
console.log(`Saved synthesized text to local audio file ${outputFile}`);
})
.catch(err => {
console.error('ERROR:', err);
});
// [END tts_synthesize_text]
}

function synthesizeSsml(ssml, outputFile) {
// [START tts_synthesize_ssml]
const textToSpeech = require('@google-cloud/text-to-speech');
const fs = require('fs');

var client = new textToSpeech.TextToSpeechClient();

/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const ssml = 'SSML to synthesize, eg. <?xml version="1.0"?><speak...';
// const outputFile = 'Local path to save audio file to, e.g. output.mp3';

var request = {
input: { ssml: ssml },
voice: { languageCode: 'en-US', ssmlGender: 'FEMALE' },
audioConfig: { audioEncoding: 'MP3' }
};

client.synthesizeSpeech(request)
.then(results => {
const audioContent = results[0].audioContent;

fs.writeFileSync(outputFile, audioContent, 'binary');
console.log(`Saved synthesized text to local audio file ${outputFile}`);
})
.catch(err => {
console.error('ERROR:', err);
});
// [END tts_synthesize_ssml]
}

function synthesizeTextFile(textFile, outputFile) {
// [START tts_synthesize_text_file]
const textToSpeech = require('@google-cloud/text-to-speech');
const fs = require('fs');

var client = new textToSpeech.TextToSpeechClient();

/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const textFile = 'Local path to text file, eg. input.txt';
// const outputFile = 'Local path to save audio file to, e.g. output.mp3';

var request = {
input: { text: fs.readFileSync(textFile) },
voice: { languageCode: 'en-US', ssmlGender: 'FEMALE' },
audioConfig: { audioEncoding: 'MP3' }
};

client.synthesizeSpeech(request)
.then(results => {
const audioContent = results[0].audioContent;

fs.writeFileSync(outputFile, audioContent, 'binary');
console.log(`Saved synthesized text to local audio file ${outputFile}`);
})
.catch(err => {
console.error('ERROR:', err);
});
// [END tts_synthesize_text_file]
}

function synthesizeSsmlFile(ssmlFile, outputFile) {
// [START tts_synthesize_ssml_file]
const textToSpeech = require('@google-cloud/text-to-speech');
const fs = require('fs');

var client = new textToSpeech.TextToSpeechClient();

/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const ssmlFile = 'Local path to SSML file, eg. input.ssml';
// const outputFile = 'Local path to save audio file to, e.g. output.mp3';

var request = {
input: { ssml: fs.readFileSync(ssmlFile) },
voice: { languageCode: 'en-US', ssmlGender: 'FEMALE' },
audioConfig: { audioEncoding: 'MP3' }
};

client.synthesizeSpeech(request)
.then(results => {
const audioContent = results[0].audioContent;

fs.writeFileSync(outputFile, audioContent, 'binary');
console.log(`Saved synthesized text to local audio file ${outputFile}`);
})
.catch(err => {
console.error('ERROR:', err);
});
// [END tts_synthesize_ssml_file]
}

require(`yargs`) // eslint-disable-line
.demand(1)
.command(
Expand All @@ -50,7 +178,44 @@ require(`yargs`) // eslint-disable-line
{},
opts => listVoices()
)
.command(
`synthesize-text <text>`,
`Synthesizes audio file from text`,
{},
opts => synthesizeText(opts.text, opts.outputFile)
)
.command(
`synthesize-ssml <ssml>`,
`Synthesizes audio file from SSML`,
{},
opts => synthesizeSsml(opts.ssml, opts.outputFile)
)
.command(
`synthesize-text-file <textFile>`,
`Synthesizes audio file from text in a file`,
{},
opts => synthesizeTextFile(opts.textFile, opts.outputFile)
)
.command(
`synthesize-ssml-file <ssmlFile>`,
`Synthesizes audio file from SSML in a file`,
{},
opts => synthesizeSsmlFile(opts.ssmlFile, opts.outputFile)
)
.options({
outputFile: {
alias: 'o',
default: 'output.mp3',
global: true,
requiresArg: true,
type: 'string'
}
})
.example(`node $0 list-voices`)
.example(`node $0 synthesize-text "hello" -o hello.mp3`)
.example(`node $0 synthesize-ssml "<?xml..." -o hello.mp3`)
.example(`node $0 synthesize-text-file filename.txt -o output.mp3`)
.example(`node $0 synthesize-ssml-file filename.ssml -o output.mp3`)
.wrap(120)
.recommendCommands()
.epilogue(`For more information, see https://cloud.google.com/text-to-speech/docs`)
Expand Down

0 comments on commit fbe2481

Please sign in to comment.