ASP.NET Voz Control Server

Voz en la web. Recuerdo hace años, (6), www.tiscali.it que presentó al WebBit un proyecto de "Voice on the web" que dejo todos con la boca abierta! Después de eso, con Telecom Italia que nos hacia muestra de tecnología con sus centralitas y con acento horrible (que no ha cambiado todavía), la síntesis de voz no ha tenido mejoras excitantes. Dejando a un lado los proyectos de inteligencias artificial, que prometen traducción simultanea desde una lengua a otra, en tiempo real y con pronunciación perfecta, las herramientas para sintetizar voz desde texto, empieza tímidamente a aparecer en la web. Hay unos cuantos proyectos útiles y realmente "aptos" al utilizo de Voz, como por ejemplo periódicos y portales verticales y blogs.

Una de estas soluciones, que posiblemente gracias al "boca boca" ya habéis probado en vuestras paginas, es VoiceMe.

El proyecto es realmente bueno y simple, tanto simple que si queréis integrarlo en proyectos no hay que plantearse muchos cambios, de hecho hay solo que copiar y pegar...

Con este ejemplo construimos un Control Server ASPx para la voz utilizando VoiceMe. En la pagina http://vozme.com/webmasters.php?lang=es ya podéis encontrar todos los códigos que VoiceMe ha escrito para ser integrados en paginas.

Utilizando el código de ejemplo, construimos un simple control que también puede ser utilizado en DataList, Datagrid y otros control para repetición de datos.

El resultado final de este control permite Drag&Drop desde la toolbar, como todos los Controles Server, y especificar algunas propiedades que permitirán elegir si "leer" el contenido de un Tag DIV o directamente el Field Text del control.

Vamos allá..:

fig1

Como siempre VSTO, creamos un nuevo proyecto ASP.NET SERVER CONTROL, en este caso con Framework 3.5 pero puede ser también 2.0 y no 1.1 (se utiliza ClientScript).

Hecho esto no hay mucho que hacer, declaramos todas las propiedades del control y cambiamos los nombres al Class (como sigue):

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace VoiceMeNet
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:VoiceSupport runat=server></{0}:VoiceSupport>")]
    public class VoiceSupport : WebControl
    {
        string m_Text;

        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("Dime esto!")]
        [Description("Texto que se leerá! Si vacio el se espera un elemento especificado en ControlToRead.")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                return m_Text;
            }

            set
            {
                m_Text = value;
            }
        }

        string m_ImageUrl;

        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("http://vozme.com/img/megaphone40x40w.gif")]
        [Description("La imagen que se utilizará como link para llamar la función voiceme! Si vacio se utiliza http://vozme.com/img/megaphone40x40w.gif")]
        [Localizable(true)]
        public string ImageUrl
        {
            get
            {
                return string.IsNullOrEmpty(m_ImageUrl) ?
                    "http://vozme.com/img/megaphone40x40w.gif" :
                    m_ImageUrl;
            }

            set
            {
                m_ImageUrl = value;
            }
        }

        string m_ControlToRead;

        [Bindable(true)]
        [Category("VoiceMe")]
        [DefaultValue("")]
        [Description("El ID del contról HTML que contiene el texto a leer.")]
        [Localizable(true)]
        public string ControlToRead
        {
            get
            {
                return m_ControlToRead;
            }

            set
            {
                m_ControlToRead = value;
            }
        }

        string m_CultureName;

        [Bindable(true)]
        [Category("VoiceMe")]
        [DefaultValue("ES")]
        [Description("ES=Español|EN=English etc...")]
        [Localizable(true)]
        public string CultureName
        {
            get
            {
                return m_CultureName;
            }

            set
            {
                m_CultureName = value;
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            if (!Page.ClientScript.IsClientScriptIncludeRegistered(typeof(string), "voiceScriptInclude"))
                Page.ClientScript.RegisterClientScriptInclude("voiceScriptInclude", "http://vozme.com/get_text.js");
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            StringBuilder sb = new StringBuilder();

            if (string.IsNullOrEmpty(Text))
            {
                sb.AppendFormat("<a href=\"#\" onclick=\"get_id('{0}','{1}');\">", ControlToRead, CultureName);
                sb.AppendFormat("<img src=\"{0}\" border=\"0\" />", ImageUrl);
                sb.Append("</a>");
            }
            else if (string.IsNullOrEmpty(ControlToRead))
            {
                string _textContainerID = string.Format("voiceMe_{0}", ClientID);

                sb.AppendFormat("<div id=\"{0}\" style=\"visibility:hidden\">{1}</div>", _textContainerID, Text);
                sb.AppendFormat("<a href=\"#\" onclick=\"get_id('{0}','{1}');\">", _textContainerID, CultureName);
                sb.AppendFormat("<img src=\"{0}\" border=\"0\" />", ImageUrl);
                sb.Append("</a>");
            }
            else
            {
                sb.AppendFormat("El control {0} se esperaba la propriedad Text o ControlToRead.<br/>", ClientID);
            }
            output.Write(sb.ToString());
        }
    }
}

 

K, Esto permite obtener en VSTO un control como lo que sigue en figura.

fig2

1 Comment

Comments have been disabled for this content.