MOJwY~?!m|{~
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 {
- const messageDiv = buildMessageDiv(message);
+ messages.forEach(async (message) => {
+ const messageDiv = await buildMessageDiv(message);
messagesContainer.appendChild(messageDiv);
});
});
@@ -76,7 +76,7 @@ function fetchMessages() {
* @param {Message} message
* @return {Element}
*/
-function buildMessageDiv(message) {
+async function buildMessageDiv(message) {
const headerDiv = document.createElement('div');
headerDiv.classList.add('message-header');
headerDiv.appendChild(document.createTextNode(
@@ -92,11 +92,56 @@ function buildMessageDiv(message) {
messageDiv.classList.add('message-div');
messageDiv.appendChild(headerDiv);
messageDiv.appendChild(bodyDiv);
+ audio = await createAudioTag(message.text);
+ console.log(audio);
+ messageDiv.appendChild(audio);
return messageDiv;
}
-/** Fetches about me data from user's input and adds it to the page. */
+/**
+ * Creates audio tag.
+ */
+async function createAudioTag(messageText) {
+ // if (messageText === "") {
+ // console.log("empty messageText...")
+ // return;
+ // // Do nothing; consider showing a simple error to the user.
+ // }
+
+ // try {
+ // let resp = await fetch("/a11y/tts", {
+ // method: "POST",
+ // body: messageText,
+ // headers: {
+ // "Content-Type": "text/plain"
+ // },
+ // })
+
+ // // let audio = await resp.blob();
+
+ // var sound = document.createElement('audio');
+ // sound.controls = 'controls';
+ // sound.src = 'audio/output.mp3';
+ // sound.type = 'audio/mpeg';
+ // console.log("got sound...")
+ // return sound;
+
+ // } catch (err) {
+ // console.log("error...")
+ // throw new Error(`Unable to call the Text to Speech API: {err}`)
+ // }
+
+ var sound = document.createElement('audio');
+ sound.controls = 'controls';
+ sound.src = 'audio/output.mp3';
+ sound.type = 'audio/mpeg';
+ return sound;
+}
+
+/**
+ * Fetches about me data from user's input and adds it to the page.
+ */
function fetchAboutMe() {
const url = '/about?user=' + parameterUsername;
fetch(url)
@@ -132,4 +177,5 @@ function buildUI() {
fetchAboutMe();
const config = {removePlugins: [ 'ImageUpload' ]};
ClassicEditor.create(document.getElementById('message-input'), config );
+ createAudioTag();
}
From 64727c80254cb7ac865deece27833403d83774bc Mon Sep 17 00:00:00 2001
From: minhphu2020 <741redwood@gmail.com>
Date: Sun, 31 Mar 2019 23:08:09 -0700
Subject: [PATCH 2/4] Add audio default code
---
.../google/codeu/data/QuickstartSample.java | 57 +++++++++++++++++++
.../codeu/servlets/QuickstartServlet.java | 34 +++++++++++
2 files changed, 91 insertions(+)
create mode 100644 src/main/java/com/google/codeu/data/QuickstartSample.java
create mode 100644 src/main/java/com/google/codeu/servlets/QuickstartServlet.java
diff --git a/src/main/java/com/google/codeu/data/QuickstartSample.java b/src/main/java/com/google/codeu/data/QuickstartSample.java
new file mode 100644
index 0000000..166374e
--- /dev/null
+++ b/src/main/java/com/google/codeu/data/QuickstartSample.java
@@ -0,0 +1,57 @@
+package com.google.codeu.data;
+
+// Imports the Google Cloud client library
+import com.google.cloud.texttospeech.v1.AudioConfig;
+import com.google.cloud.texttospeech.v1.AudioEncoding;
+import com.google.cloud.texttospeech.v1.SsmlVoiceGender;
+import com.google.cloud.texttospeech.v1.SynthesisInput;
+import com.google.cloud.texttospeech.v1.SynthesizeSpeechResponse;
+import com.google.cloud.texttospeech.v1.TextToSpeechClient;
+import com.google.cloud.texttospeech.v1.VoiceSelectionParams;
+import com.google.protobuf.ByteString;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.lang.Exception;
+
+public class QuickstartSample {
+
+ /**
+ * Demonstrates using the Text-to-Speech API.
+ */
+ public static void main(String... args) throws Exception {
+ // Instantiates a client
+ try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
+ // Set the text input to be synthesized
+ SynthesisInput input = SynthesisInput.newBuilder()
+ .setText("Hello this is really nice haha.")
+ .build();
+
+ // Build the voice request, select the language code ("en-US") and the ssml voice gender
+ // ("neutral")
+ VoiceSelectionParams voice = VoiceSelectionParams.newBuilder()
+ .setLanguageCode("en-US")
+ // Try experimenting with the different voices
+ .setSsmlGender(SsmlVoiceGender.NEUTRAL) // Try experimenting with t
+ .build();
+
+ // Select the type of audio file you want returned
+ AudioConfig audioConfig = AudioConfig.newBuilder()
+ .setAudioEncoding(AudioEncoding.MP3)
+ .build();
+
+ // Perform the text-to-speech request on the text input with the selected voice parameters and
+ // audio file type
+ SynthesizeSpeechResponse response = textToSpeechClient.synthesizeSpeech(input, voice,
+ audioConfig);
+
+ // Get the audio contents from the response
+ ByteString audioContents = response.getAudioContent();
+
+ // Write the response to the output file.
+ try (OutputStream out = new FileOutputStream("/Users/minhphu/Desktop/GoogleCode/codeu-starter-project/output.mp3")) {
+ out.write(audioContents.toByteArray());
+ System.out.println("Audio content written to file \"/Users/minhphu/Desktop/GoogleCode/codeu-starter-project/output.mp3\"");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/google/codeu/servlets/QuickstartServlet.java b/src/main/java/com/google/codeu/servlets/QuickstartServlet.java
new file mode 100644
index 0000000..f64f1ec
--- /dev/null
+++ b/src/main/java/com/google/codeu/servlets/QuickstartServlet.java
@@ -0,0 +1,34 @@
+package com.google.codeu.servlets;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.google.codeu.data.QuickstartSample;
+
+/**
+ * Runs QuickstartSample class to demonstrate the text-to-speech API
+ */
+@WebServlet("/quickstart")
+public class QuickstartServlet extends HttpServlet {
+
+ private QuickstartSample quickstartSample;
+
+ @Override
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ try {
+ quickstartSample = new QuickstartSample();
+ quickstartSample.main();
+ } catch (Exception e) {
+ System.out.println("An exception was thrown.");
+ }
+ response.setContentType("application/json");
+
+ response.getWriter().println("Have printed the file");
+ }
+
+}
\ No newline at end of file
From e456582e9ffc3391e5d5cb9ed4363fb125db193d Mon Sep 17 00:00:00 2001
From: minhphu2020 <741redwood@gmail.com>
Date: Mon, 1 Apr 2019 22:55:17 -0700
Subject: [PATCH 3/4] exploring with audio
---
output.mp3 | Bin 0 -> 5856 bytes
.../codeu/servlets/MessageServlet2.java | 131 ++++++++++++++++++
src/main/webapp/js/user-page-loader.js | 37 ++++-
src/main/webapp/user-page.html | 1 +
4 files changed, 164 insertions(+), 5 deletions(-)
create mode 100644 output.mp3
create mode 100644 src/main/java/com/google/codeu/servlets/MessageServlet2.java
diff --git a/output.mp3 b/output.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..0084bddb4ee525f8c05b86c65116860ec67432b2
GIT binary patch
literal 5856
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
literal 0
HcmV?d00001
diff --git a/src/main/java/com/google/codeu/servlets/MessageServlet2.java b/src/main/java/com/google/codeu/servlets/MessageServlet2.java
new file mode 100644
index 0000000..adf9d7a
--- /dev/null
+++ b/src/main/java/com/google/codeu/servlets/MessageServlet2.java
@@ -0,0 +1,131 @@
+package com.google.codeu.servlets;
+
+import com.google.appengine.api.users.UserService;
+import com.google.appengine.api.users.UserServiceFactory;
+import com.google.cloud.language.v1.Document;
+import com.google.cloud.language.v1.Document.Type;
+import com.google.cloud.language.v1.LanguageServiceClient;
+import com.google.cloud.language.v1.Sentiment;
+import com.google.codeu.data.Datastore;
+import com.google.codeu.data.Message;
+import com.google.gson.Gson;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jsoup.Jsoup;
+import org.jsoup.safety.Whitelist;
+// Imports the Google Cloud client library
+import com.google.cloud.texttospeech.v1.AudioConfig;
+import com.google.cloud.texttospeech.v1.AudioEncoding;
+import com.google.cloud.texttospeech.v1.SsmlVoiceGender;
+import com.google.cloud.texttospeech.v1.SynthesisInput;
+import com.google.cloud.texttospeech.v1.SynthesizeSpeechResponse;
+import com.google.cloud.texttospeech.v1.TextToSpeechClient;
+import com.google.cloud.texttospeech.v1.VoiceSelectionParams;
+import com.google.protobuf.ByteString;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.stream.Collectors;
+
+/** Handles fetching and saving {@link Message} instances. */
+@WebServlet("/a11y/tts")
+public class MessageServlet2 extends HttpServlet {
+
+ // private TextToSpeechClient textToSpeechClient;
+
+ // @Override
+ // public void init() {
+ // ttsClient = TextToSpeechClient.create();
+ // }
+
+ // try {
+ // quickstartSample = new QuickstartSample();
+ // quickstartSample.main();
+ // } catch (Exception e) {
+ // System.out.println("An exception was thrown.");
+ // }
+
+ /** Responses with a bytestream from the Google Cloud
+ /* Text-to-Speech API
+ **/
+ @Override
+ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+ UserService userService = UserServiceFactory.getUserService();
+ if (!userService.isUserLoggedIn()) {
+ response.sendRedirect("/index.html");
+ return;
+ }
+ // To get clean messsages, removed dangerous things, html
+ String userMessage = Jsoup.clean(request.getReader().lines().collect(Collectors.joining(System.lineSeparator())), Whitelist.none());
+
+ // // m: do the api translation, with input set to userMessage
+ try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
+ // Set the text input to be synthesized
+ SynthesisInput input = SynthesisInput.newBuilder()
+ .setText(userMessage)
+ .build();
+
+ // Build the voice request, select the language code ("en-US") and the ssml voice gender
+ // ("neutral")
+ VoiceSelectionParams voice = VoiceSelectionParams.newBuilder()
+ .setLanguageCode("en-US")
+ // Try experimenting with the different voices
+ .setSsmlGender(SsmlVoiceGender.NEUTRAL) // Try experimenting with t
+ .build();
+
+ // Select the type of audio file you want returned
+ AudioConfig audioConfig = AudioConfig.newBuilder()
+ .setAudioEncoding(AudioEncoding.MP3)
+ .build();
+
+ // Perform the text-to-speech request on the text input with the selected voice parameters and
+ // audio file type
+ SynthesizeSpeechResponse apiResponse = textToSpeechClient.synthesizeSpeech(input, voice,
+ audioConfig);
+
+ // Get the audio contents from the response
+ ByteString audioContents = apiResponse.getAudioContent();
+
+ response.setContentType("audio/mpeg");
+
+ // How to send the response back?
+
+ // Write the response to the output file.
+ try (
+ ServletOutputStream output = response.getOutputStream();
+ InputStream input_ = getServletContext().getResourceAsStream(audioContents.toString()); // Placeholder!
+ ){
+ byte[] buffer = new byte[2048];
+ int bytesRead;
+ while ((bytesRead = input_.read(buffer)) != -1) {
+ output.write(buffer, 0, bytesRead);
+ }
+ }
+ }
+
+ //
+ // response.getOutputStream().println(userMessage);
+// response.setContentType("text/html");
+// response.getWriter().println("done!");
+
+
+ // This basically read audioContents as a stream...
+ // since you do not know how long the stream is, you just keep reading till you are done
+ // try (
+ // ServletOutputStream output = response.getOutputStream();
+ // InputStream input = getServletContext().getResourceAsStream(audioContents); // Placeholder!
+ // ) {
+ // byte[] buffer = new byte[2048];
+ // int bytesRead;
+ // while ((bytesRead = input.read(buffer)) != -1) {
+ // output.write(buffer, 0, bytesRead);
+ // }
+ // }
+ }
+}
\ No newline at end of file
diff --git a/src/main/webapp/js/user-page-loader.js b/src/main/webapp/js/user-page-loader.js
index 3c7ee43..0507ff3 100644
--- a/src/main/webapp/js/user-page-loader.js
+++ b/src/main/webapp/js/user-page-loader.js
@@ -92,10 +92,8 @@ async function buildMessageDiv(message) {
messageDiv.classList.add('message-div');
messageDiv.appendChild(headerDiv);
messageDiv.appendChild(bodyDiv);
- audio = await createAudioTag(message.text);
- console.log(audio);
- messageDiv.appendChild(audio);
-
+// audio = await createAudioTag(message.text);
+// messageDiv.appendChild(audio);
return messageDiv;
}
@@ -169,6 +167,35 @@ function convertInput(input) {
return html
}
+async function sendAMessage(){
+ try {
+ let resp = await fetch("/a11y/tts", {
+ method: "POST",
+ body: "Hello you are pretty!",
+ headers: {
+ "Content-Type": "text/plain"
+ },
+ })
+
+ let audio = await resp.blob();
+
+ var objectURL = URL.createObjectURL(audio);
+ var sound = document.createElement('audio');
+ sound.controls = 'controls';
+ sound.src = objectURL;
+ sound.type = 'audio/mpeg';
+
+ const messagesContainer = document.getElementById('audio-source');
+
+ messagesContainer.appendChild(sound);
+
+
+ } catch (err) {
+ console.log("error...")
+ throw new Error(`Unable to call the Text to Speech API: {err}`)
+ }
+}
+
/** Fetches data and populates the UI of the page. */
function buildUI() {
setPageTitle();
@@ -177,5 +204,5 @@ function buildUI() {
fetchAboutMe();
const config = {removePlugins: [ 'ImageUpload' ]};
ClassicEditor.create(document.getElementById('message-input'), config );
- createAudioTag();
+ sendAMessage();
}
diff --git a/src/main/webapp/user-page.html b/src/main/webapp/user-page.html
index 31f7542..822c4cd 100644
--- a/src/main/webapp/user-page.html
+++ b/src/main/webapp/user-page.html
@@ -60,6 +60,7 @@ User Page
Loading...
+ Loading audio...