From 76b6c5b5e9dace497e032473264d0fce6c4ecb9e Mon Sep 17 00:00:00 2001 From: minhphu2020 <741redwood@gmail.com> Date: Sun, 31 Mar 2019 23:04:49 -0700 Subject: [PATCH 1/4] Add audio tag --- pom.xml | 6 +++ src/main/webapp/audio/output.mp3 | Bin 0 -> 9600 bytes src/main/webapp/js/user-page-loader.js | 54 +++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 src/main/webapp/audio/output.mp3 diff --git a/pom.xml b/pom.xml index 322fd62..fce6e83 100644 --- a/pom.xml +++ b/pom.xml @@ -73,6 +73,12 @@ limitations under the License. 2.6.2 + + com.google.cloud + google-cloud-texttospeech + 0.80.0-beta + + diff --git a/src/main/webapp/audio/output.mp3 b/src/main/webapp/audio/output.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2c2994c10cbd7e352f90d0496efa7dac35f77ba0 GIT binary patch literal 9600 zcmeI&WmHseyD;!Qbi)iCA|)+7(gH&Wh;&Prz@J7yKqRC?!T|w6N|2Q9?vxG@DV3Hk z$^Fjwtn-}nemGywyUw@w{xEB1?U~

zX^SJ>aoI4*&p|%BTk*ws{JVX$1&n+yk3I z&`)VYDnc3`1TW}MBnPG%f!-#vbcTKKIu5+`1TXOV0kR>V=}^av3W zgY^EuZ-#L`((7M#vI7D;79DKOe-4S(-)Gkc>AT3@#>I;{p#bNMvy# z3bO76+GyXBg`8Uol9md9H|N)p)c78pV)&~gELc)+S;AaFuzh*p<9I~MfOeY6rERBs zavY@?BFy*Cq`O5Gkif#DqKiGdc?2un7E|_k+Ft0?_IWh?b@8$Aa{~{F84a}0Lx0Ja z02#CZ(yrS@UtwTiJTlmgr951{Qe|*mKW0ePJHMOZ5$O4_Rdlazy>Z^`)3*!B>P(sX ztg?*Ez-e2AH_OJ;k!5Co#v>9u20F))u2GRTb@1WEol}Ij<6mY3V+@tDa`V9d7`O#2Lu%| z3-CURQ~S*<3su;?eb!)s_VLJ#yeoj=Ate0czV7DQ2mD?_H_sPeo<)fUCw(;hd8WNc zPwS|=@kbE88^6YCcdOfGBNzn5z~kXwpSEspC`tK8Sgun8q!h7;-8NNJ?U#7;{i~F3 zLvQVC%5bz#OkwmY8yE>il7`B!E3mD;L#juZByf!2YGPJ&u=hH$=CqkAD&Vz$Ol&t- z0hhs(1i>zGRVzU~h6&kpniYX`LgQKR^2vJv`r3F!z0|H!5tbk+V{Zd4CX3;}`G@78 z{OM36TeY$~Hic0DG!tVb#Fng*Y?6o~X?)ryO9+(|u)VpMX2`%+foOHMP`EZm4P$iq z>>Y3qYmz^;&4ISI)~b}uuq8c#K9~;c4U4;=m2DIm;Q-pFf)#UT08c-+ z9{##j=j|vGEP*G5*-&Yx4cSVTeO@&(9XSQh&23c^p2>yBlpeB$nvH2Um*!$Hh7Npk ziI*c-BhoNLCZ$l>7NrLhJmTgJ8Atn!(D{&TU|0bufQzh2D~*^dN6D^USe{w>EGExr zha}Qy#42ddz^@8QvK?&o^=?}5Ie1l3sFk)VE0?1$zJ@v5E@Sbss+)P=J9{^bqYn&z zQnQDV??92cTeQywRq-xG|Gp^pw!AR-o`M8xR7|S^5XOY({s_FFh|aiq&OPj_nZiK3 z028aqq`xa2yW74w)Q?Ev?lT&oSVL+coZMJSQR8r;jC zSI9t5Uz)Q0z@^|E%=6;U1dfg)!oTG7{eJzJ@Xro-6+s8dK>G-ophpET@&+k$<|W9b zk+Z*-y{VZgt>I`w-Bi}DyaK_)n}-*0dW1~7+2X1gr}z6xYPq$X7HopUpLQC@6_q(L zu=Y0mTCGR1s2=X?7=SyJdtS-U{WbG%w$Z*C%+jm|=ovyjq#n9y)u$KaG&1%DZ^&bC zxWLomVZT`1qz@w$p^0c;4;JOp0CW!_S=v?FoWDjXPwSEO=cT3+c3RldoZ*BrFZy-w zz?VV4fOR`NpG6r31uvLIwv&x_*mM@ez!fApk^m? zRyVqpLB8_3eXwF)@A^Xp4_uxn8*g^#eS!yhh+%6dzU7+d&F@EBzaFqzqkVfAvp#Bm z=tJ^C2n8kOYB{K2HT#m1OIP1-Ryb} zb_veI0?w)18KU6q%?TSFseJOmRfM0(s(NQCZgB*iG1~W_2qq{5rbgUK@5$Hcu2iN+ zu~I(5n(|MPG&VG+lsKO5@T8=|xX(O0G_h2Db1I2=dJiVMuIX~{bV5vJ8I;glp1Nvv z9F@f;GSOWlNOi7Y5DK6vz+&idY7|8Kp47A?67>ydgLr7zHW-sn$VXbs&*FupRhKkml+!(j4y>{Ogvt1sZ z3J#puMG)LP6A*yvI41KRcMAw)lat6}5({8c=h?*I?bcirU6{K@v$W zqT_dk9=g~AKYNm+dI_Z}Zk)NXv0-obOu0aJcc)NuviKrPTuisuOg>v(9MVg{AF?*X zE(4c$r|_6X_)dqpuX;p9I3rCbgqpYHgJWLB2dw}Hhd;Or>qbLTqyV(<$B;Do0{Dj0 z$ZSaY6Gu1!!f0O26vixV-L!NLGq%H$ZW)Wmz+|PTBMU6-ZE=6&K09!DHE@}@Zdu)J zt@RBfSVQtPWS|0Mot%64Rm+Bc-lEhn!Hts*kP~o2`^L=Q9%cZ;A;%Rv=3HQB#W-mPo^&|fD8rBoXRc%t*?vmO7zKiF8O5msZ}LA!7vG9n zJ=?8gnV3?HoqUG&i7Dm$8i3)iNIPr`J>YH$n;hxZm->3Y0Qf7pN_xx8g-Vcu@*MmF0Jc(BA;EYi8B0f`C zZ;_BAw$&Z7>z%S7HfENutxkW(7d7;2AIh(AYb@K_>e;*h#`~vjb$zHHu_7m(6JHeq zvC{wCUbmDu$vU$nRMiKZW^xPOR?7l!yoM=%vE9(yFp~riQ-q=W{qWH1|6Js!b} zv*oSWP->V*$Ik-e{DxXzmfXf)lfO{vP8vBy z?xU7a#8qjm|NNIw$x2y<96hZ*9(C0lpVOjD?<}LHIR_WWzCRk3s@N?ySaxd&X4sP*Sun4#RJ10DKjY9N>*u z6D}~sq*Jy~?1(>eAQ!vqN!>Vm+6RIgUK;fod%r(0jo=kpRi!;+j^O=Clc0QZ2dU9M zXE_~8I2rV6xVt+%pM!(|@+RMr9Cwg=CW#I0%aaaHb^tH1kjv5A9`6ZhuF^q}U9z^k zUMcr?QFfk5tHH}5+C3-<&f5=C$D=@K4tt@&5qu!!hJ@!HF+S-Xr!A%uK3xbwMi9tNM5Zg+Sez$kZ1rp6x{r`T0f~o!ZX>5U;p@{PwRzPgYg%9 zE}kNO>1f}UtYPva&>8NgV%S4A;BlH0q92WIB6Wm35v`ybcxbCAs%*1`iv3Z~e3mh?<4!?*YUa(sFf{uBG^RCFf<{#Vlb+dfzR)%j-}I*k_2V+A25`~ zb6XOc8ATreKg$s25i1iim|>flVNCdFKZcyM2?@+Hss)AO%kDF542RpE%O%Vg?=|hc zW~%v>YkSe8Rv;HgMg4GM47@$)*4eB+KW*O2p)3ov?_gqKyG;tmjwTA~ro$6=EdQ8H z2exYUhh7-LO^o16Xg`tO$S)OG_=c?Reo^8cX+dx)r7Tw{IFeW7md__Erk&Vzkb+-{ z;Sp9#x&@J9&-E(V)~dEmu!Kguy599`WP zI7DGXEk=JT^lQok$rY< zkxLwl^*rHYfr4i|MhSDU81=9)cueuUxcf!Yv=(JiPF&BLiza7mE?fB_+J6ci^lku# zl#ndJf6R3aQVB&3;!j8@`jR9imY2V~-URNJ*B?KO?#4=31E3tOipp-6Egp@v=ir~b z$uXbb#TWkB;sSQg&6|>6rBV_)F~WGLhsik^~?71mFxoT_aI$qc!Q&zQ@m|&3zOxPn=?nrNO&f= z{L0f6uq&e4^-pd;fCB|$33<5PA(kB_dyGW$m`RG>?!dxb`o2%0TM4$;R-AkDE9H8U@-O+4Cv&*qSjO=YDj zC<7jPn}WAR_bw{?FflDtKiKnfsxZ&rzsD+`kR9b{(%d!_Q}-L~+rx4~Du51@--68< zOH|Q-4fJ$nS3ky3N+Jk1+O9UZd-vMu+ z1hDXF-j;^;{{F~rYJHu2<9OW=5VN=`b2OZd_T8YtA%#GvHc~3Xyee~ILi4K=$6Z)> z5EeO|dK?JeXl}?On{%EQxAk@8^=lKI(^$HfGFD+L*ap|q9Qw3r17)_-!k0SE?lrmp z2y6(#8U8VAE8W38}aNdg9T zxCef?tmodl;Qo$7rM;c1AZ8KwOs>d&3DNlM*^F!g918-R z0S9odoDA(pz_|P(fp62u%pfd4%Yg$5A{K+w(q2X2l6VRg;@>zoFv>?!Y~U@Gy{IrW zaRxlZtvPe+ag;^xyj^KJyM`z&S0`DQAirqXy~denN;XJ4YYbqWewkqA0&7G2iO?f(=)bwI57Ft*x>QI)VK$6`0;7rb#pH_ zsItz#z-4L0Rz}5?lh<*Ipg6+kcC!?u+FXWhr8~2Mag%3gKjY3s5^Ddzi2P+vnEt!1 zN_*nj$ik;9pQf?9YaWWJFXG(v6n|VcIDVO&%4{8J#vztG(!11w>`6g5;<%-|eqzzN zFDT}+zoDH|+)65%JJhRS;!3EkKKUN@_5$tukf*tH0Nsm`>m~3WT*<5eQ@2oj}jrChlY)hn)0drJh&}*Ji;?FJHBN73_ z_#(UB4ro6dHeuESbQ2-7;Dg^r7B(0S-5U6GyHegF+Ck%?qt1w8rNeNSJOvJhkcut< zRW2db84|T+N`8E~BU0{FmOi@p&J-58s+nZwI~CLJO@B1_B|bYYy|>UqEDP<&kvo{R z09{{^o655o@^1CwUM*kTfN6JSym#$I3P0*R z@cC}2oUTETLcM&JfRBfqkj2364;_$shr9GWSjZmHejU+*_LE?O?5Ojvp*wzIbI{0x zxrF>MOJwY~?!m|{~ zL6|i!@ZI6b7cYS}E?lmy$2E6b6HX(^?z1nvmwg2nMU8-FdA`czkZt{_~tWR^i1tkLA@S8kpuzd5c# z;z#$~*k{u})QdiN9@L6-Q4Uqmdigo;>8-}t@~he_fi%bn+V_V!pw?g6p5#GgB{d0O zZY|k^E+XP~L-tvKzI}gpO8fWo`-f|Ng-`ts2h8n6x!TBbI~bJ3%L>A>3EK%p(&HQb zUhdr#hzB~~*J0>@boF^_@l>(&F?Gss{LN1&47I!hU1~_#WV_g!9Z~-pv2T~#(-Xwq z`59hMN@ta$Y$li}!dCVXv#FtibWTZrm1G`fHxHL?k{L%X)86`oogZeQPWDYwdJK3x z)w;pE2q?Bt0G>r8-eYw9Z=e%asQwd*1oOG|7EcC=vBD<;9h%afAR09l@w+W!yTg`| zbKJ@8Sz2{ZXd1#`aSgN{;^9Wq8!n#y`z6y0G8gt*&mowR?(FXDTHWIoO>a_sc4ilH zG29x^ej3cdr4UsgMoMr!a^@b=)4t!@jK_a}AZWM6L07L@hixW)r8_-bfI_DAvH!X6 zWh)plbn3KhuuLNtOmf-v z9|6)7iv9j_P*3G+q+#ijJ>RdqxEU)EUkO7GNAtxcaF}#f=C0@|*n4b3NFdG(Y(C_U zRglr@pSpoB?UBk^H3F4>_FSsF3Xhm$(+DUYsU(nbt)u-?7(S|gh4R-zbh$?PgEC+$ z#GOl<(3cgj65HNSU!7k*?6#z(cJCZoL_S|5=W@@T&fMr(!g$&jrV(|bPm1HHgD@YEID62QBot2Gk) zoQ_HX+i)fj+K>e*s+2P_+jA$S)l6nB#N2Pm4LeHY$Ejp{psWtZQGhFTFMO$v@$u)9 zNlr^k1Hqqv*T)WMry1(}7>&%skd2_Rwc!?+qNOO(myoGb%`ka=`YLt!fkS!FaBsEc zR^(0A(5dLw$ng%LrW64g-TQ;s4^)2;GS;ZEI|ZJm7V{GDZrF%Z{1#M<|1xzWK+q(sG%sc-CKqeEhS9IPe~uNH%Qk@l#_ShH@2~TazqtaqMl@-h7A8vcABk} zLTF}f);w1L-UMEj=!fL2=7WT`28W}yUx9KgMUDYKQo zvw0Q(@3qa)9HJtYCu!ySa4oWd?OSa7@r!ORkRF;KuhV-#%SMzNI;orcEyH-#So&cb zx{wbpor=vca&~fF@*vUvHl-Y@J}^0g^kxeQ(}zeN75RV#wNV6A0Z>|aP$KJVJ_Xzv z=|y%NGM#4tuUYK793*h!lYu#Vzv}@>wjKo$FM&a&E39$Wy*aS`>KuF+Smw2!8w^1x zu!^JoO-dujkHGLKa=R!_ZEaI+;L}cYh&c$V7C2z6Dlgn-WRZFXYnUtx zNwH!>!{ljgpo4A0gms)#)o{}u>d@HsWyf{7;oR6A?f<59&_~tZMv$`oM)MJ?4Y7$5 zAwe@)+Zw3x{zAnn0wUazWE#aE?v$v}TvI_TjXk&OXOPZ;r!=eu(a4=LHZMvlC|*YV zl1*$%cKzB2ww#WlZY8Vi(Eb)hlsfACh=Wuy>9t?y8n-4E1ZzKom)qg-ssyQI zy0sq^+3Pw@#p^;3y0kBh!zu9|xUFHVUROlJJFUzHxhkyg@Q*tk($4Rzxm@)xE&oF? zzg$1!T4z`@N%hyKR8da=Mv0KI;kg#xjG8h!_m{%KvSn~bFOqRwR&KW%@BP=j%C#A+ zLB<(Lr`{R1Dibxq%eRs+j>?eHY*(qLF+bPC;s1Q;U8=urt2YM0z=M!=te>x^CL+-O zI{AcZEV@3HF{3b8DuzM+=qeBdHI^0U6$>P6=@aIclWI~!iCy44YF|@0C`t}+RHAc5 zXVsJOA3oH>3J#`tjx#^i1B+hD7dk=Je@{)H&#wQnJX9+96#uvXY*BINftzW*IcGu_*AH=!n=rY zJEZT%kTNC9?433F?t^c{(@mQcu;&T6ND`;qxKz?aA+TX zI<;I}zGxCrCyCakHE-IBiC!<-8-hQ?@x*^Ln7-voO=3Xg-7vy?3aFmL0TL{Fp(GPq zeJ$1@xhX~_cI@=Vmpy6pzy9SLJwV0(&26Q`o1b&Us68r**NEm=8%s8ci_GRN{Lw{k zfsIX)q6kr3ahcL!;5>z{%~PQ#o-EzPHtFio+{(k?l$b}FP@+3)Oqs7QcarwRMH1-> zGt5TiU*iiluNn$5Gz28<>YU#d&sF}jYijM~cW$n&_=JWy$dH=gz4^gV`|mko#}adJ zyLkDat3NoeS59-2+vnh)I>VzweqLfsb6ChHzcNE^f<{WJi4$?<34JyE3nz5^`}erF zO(5yn0RPq*?hjnp5RHJQTo)m$9uWol2`7#bs>wZ36y_5b=Y#8^+rM6-{W9`2xj&FGS>WH-{=VV=@!>!HN|@{^8StXd z?SIKH{g3|-{D1$y{AT}||Noz#|B{w}KmFg%5A1M0*#GbS(|_kbcBF?{FquCD_z*kM zZRM)nVCEuhA1>Hcki0X@E$01cbSA=&LSle<`@Q_VxU!|R-e;dqE*9bbIuxTmczh?G znw|8BFqOGX1Ys710;ei=BvBrE{QlcV3M$v-|K|6W=<+88Tea^OCA{eZOFWJ&eQk2r zr`6T?{`mE-eOPZE7mBkX9Q7<@{~8qoRS~zk&+4rC3-VUi;fcHG3`rX zI=O6zAlBj5g{rgms-7a!-@k3%X>zugB_-fyEpJUyIy;@79PNW_N4@C!L!-Jwj{!9` zjdcq=r~W;O#mb2qr1`CkYA#E>UT$JRj+LG+7M1|HEVEWTzvNpuv+k$jq~bz7BCPIs zD3nUNLP5-3Q_rHva?GSc { - 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 zcmdVec{o&W-vID~q3nhkF=QuA_C!jIF@(l4*@cjOFGOTFvL!Sa4B4`#WQ$5>CS=RL z*Ds_HB8f_w^O)Z2d7kV2p1sGt<+Ti{N{!sMI&5X2i85;VONvQ66i>W1zK!qZ=6k6T{aiffHYiV=e7`RFl(6sHR+`j;hgT?oxpDExKinEbJ1Ph0Zp)|EW~Fp?$g`I!LSi`^Nt3 zpvI^7e3twNuhZT|wFK>eq)pP~G`?+edQ82?5f#yMS}f4d_Zd}Rz{gxW$fH@Em+o`I zGar@%;YI|r*#Tu0`Q(%Lg{n!(k9;!zH@U3R6+32dJH`_zs0G z?w6vh>#$j_{dq3k7s;;Qyb^j)IguNhhuP$no_K4W*={}=Jy3+}ZU}ZMwC%I9!<9dV zPleK6)t&{xJ<}^h=~wb~uV}%r^`#J~gLNd`XXjH6Zvy)J2vqWdV%xR?!y&ej38sgU zYL#_WklXBCuct3PNF{>Ct>B@J^N&92W@hT%V!m3&jO;%z%`qWc9}n-=0BIqdRpD=kT@rZMVcudhc{3UdfMJtmC&d zJLWBR2^T~6`Ju7l#lQd?!MofXWjbGPN)j(Klju6Bft(2TrZqBI@s7dYk{NtN<8mXNI*ZP)o5_a_-#K( zyJskTOZf_;uI@KyqbcM$XD_#HVz3OvDW2eMHxi41gr(kfsxTGgbK~)+hDZzLy|{e6 zbZrv^pO`M6&BJ9Cq?mc)Pb!P_4k&cceQoH>L4J-y2sGAAwuUEH8!Y>^mWm}kJ~E>% zGWiEjqM(c=se-rabr9ZS$7SLLZZoYn=gd@E%;qld?0yw$rE zg3t$+safAmibQ{V!Da0|TJGiFrA_`^ta`pbcqi)vGn^}YT%GucMd8oVeLrZdLKD!<6NsELT{D?$o2R`JWTdq2}zKJ}0qOMxAW|bNh1J&Scbaz)2 zP>SHsN*~cFY`fBE>}@FjNH91cHQ5<6d<%&Tdh+r1w+O)_5pYJOwkL@fM8Lp|`B>Eh ziYbpX=1>1j;>o!70O+N)i+FYxSyakg|kb z>?y(I$=Wb5nwy;xS7vpBg~j#^V-y%tfmjL-^`jW4kc(-#2c99Cl?SB?U(KM;50US5 zemO8Hg5Aanb1H(LdH(|SWP>NzS!+s);REoL{iAM2hWY z1WR_w@5h1_gLc#3CWvNGnTHDq=OsL;uCAjmjZ~$>o}paG*A!=HLm=qA+T9=m?}fn+ zquJY4+dq8_65bc0`-RYwL?SR^LkQUUb$oR-tT;C2xo8pZDP>sU`AVajTuR}rFZOb|%G{7c<8H#O+=XbO{9@+#X8h_b& zMfa~FN3-2U@gtiXfV?&Z)+%`#s!^!c>9{0L3>Co z(gymON6x0pR90-Yasg}aq_i{>DJZ?dsqb>fmhQLn+3G(4Mg;;1eve$f?4Gt=ev{h{ zMy|iG41ZJRxxKpEIP~sY<#}g$bHe0b^W*>T(NyHgOfZ1VN_8*izth_9pwms+y^k zt%5SY*sO6693Sek+{0V&siiq7Jd=bx*PzCTQZ{02O8j|~$+)Q-!)8|b514=kLy7a< z&VkZ~dVkihPN><&LH=_DiuWY<2%7N-z>xKIx=Yi167zl0Kay6k3wrI!>uN-Ro>bpoko>oPQ{c*me$%FoIF)%gktU3s; z{B=+rb8>c0)RZ<_vm3OSLw3APl<_bmx@mew}c@6$|Leu4>3w4z|OzEC`^?1DB)CH&&xfXqM4mA zdLzJ`)ER(tyU*>}5J2}Apg*3HfI&xWl!xT-Gw|9`4T)Bqs%n9mfV7~T*0t=CcvKvj zd7M)xl(hUht5eop;(eOgwm?C@o? zS&KjUxel{==nE`4Vtb?{URGF+F6Wm>qI!Z5T(_OcQH!+h^LJY z8rp7c7sk7n)^71{;vIxOPmPsbZn^Z;^qxqspAz(n!-tSB_r7%4obmWg{S*IZcxw?B zcqf2uY^rO1F|@u`^b!7{sNzh=`sTi+{ws!aYTlRZR6Bu_rO_)FtRo?uY^g7!3vx%1 z@Yf9f(pnD3%Z-lomO5&2ZGHMFYk-g?x1Q@9FlDjXRg9LV&(9|~;BNpdvB(Y;#~b%n z=wJEycrjq_^^oRBsLDx9=fKtc6X33~x=xii>ba+rA-^bU>jvqdL9U`+7WgU%t|_lkt*1RyA0d?XLR9)9$l*ZMy%4zqgCRJHd&)%M~q4G}|b}joqb6 zn+@rm0Gqte6{|mp`OR*0|D)IyWCp_>PoOCWks|cO>H_lqT88H+=6PJYxi$}(fx^Ve zeb3ryVy0&o8&3rc9*98#0vFBngMY$JE zKejgX6OqEad`xleeZ~`bW9E`y&Wck&ttsPTT#vOyI!X4AFH~(p1m1BG$nZ4)h1sxxL+=j`y^Dm(ao?8hvO;y0A^3Yfw?&%AVHXL9PE95jN2d z%jNH|O|2A?w05QYvBG^S#lR$_)$_XJ)tUwjQf9jBqOJVy_r0n2 zo1tf#&6$Zs*^kV-bg&_;3S9Es;zpkK@~09C9@s@@wS*53Z3Z~Z^!@&zY$*LPQ`pJu zy*Li1#pK`htiQ9}9t#_v)0taoxE+=QKU^fMGA+haqPR8f>|5ul@JHG7EIGPd~X z#jjDi@5Wp0eXxHJAoO?@Jt$UAxJ%4NGc7D&SW+K(5G|SFptGgk-9A$f;7fZWFO5dN zj!|Dcy>Fv5n}M;N9Jrqh<2;vp+{Ze$v|)_Rc3kiCe&h6@m2w(luzseeithVC#U1Mb ziVb0B<;2FBt)29CVnLtXz3{Qc)v3_p@JhP~5FEWz`zvH3`*4emd4+|Bl(TprB00ZF>VJ0Ro0xWK0bqeEyuVT z4CKJ?@?>(R^T~WwZ?tY~$!)PCrv2F;;(3+bivco`F#YEDEpW~l+~?orzLtz6zYCpD zku!d*^WfYXg7+!m5P1x7VeH_eWu*6ab;u8lSeU!?5;GTp1@ds!=%IKW)U;oU>%Hwc zP{0n{083huy_@Lq-{DQRA_3$q!udoKP3t%ZKzl&?$%PqC`(V~o>qp@J@0EKOzqojr z-Nuz(tk~~kX@QvD^`(}s7Fw3v_3AkbTa)nt-+#AW*|PX%vM?Kyz7kib!!!0*KoI{Y zMY^BMlZhk%6q7*vY03wUp4x*5MUzdN!m7n(z3yk?1Tvn<<-5+dbA@e8y6?LL#1@;$ ze-0Yc1=qnno_@id319c*x+H&>vF2mN=>xVo!xId8_Kj>!9Uy2*qx+RmXZJLE{1pV4 zOsU&ILp@amXI5V3jbIO(cj{>o)<)MS`unZEiFOZsB}w9I{hVqxr#|8mx}7-bn=w4TV!R z|FiL5FVg+jP}XY}00m3WbzaGbbsmnw>pj#1QoA$4W{?J>Iu8q$`Aji%$I1QRmE4K-9Zc5p7r==$L@bh zz=fYaG#CY)zbab3rp0KB9{dRrJvgr+>Iibv7|K8V*?<1a|Laws2e_@ly=s&>;p^eB zV8nPF36GhtoiVR@T7IErXZ6+|AL;}`wI|1Ey>7IVHqid89uTl~6Cd6{zEmS)p8C{u5R&LQ7P^@`ZN zi%|9Q-rpu?xUg~JKEYqsMan8qsQ-@VPjiNt8<|QQrmiyFh)i{vp zJ}Ag)H~@s}XX_8@S;ji2TEwip;Vc^O|8>^xRMf>xvRG|i&PyCA(2TgL#F0rcv8#S9 zk;dzS$(k*-`|PTNz7#2KX}8Xi)}Mc8KV2%@GFl3!Awd?`*!SbDr2C(x`=Kj9AGYnT z4%)5OKE?R*2$_O443aX))LWjgv<@;D*qy4G!z61?_QKpfnysG789+RkbwmDLdzODU g=zf(rVrLrYO>6zThyH{6bpQH4^Z!3^{_fR(08N^5IRF3v 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...
From 9237a20702b49eaaa63cc115b3bd02f65f6b7ea2 Mon Sep 17 00:00:00 2001 From: minhphu2020 <741redwood@gmail.com> Date: Tue, 2 Apr 2019 00:13:40 -0700 Subject: [PATCH 4/4] speech working, but order is not right yet due to async --- .../codeu/servlets/MessageServlet2.java | 67 +------------ src/main/webapp/js/user-page-loader.js | 93 ++++++------------- src/main/webapp/user-page.html | 1 - 3 files changed, 31 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/google/codeu/servlets/MessageServlet2.java b/src/main/java/com/google/codeu/servlets/MessageServlet2.java index adf9d7a..f0939b9 100644 --- a/src/main/java/com/google/codeu/servlets/MessageServlet2.java +++ b/src/main/java/com/google/codeu/servlets/MessageServlet2.java @@ -2,24 +2,14 @@ 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; @@ -28,28 +18,11 @@ 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 **/ @@ -61,10 +34,9 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr response.sendRedirect("/index.html"); return; } - // To get clean messsages, removed dangerous things, html + // To get clean messages, 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() @@ -75,8 +47,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr // ("neutral") VoiceSelectionParams voice = VoiceSelectionParams.newBuilder() .setLanguageCode("en-US") - // Try experimenting with the different voices - .setSsmlGender(SsmlVoiceGender.NEUTRAL) // Try experimenting with t + .setSsmlGender(SsmlVoiceGender.NEUTRAL) .build(); // Select the type of audio file you want returned @@ -93,39 +64,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr 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().write(audioContents.toByteArray()); } - - // - // 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 0507ff3..3549427 100644 --- a/src/main/webapp/js/user-page-loader.js +++ b/src/main/webapp/js/user-page-loader.js @@ -57,7 +57,6 @@ function fetchMessages() { return response.json(); }) .then((messages) => { - console.log(messages); const messagesContainer = document.getElementById('message-container'); if (messages.length == 0) { messagesContainer.innerHTML = '

