Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Reconocimiento de voz

Iniciado por HArlock1980, Abril 02, 2016, 11:51:21 PM

Tema anterior - Siguiente tema
Buenas noches a todos,Estoy con un proyecto en el que queremos hacer un asistente tipo siri pero con un avatar, he encontrado formas de reconocer la voz y de pasar el texto a audio, pero todos se basan en apretar un botón para iniciar la grabación del sonido.Lo que quiero hacer es que el avatar preste atención de una forma similar a como lo hace Siri ("hey Siri") o Cortana ("Hola Cortana), sin apretar ningún botón, llevo bastante dándole vueltas y no lo consigo, hay alguien que se le ocurra o sepa como hacer esto?Muchas gracias a todos.

No lo sé, pero no creo que Siri o Cortana estén todo el rato pendientes de si hablas o no. Probablemente detecten un cierto nivel de ruido y se activen entonces.

Con System.Speech de vs se puede lograr, no se la integración con Unity.

Qué versión de .NET es System.Speech? Yo diría que más de .4, es posible o estoy equivocado?

Cita de: iRobb date=1459647409" data-ipsquote-contentid="35549" data-ipsquote-contentcommentid="129052" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_TopicQué versión de .NET es System.Speech? Yo diría que más de .4, es posible o estoy equivocado?
Esta desde la 3.0 pero yo uso la 4.x

Pues entonces, con Unity en la 2.x, no lo puede aprovechar.

Cita de: iRobb date=1459667199" data-ipsquote-contentid="35549" data-ipsquote-contentcommentid="129056" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_TopicPues entonces, con Unity en la 2.x, no lo puede aprovechar.
Si, es una lastima que no actualicen, no se que motivos tendrán.

Gracias por las respuestas, el caso es que he conseguido medir el ruido que entra por el micro y a partir de ahí intentar enviar la consulta pero tampoco me funciona del todo bien, ya que el archivo de sonido que hay que generar para poder ver si hay actividad en el microfono cuando pasa de cierto nivel, no deja que el archivo que se crea a partir del nivel de ruido tenga la calidad suficiente (creo que hay algunas letras al inicio de la frase que no se guardan en el segundo archivo) y cuando la envio al servicio online de reconocimiento de voz (API.AI) no lo entiende. 

Vamos a ver. Bueno vemos que no necesitas el System.Speech, sino que es otro problema.Y si tienes un buffer memoria en bucle para la detección del ruido (1/2 secs), y en el momento de detección del ruido, guardas el archivo con el búfer + lo que empieces a detectar? O sea, algo así como crear el archivo a partir del punto 0 del búfer, que tendrá el registro previo al ruido y no en el momento de detectar el ruido?

Ok, puede ser... pero como hago eso? no estoy muy puesto en el tema de mani***r los buffers, si quieres pego el script de detección de ruido y explico más detalladamente como hago el envío.  

Ok. A ver si te podemos ayudar. Son streams en memoria los búfers que comento.

Abril 03, 2016, 12:36:57 PM #11 Ultima modificación: Abril 03, 2016, 12:37:15 PM por HArlock1980
Vale, pego el script y te cuento como lo hago funcionar, a ver si me podeis echar una mano, muchas gracias por adelantado.
using UnityEngine;
using System.Collections;namespace Mic
{
    //[RequireComponent(typeof(AudioSource))]
    public class MicrophoneInput
    {
        public MicrophoneInput(AudioSource audiosource)
        {
            micro = audiosource;
        }        public float sensitivity = 10000;
        //public float loudness = 0;
        public AudioSource micro;        public void Start()
        {
            
            micro.clip = Microphone.Start(null, true, 5, 44100); //44100
            micro.loop = true; // Set the AudioClip to loop
            micro.mute = false; // Mute the sound, we don't want the player to hear it
            micro.volume = 0.02f; //Volumen mínimo para no ser perceptible
            while (!(Microphone.GetPosition(null) > 0)) { } // Wait until the recording has started
            micro.Play(); // Play the audio source!        }        public void Stop()
        {
            Microphone.End(null);
           
        }
       
        public float GetAveragedVolume()
        {
            //float[] data = new float[256];
            float[] data = new float[64];
            float a = 0;
            micro.GetOutputData(data, 0);
            foreach (float s in data)
            {
                a += Mathf.Abs(s);
            }
            return a / 64;
        }        public float loudness()
        {
            float loud = GetAveragedVolume() * sensitivity;
            return loud;
        }    }}[/quote]En el script principal de la aplicación, instancio esta clase y le paso como argumento el audio source que quiero utilizar (puede ser el mismo en el que realizo la grabación para enviar después o no), y con una condición if (loudness() > 2) disparo la grabación con el SDK de API.AI, que lo que hace es lanzar una grabación, checkar los posibles errores y enviar al parar la grabación al servidor para devolverme una query JSON de la que puedo recuperar tanto la traducción a texto de lo que he enviado como las respuestas programadas. 

Abril 03, 2016, 07:17:30 PM #12 Ultima modificación: Abril 03, 2016, 07:20:39 PM por HArlock1980
Le he estado dando vueltas, y puede que no necesite sumar dos clips, por lo que veo los clips de audio recuperan los últimos segundos según los parámetros establecidos.Si hago que un ruido de cierta intensidad dispare una corrutina que dispare el envío de este audio en que ya registro en esta clase en 2 segundos, en vez de la que empieza a registrar la API que comentaba antes ya lo tengo no?

Eso, el utilizar lo anteriormente registrado. Pruébalo a ver.

Ok, tendré que modificar los métodos de la API, comentaré algo cuando lo tenga, ojalá funcione! 

Etiquetas: