1+ /*
2+ * Copyright 2019 Google Inc.
3+ *
4+ * Licensed under the Apache License, Version 2.0 (the "License");
5+ * you may not use this file except in compliance with the License.
6+ * You may obtain a copy of the License at
7+ *
8+ * http://www.apache.org/licenses/LICENSE-2.0
9+ *
10+ * Unless required by applicable law or agreed to in writing, software
11+ * distributed under the License is distributed on an "AS IS" BASIS,
12+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+ * See the License for the specific language governing permissions and
14+ * limitations under the License.
15+ */
16+
17+ package com .example .texttospeech ;
18+
19+ // [START tts_ssml_address_imports]
20+ // Imports the Google Cloud client library
21+ import com .google .cloud .texttospeech .v1 .AudioConfig ;
22+ import com .google .cloud .texttospeech .v1 .AudioEncoding ;
23+ import com .google .cloud .texttospeech .v1 .SsmlVoiceGender ;
24+ import com .google .cloud .texttospeech .v1 .SynthesisInput ;
25+ import com .google .cloud .texttospeech .v1 .SynthesizeSpeechResponse ;
26+ import com .google .cloud .texttospeech .v1 .TextToSpeechClient ;
27+ import com .google .cloud .texttospeech .v1 .VoiceSelectionParams ;
28+ import com .google .common .html .HtmlEscapers ;
29+ import com .google .protobuf .ByteString ;
30+ import java .io .FileOutputStream ;
31+ import java .io .IOException ;
32+ import java .io .OutputStream ;
33+ import java .nio .file .Files ;
34+ import java .nio .file .Paths ;
35+ // [END tts_ssml_address_imports]
36+
37+
38+ /**
39+ * Google Cloud TextToSpeech API sample application.
40+ * Example usage: mvn package exec:java
41+ * -Dexec.mainClass='com.example.texttospeech.SsmlAddresses
42+ */
43+ public class SsmlAddresses {
44+
45+ // [START tts_ssml_address_audio]
46+ /**
47+ * Generates synthetic audio from a String of SSML text.
48+ *
49+ * Given a string of SSML text and an output file name, this function
50+ * calls the Text-to-Speech API. The API returns a synthetic audio
51+ * version of the text, formatted according to the SSML commands. This
52+ * function saves the synthetic audio to the designated output file.
53+ *
54+ * @param ssmlText: String of tagged SSML text
55+ * @param outfile: String name of file under which to save audio output
56+ * @throws Exception on errors while closing the client
57+ *
58+ */
59+ public static void ssmlToAudio (String ssmlText , String outFile )
60+ throws Exception {
61+ // Instantiates a client
62+ try (TextToSpeechClient textToSpeechClient = TextToSpeechClient .create ()) {
63+ // Set the ssml text input to synthesize
64+ SynthesisInput input = SynthesisInput .newBuilder ()
65+ .setSsml (ssmlText )
66+ .build ();
67+
68+ // Build the voice request, select the language code ("en-US") and
69+ // the ssml voice gender ("male")
70+ VoiceSelectionParams voice = VoiceSelectionParams .newBuilder ()
71+ .setLanguageCode ("en-US" )
72+ .setSsmlGender (SsmlVoiceGender .MALE )
73+ .build ();
74+
75+ // Select the audio file type
76+ AudioConfig audioConfig = AudioConfig .newBuilder ()
77+ .setAudioEncoding (AudioEncoding .MP3 )
78+ .build ();
79+
80+ // Perform the text-to-speech request on the text input with the selected voice parameters and
81+ // audio file type
82+ SynthesizeSpeechResponse response = textToSpeechClient .synthesizeSpeech (input , voice ,
83+ audioConfig );
84+
85+ // Get the audio contents from the response
86+ ByteString audioContents = response .getAudioContent ();
87+
88+ // Write the response to the output file
89+ try (OutputStream out = new FileOutputStream (outFile )) {
90+ out .write (audioContents .toByteArray ());
91+ System .out .println ("Audio content written to file " + outFile );
92+ }
93+ }
94+ }
95+ // [END tts_ssml_address_audio]
96+
97+ // [START tts_ssml_address_ssml]
98+ /**
99+ * Generates SSML text from plaintext.
100+ *
101+ * Given an input filename, this function converts the contents of the input text file
102+ * into a String of tagged SSML text. This function formats the SSML String so that,
103+ * when synthesized, the synthetic audio will pause for two seconds between each line
104+ * of the text file. This function also handles special text characters which might
105+ * interfere with SSML commands.
106+ *
107+ * @param inputfile: String name of plaintext file
108+ * @throws IOException on files that don't exist
109+ * @return a String of SSML text based on plaintext input.
110+ *
111+ */
112+ public static String textToSsml (String inputFile )
113+ throws Exception {
114+
115+ // Read lines of input file
116+ String rawLines = new String (Files .readAllBytes (Paths .get (inputFile )));
117+
118+ // Replace special characters with HTML Ampersand Character Codes
119+ // These codes prevent the API from confusing text with SSML tags
120+ // For example, '<' --> '<' and '&' --> '&'
121+ String escapedLines = HtmlEscapers .htmlEscaper ().escape (rawLines );
122+
123+ // Convert plaintext to SSML
124+ // Tag SSML so that there is a 2 second pause between each address
125+ String expandedNewline = escapedLines .replaceAll ("\\ n" ,"\n <break time='2s'/>" );
126+ String ssml = "<speak>" + expandedNewline + "</speak>" ;
127+
128+ // Return the concatenated String of SSML
129+ return ssml ;
130+ }
131+ // [START tts_ssml_address_ssml]
132+
133+ // [START tts_ssml_address_test]
134+ public static void main (String ... args ) throws Exception {
135+ // test example address file
136+ String inputFile = "resources/example.txt" ;
137+ String outFile = "resources/example.mp3" ;
138+
139+ String ssml = textToSsml (inputFile );
140+ ssmlToAudio (ssml , outFile );
141+ }
142+ // [END tts_ssml_address_test]
143+ }
0 commit comments