viernes, 29 de agosto de 2014

Redes semánticas

Prolog es un lenguaje muy adaptado para el desarrollo de aplicaciones en Inteligencia Artificial, en las que un problema básico es representar el conocimiento de un dominio concreto de forma que pueda ser interpretado correctamente en la computadora. Uno de los métodos de representación, basado en modelos de psicología cognitiva, son las redes semánticas. Las redes semánticas son grafos orientados que proporcionan una representación declarativa de objetos, propiedades y relaciones. Los nodos se utilizan para representar objetos o propiedades. Los arcos representan relaciones entre nodos del tipo es_un, es_parte_de, etc. El mecanismo de inferencia básico en las redes semánticas es la herencia de propiedades.

Explicación
http://web.ing.puc.cl/~jabaier/iic2612/leng_natural1.pdf

Ejercicios
http://www.nebrija.es/~cmalagon/ia/ejercicios/Ejercicios_redes_semanticas.pdf

jueves, 28 de agosto de 2014

Reconocimiento de voz

Para empezar lo que necesitamos es decirle a nuestra aplicación cuales son los permisos que necesitará desde el AndroidManifest.xml. Para ello debemos añadir la siguiente línea dentro del archivo antes mencionado:
<uses-permission android:name="android.permission.INTERNET" />

Una vez hecho este paso previo vamos a implementar el reconocimiento de voz. Para ello abrimos nuestra activity principal e incluimos el siguiente código:

private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
Private Button btnVoice; 
private void inicializarReconocimiento(){
btnVoice = (Button) findViewById(R.id.btnVoice);
PackageManager pm = getPackageManager();         
List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);           
if (activities.size() != 0) { 
btnVoice.setOnClickListener(new OnClickListener() {        
public void onClick(View v) {      
startVoiceRecognitionActivity();      
}     });          }
}
Lo que estamos haciendo aquí es inicializar un botón para poder lanzar el reconocimiento y comprobando que está disponible este servicio en el dispositivo. Vamos a ver que es lo que hace el método startVoiceRecognitionActivity que lanza nuestro botón.
private void startVoiceRecognitionActivity() {        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);         intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,                 RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);         intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "");         startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);     }

El método es muy sencillo . Lo que hace es llamar al intent correspondiente del reconocimiento, abriendo una nueva actividad que devolverá un resultado, en este caso devolverá los posibles resultados. Tambien le pasamos la variable VOICE_RECOGNITION_REQUEST_CODE que luego utilizaremos en el método onActivityResult. Esto veremos ahora para que sirve.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {          if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {             ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);                         final CharSequence[] items = new CharSequence[matches.size()];    for(int i = 0; i < matches.size(); i++){    items[i] = matches.get(i);    }                     AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(selectResult);         builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) {     txtSearch.setText(items[item].toString());             }  });          AlertDialog alert = builder.create();           alert.show();                       }          super.onActivityResult(requestCode, resultCode, data);      }

Lo que estamos haciendo ahora es sobreescribir el método OnActivityResult de nuestro activity. Este método es lanzado cuando una activity secundaria que hemos lanzado desde nuestra activity principal devuelve un resultado . Por ejemplo, después de reconocer lo que hemos dicho, devolverá un resultado con las posibles frases que ha reconocido el servicio.
Lo primero que hacemos es verificar el resultCode que es una especie de identificador para saber de que activity proviene el resultado. Es para esto para lo que utilizamos la variable anterior.
También verificamos que el resultado de nuestra activity secundaria ha sido satisfactorio con resultCode.
Una vez hechas las comprobaciones parseamos los resultados que en este caso va a ser una lista de frases y los cuales podemos mostrar con un AlertDialog por ejemplo. En este seleccionamos un resultado y lo seteamos en un TextView, txtSearch. A partir de aquí el como se utilicen los resultados ya es cosa de cada uno.

Ejemplo
Reconocimiento para hacer llamadas http://www.tutorialeshtml5.com/2013/03/tutorial-simple-reconocimiento-de-voz.html