This user has no posts yet.

'; @@ -92,8 +91,8 @@ async function buildMessageDiv(message) { messageDiv.classList.add('message-div'); messageDiv.appendChild(headerDiv); messageDiv.appendChild(bodyDiv); -// audio = await createAudioTag(message.text); -// messageDiv.appendChild(audio); + audio = await createAudioTag(message.text); + messageDiv.appendChild(audio); return messageDiv; } @@ -101,40 +100,34 @@ async function buildMessageDiv(message) { * 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" - // }, - // }) + // Do nothing, can consider showing a simple error to the user. + if (messageText === "") { + return; + } + + 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; + 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'; + + 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; + } catch (err) { + throw new Error(`Unable to call the Text to Speech API: {err}`) + } } /** @@ -167,35 +160,6 @@ 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(); @@ -204,5 +168,4 @@ function buildUI() { fetchAboutMe(); const config = {removePlugins: [ 'ImageUpload' ]}; ClassicEditor.create(document.getElementById('message-input'), config ); - sendAMessage(); } diff --git a/src/main/webapp/user-page.html b/src/main/webapp/user-page.html index 822c4cd..31f7542 100644 --- a/src/main/webapp/user-page.html +++ b/src/main/webapp/user-page.html @@ -60,7 +60,6 @@

User Page


Loading...
-
Loading audio...