0

I am making a script which receives a String and separate it on smaller Strings.

Ex: "This is a long sentence, and I will separate it into smaller parts. Lalala"

It will return "This is a long sentence","and I will separate it into smaller parts","Lalala"

The aim of this is to use Google translator to transform text to speech, but this feature has a limit of about 70-80 chars, so if the string is too large I need to chop it.

First I chop in sentences separated by a dot ("."), then if there are still too long sentences, I split them with the commas (",") and if there are still too long strings I separate them in unique words.

Everything works well until I try to join some words so the audio become more continuous. For some reason the strings separated by commas get joined again. I do not know why.

This is the code:

Edit: Relevant section split out and formatted

function talk(text){
 var audios = document.createElement('audio');
audios.setAttribute('id','audio_speech');
var playlist = new Array()
if(text.length >= 75) {
 playlist = text.split("."); 
 for (var i = 0;i<playlist.length;i++) {
 if (playlist[i].length >= 75) {
 auxarr = playlist[i].split(",");
 //alert(auxarr.length);
 for(var j=0;j<auxarr.length;j++) {
 auxarr2 = auxarr[j].split(" ");
 document.write(auxarr2+"<br>"); 
 if (auxarr[j].length >= 75) {
 auxarr2 = auxarr[j].split(" "); 
 for(var x=0; x < auxarr2.length; x++){
 if(auxarr2[x].length < 50) {
 aux = auxarr2[x];
 while (aux.length < 50 && auxarr2[x+1]) {
 aux = aux + " " + auxarr2[x+1];
 auxarr2.splice(x,1);
 auxarr2[x]=aux; 
 } 
 }
//...

Edit: Full original code

function talk(text)
{
 var audios = document.createElement('audio');
 audios.setAttribute('id','audio_speech');
 var playlist = new Array()
 if(text.length >= 75) {
 playlist = text.split(".");
 for (var i = 0;i<playlist.length;i++) {
 if (playlist[i].length >= 75) {
 auxarr = playlist[i].split(",");
 //alert(auxarr.length);
 for(var j=0;j<auxarr.length;j++) {
 auxarr2 = auxarr[j].split(" ");
 document.write(auxarr2+"<br>");
 if (auxarr[j].length >= 75) {
 auxarr2 = auxarr[j].split(" ");
 for(var x=0; x < auxarr2.length; x++){
 if(auxarr2[x].length < 50) {
 aux = auxarr2[x];
 while (aux.length < 50 && auxarr2[x+1]) {
 aux = aux + " " + auxarr2[x+1];
 auxarr2.splice(x,1);
 }
 auxarr2[x]=aux;
 }
 }
 auxarr_end = auxarr.slice(j+1,auxarr.length);
 auxarr_begin = auxarr.slice(0,j);
 document.write("<br>"+auxarr+"<br> aca"); 
 document.write("<br>"+auxarr_end+"<br> aca1");
 document.write("<br>"+auxarr_begin+"<br> aca2"); 
 auxarr.splice(j,1);
 auxarr_begin = auxarr_begin.concat(auxarr2);
 j = auxarr.length;
 auxarr = auxarr_begin.concat(auxarr_end);
 alert(auxarr);
 }
 }
 //alert("current: "+playlist[i]);
 //alert("current length:"+playlist[i].length);
 //alert("auxarr: "+auxarr);
 playlist_end = playlist.slice(i+1,playlist.length);
 playlist_begin = playlist.slice(0, i);
 playlist.splice(i,1);
 playlist_begin = playlist_begin.concat(auxarr);
 i = playlist.length;
 playlist = playlist_begin.concat(playlist_end);
 //alert("new "+playlist[i]); 
 }
 }
 /*do {
 textAux = text.substring(0, 74);
 text = text.substring(textAux.length, text.length);
 playlist.push(textAux);
 }while(text.length >= 75);*/
 } else {
 playlist.push(text);
 }
 //
 //playlist.push(text);
 /*for(var a=0; a<playlist.length;a++){
 document.write(playlist[a]+"<br>");}*/
 audios.setAttribute('src', 'http://translate.google.com/translate_tts?tl=es&q=' + encodeURIComponent(playlist[0]));
 playlist.splice(0,1);
 audios.load();
 audios.play();
/*
 */
 audios.addEventListener('ended', function(){
 if (playlist[0]){
 audios.setAttribute('src', 'http://translate.google.com/translate_tts?tl=es&q=' + encodeURIComponent(playlist[0]));
 playlist.splice(0,1);
 audios.play();
 }
 }, false);
}
</script>
Ben McCormick
25.8k12 gold badges56 silver badges71 bronze badges
asked Mar 1, 2013 at 16:33
1
  • 2
    Your code sample is too long! Reduce it down and you'll probably find your bug in the process. You have 4, yes 4! nested for-loops, that seems like a really bad thing. Commented Mar 1, 2013 at 16:34

1 Answer 1

1

Try this, modify it to work with your constants and parameters.

var LIMIT = 20;
var res = new Array()
//strats with spliting by dot
var dotArr = "This is a long sentence. and I will separate it into smaller parts. Lalala".split(/[.]/);
for (var i = 0; i < dotArr.length; i++) {
 if (dotArr[i].length > LIMIT){
 //only when have to, split by comma
 var comArr = dotArr[i].split(/[,]/);
 for (var j = 0; j < comArr.length; j++) {
 //only when have to and that a space exists, split by space
 if (comArr[j].length > LIMIT && comArr[j].indexOf(" ") != -1 ){
 var spaceArr = comArr[j].split(/[ ]/);
 //accomulate words until we reach the limit and then push the value to res
 for (var k = 0; k < spaceArr.length;){
 var sMerge = spaceArr[k++];
 while (k < spaceArr.length && sMerge.length + spaceArr[k].length + 1 < LIMIT){
 sMerge = sMerge + " " + spaceArr[k];
 k++;
 }
 res.push(sMerge)
 }
 }else{
 res.push(comArr[j]);
 }
 }
 }else{
 res.push(dotArr[i]);
 }
}
//res contain all optimized sentences.
answered Mar 1, 2013 at 16:52
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.