audio

Haciendo hablar a Twitter

Hace tiempo que tenia pendiente hacer un mashup de la librería javascript de Twitter, Google Translate y las nuevas oportunidades de HTML5. Pues al final me he animado y no ha sido muy complicado: por un lado detectar el idioma del tweet, por otro lanzar la ejecución del el audio, y por ultimo integrar estas dos funciones el la librería widget.js que ofrece Twitter.

Esta es una primera aproximación, que puede ser mejorada considerablemente. A continuación el código y ejemplo (esta probado que funciona en chrome).

El widget.js modificado se puede descargar aqui.

<br />
&lt;html&gt;<br />
	&lt;head&gt;<br />
	&lt;/head&gt;<br />
	&lt;body&gt;<br />
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi?key=AIzaSyBMhwGvMwDbGgXIVU4SI_aVy7AjeGFnorw&quot;&gt;&lt;/script&gt;<br />
		&lt;script type=&quot;text/javascript&quot;&gt;<br />
		google.load(&quot;language&quot;, &quot;1&quot;);</p>
<p>	var auxtest = &quot;&quot;;<br />
	var elapsedtww = 0;</p>
<p>	function cleanHtml(html){<br />
		 	var result = html.replace(/&lt;.*?&gt;(.*?)&lt;\/.*?&gt;/g, function(a,s){return s;});<br />
	  	var result2 = result.replace(/#(.*?)/g, function(a,s){return s;});<br />
	  	var result3 = result2.replace(/@(.*?)/g, function(a,s){return s;});<br />
	  	return cleanLinks(result3);<br />
	}</p>
<p>	function cleanLinks(text){<br />
  	var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&amp;@#\/%?=~_|!:,.;]*[-A-Z0-9+&amp;@#\/%=~_|])/ig;<br />
  	return text.replace(exp,&quot;&quot;);<br />
	}</p>
<p>	function sleep(milliSeconds){<br />
		var startTime = new Date().getTime(); // get the current time<br />
		while (new Date().getTime() &lt; startTime + milliSeconds); // hog cpu<br />
	}</p>
<p>	function submitGtext(text) {<br />
			while (elapsedtww &gt; 0){<br />
				sleep(1000);<br />
			}<br />
			elapsedtww = 1;<br />
      auxtest = cleanHtml(text);<br />
      google.language.detect(auxtest, playVoice);<br />
      return false;<br />
    }</p>
<p>	function playVoice(result){<br />
	  var langcode = &#8216;en&#8217;;<br />
    if (result.language) {<br />
        var language = &#8216;unnamed&#8217;;<br />
        for (l in google.language.Languages) {<br />
          if (google.language.Languages[l] == result.language) {<br />
            language = l;<br />
            break;<br />
          }<br />
        }</p>
<p>        if(language == &quot;SPANISH&quot;){<br />
         langcode = &#8216;es&#8217;;<br />
        }<br />
        if(language == &quot;PORTUGUESE&quot;){<br />
         langcode = &#8216;pt&#8217;;<br />
        }<br />
        if(language == &quot;GERMAN&quot;){<br />
         langcode = &#8216;de&#8217;;<br />
        }<br />
    }<br />
		var audio_file = document.getElementById(&#8216;voice&#8217;);<br />
		while(audio_file.currentTime &lt; audio_file.duration &amp;&amp; audio_file.currentTime != 0){<br />
			sleep(100);<br />
		}<br />
		audio_file.src = &#8216;http://translate.google.com/translate_tts?q=&#8217;+escape(html_entity_decode(auxtest))+&#8217;&amp;tl=&#8217;+langcode;<br />
		document.getElementById(&#8216;audiopaths&#8217;).value =  document.getElementById(&#8216;audiopaths&#8217;).value +&quot;\r\n\r\n&quot;+html_entity_decode(auxtest);<br />
		audio_file.load();<br />
		audio_file.play();<br />
		elapsedtww = 0;<br />
	}</p>
<p>	function html_entity_decode(str)<br />
	{<br />
	    try<br />
		{<br />
			var  tarea=document.createElement(&#8216;textarea&#8217;);<br />
			tarea.innerHTML = str; return tarea.value;<br />
			tarea.parentNode.removeChild(tarea);<br />
		}<br />
		catch(e)<br />
		{<br />
			//for IE add &lt;div id=&quot;htmlconverter&quot; style=&quot;display:none;&quot;&gt;&lt;/div&gt; to the page<br />
			document.getElementById(&quot;htmlconverter&quot;).innerHTML = &#8216;&lt;textarea id=&quot;innerConverter&quot;&gt;&#8217; + str + &#8216;&lt;/textarea&gt;&#8217;;<br />
			var content = document.getElementById(&quot;innerConverter&quot;).value;<br />
			document.getElementById(&quot;htmlconverter&quot;).innerHTML = &quot;&quot;;<br />
			return content;<br />
		}<br />
	}<br />
	&lt;/script&gt;<br />
	&lt;script src=&quot;http://www.ikeralbeniz.net/wp-content/uploads/2010/12/widget.js&quot;&gt;&lt;/script&gt;<br />
&lt;script&gt;<br />
new TWTR.Widget({<br />
  version: 2,<br />
  type: &#8216;search&#8217;,<br />
  search: &#8216;meneame_net&#8217;,<br />
  interval: 9000,<br />
  title: &#8216;Test&#8217;,<br />
  subject: &#8216;Test de GoogleTranslate + twiiter&#8217;,<br />
  width: 250,<br />
  height: 300,<br />
  theme: {<br />
    shell: {<br />
      background: &#8216;#8ec1da&#8217;,<br />
      color: &#8216;#ffffff&#8217;<br />
    },<br />
    tweets: {<br />
      background: &#8216;#ffffff&#8217;,<br />
      color: &#8216;#444444&#8242;,<br />
      links: &#8216;#1985b5&#8242;<br />
    }<br />
  },<br />
  features: {<br />
    scrollbar: false,<br />
    loop: true,<br />
    live: true,<br />
    hashtags: true,<br />
    timestamp: true,<br />
    avatars: true,<br />
    toptweets: true,<br />
    behavior: &#8216;default&#8217;<br />
  }<br />
}).render().start();<br />
&lt;/script&gt;<br />
	&lt;audio id=&quot;voice&quot; src=&quot;&quot;&gt;<br />
		&lt;h3&gt;Este ejemplo solo funciona con navegadores que soportan HTML5 como CHROME&lt;/h3&gt;<br />
	&lt;/audio&gt;<br />
	&lt;body&gt;<br />
&lt;/html&gt;<br />




Este ejemplo solo funciona con navegadores que soportan HTML5 como CHROME

Posibilidades de la nueva funcionalidad de Google Translate

Google ha actualizado su sistema de traducción con una nueva funcionalidad: es posible escuchar el texto y así comprobar la pronunciación. La verdad es que el resultado (probado en Ingles) es bastante bueno e imagino que dentro de algún tiempo estará disponible en castellano.

Por curiosidad he estado mirando como podría usarse esta funcionalidad por parte de aplicaciones de terceros y he obtenido que el audio se genera a partir de un script al que es posible llamar de la siguiente manera:

http://translate.google.com/translate_tts?q=<testo_codificado> &tl=<lenguaje>

Donde <texto_codificado> es el texto a pronunciar codificado con la función URLEncode (que es posible encontrar en casi todos los lenguajes) y donde <lenguaje> es el código del lenguaje en el que esta el texto (por ahora solo parece funcionar con Ingles “en”).

Un ejemplo de cómo quedaría seria el siguiente:

http://translate.google.com/translate_tts?q=This%20is%20a%20text%20in%20English%20that%20can%20be%20heard&tl=en

La forma de generar este tipo de URLs de forma dinámica en PHP seria la siguiente:

<?php

function getTranslatedSound($string){
$string=str_replace(” “,”%20″,$string);
$string = “?q=”.$string.”&tl=en”;
$string = “http://translate.google.com/translate_tts”.$string;
return $string;
}

$string = getTranslatedSound(“This is a text in English that can be heard”);
echo $string;
?>

Con lo que las posibilidades son enormes:

  • Adaptar páginas para ciegos
  • Crear Presentaciones Dinámicas con audio
  • Escuchar una conferencia en directo sin necesidad de streaming usando Twitter o similares.
  • Etc,…

Es decir, la combinación de esta funcionalidad con tecnologías como Ajax o Flash podría revolucionar muchos de los servicios actuales. Ahora toca correr a aquellas personas que quieran ser los primeros en dar ese servicio y colocarse en una posición dominante en el mercado.

Actualización [18/11/2009 16:33]

He añadido un ejemplo con javascript para crear un CHAT de voz.

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”en” xml:lang=”en”>
<head>
<script>
function DHTMLSound(surl) {
document.getElementById(“output”).innerHTML = document.getElementById(“output”).innerHTML + “<br/>” + surl;
surl = surl.replace(new RegExp(/\s/g),”%20″);
document.getElementById(‘sound’).value = “”;
document.getElementById(“dummyspan”).innerHTML=”<embed src=’http://translate.google.com/translate_tts?q=”+surl+”&tl=en’ hidden=true autostart=true loop=false>”;

}
</script>
</head>
<body>
<span id=dummyspan></span>
<form>
<textarea id=”sound”></textarea>
<input type=”button” value=”Play Sound” onClick=”DHTMLSound(document.getElementById(‘sound’).value)”>
</form>
<span id=”output”></span>
</body>
</html>

 Scroll to top