forked from GoogleCloudPlatform/nodejs-docs-samples
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ssmlAddresses.js
129 lines (118 loc) · 4.36 KB
/
ssmlAddresses.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Copyright 2019 Google LLC
//
// 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';
async function main(
inFile = 'resources/example.txt',
outFile = 'resources/example.mp3'
) {
// [START tts_ssml_address_test]
/**
* TODO (developer): Uncomment these variables before running the sample
*
*/
// inFile = 'resources/example.txt',
// outFile = 'resources/example.mp3'
// [START tts_ssml_address_imports]
// Imports the Google Cloud client library
const textToSpeech = require('@google-cloud/text-to-speech');
// Import other required libraries
const fs = require('fs');
//const escape = require('escape-html');
const util = require('util');
// [END tts_ssml_address_imports]
// [START tts_ssml_address_audio]
/**
* Generates synthetic audio from a String of SSML text.
*
* Given a string of SSML text and an output file name, this function
* calls the Text-to-Speech API. The API returns a synthetic audio
* version of the text, formatted according to the SSML commands. This
* function saves the synthetic audio to the designated output file.
*
* ARGS
* ssmlText: String of tagged SSML text
* outfile: String name of file under which to save audio output
* RETURNS
* nothing
*
*/
async function ssmlToAudio(ssmlText, outFile) {
// Creates a client
const client = new textToSpeech.TextToSpeechClient();
// Constructs the request
const request = {
// Select the text to synthesize
input: {ssml: ssmlText},
// Select the language and SSML Voice Gender (optional)
voice: {languageCode: 'en-US', ssmlGender: 'MALE'},
// Select the type of audio encoding
audioConfig: {audioEncoding: 'MP3'},
};
// Performs the Text-to-Speech request
const [response] = await client.synthesizeSpeech(request);
// Write the binary audio content to a local file
const writeFile = util.promisify(fs.writeFile);
await writeFile(outFile, response.audioContent, 'binary');
console.log('Audio content written to file ' + outFile);
}
// [END tts_ssml_address_audio]
// [START tts_ssml_address_ssml]
/**
* Generates SSML text from plaintext.
*
* Given an input filename, this function converts the contents of the input text file
* into a String of tagged SSML text. This function formats the SSML String so that,
* when synthesized, the synthetic audio will pause for two seconds between each line
* of the text file. This function also handles special text characters which might
* interfere with SSML commands.
*
* ARGS
* inputfile: String name of plaintext file
* RETURNS
* a String of SSML text based on plaintext input
*
*/
function textToSsml(inputFile) {
let rawLines = '';
// Read input file
try {
rawLines = fs.readFileSync(inputFile, 'utf8');
} catch (e) {
console.log('Error:', e.stack);
return;
}
// Replace special characters with HTML Ampersand Character Codes
// These codes prevent the API from confusing text with SSML tags
// For example, '<' --> '<' and '&' --> '&'
let escapedLines = rawLines;
escapedLines = escapedLines.replace(/&/g, '&');
escapedLines = escapedLines.replace(/"/g, '"');
escapedLines = escapedLines.replace(/</g, '<');
escapedLines = escapedLines.replace(/>/g, '>');
// Convert plaintext to SSML
// Tag SSML so that there is a 2 second pause between each address
const expandedNewline = escapedLines.replace(/\n/g, '\n<break time="2s"/>');
const ssml = '<speak>' + expandedNewline + '</speak>';
// Return the concatenated String of SSML
return ssml;
}
// [END tts_ssml_address_ssml]
const ssml = textToSsml(inFile);
await ssmlToAudio(ssml, outFile);
// [END tts_ssml_address_test]
}
main(...process.argv.slice(2)).catch(err => {
console.error(err.stack);
process.exitCode = 1;
});