Ir al contenido principal

Usando el narrador de Minecraft

Me encontraba jugando Minecraft en la nueva snapshot 17w14a y vi que implementaron una nueva funcionalidad la cual es un narrador, es decir una voz lee todo lo que parece en el chat y fue cuando me dije ¿Joder, cómo lo hicieron? generalmente este tipo de cosas utiliza muchos recursos.

Lo primero fue ubicar que biblioteca utilizan, para eso explore la carpeta del juego y encontré algo.
  
.minecraft/libraries/com/mojang/text2speech/1.5/text2speech-1.5.jar

Al parecer es una biblioteca creada por Mojang. Bueno es hora de ver que tiene, al pasar por el descompilador obtuve lo siguiente:


¿Es todo? ¿Dónde esta el resto? Básicamente lo que hacen los de Mojang es invocar otro programa desde java, es decir un wrapper.
¿Pero que programa invocan? viendo las clases encontré que usan un jni para ejecutar una biblioteca en c llamada libfliteWrapper.so

De nuevo descompilando libfliteWrapper.so obtenemos:


Vemos que existe una función llamada "say" como parametro el texto a leer y dentro de la función llama al programa llamado "play" ¿pero que es play?

 man play


Pero play solo reproduce sonido ¿cómo es que hace la voz? no encontre forma pero encontré otra forma de generar la voz, usando ffplay.

 ffplay -f lavfi flite=text="Hello world!!!."

Esta es la misma voz que escucho en Minecraft.


Es hora de utilizar la biblioteca.

import com.mojang.text2speech.Narrator;

public class App {
 public static void main(String[] args) {
  /* Ubicacion de la biblioteca */
  System.setProperty("jna.library.path", "./src/natives/resources/");

  Narrator narrator = Narrator.getNarrator();
  narrator.say("Hola mundo!!!!");

  while (true) {
   try {
    Thread.sleep(100L);
    System.exit(0);
   } catch (InterruptedException arg2) {
    arg2.printStackTrace();
   }
  }
 }
}

¿Y si creamos una versión en español del narrador de Minecraft?
Lo que tenemos que hacer es crear una nuevo wrapper pero utilizando espeak y usando una voz en español.

Creamos filterWrapper.h

#ifndef FLITE_H
#define FLITE_H

void init();
void say (char *msg);

#endif

Y en filterWrapper.cc

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "fliteWrapper.h"

void init(){

}

void say (char *msg){
  char cmd[1024];
         memset(cmd, '\0', 1024);
  strncat(cmd, "espeak -ves+f5 \"", 16);
  strncat(cmd, msg, 1000);
  strncat(cmd, "\"", 1);
  system(cmd);
}

Compilamos la biblioteca.

gcc -fPIC -c fliteWrapper.c
gcc -shared -o libfliteWrapper.so fliteWrapper.o

Ya tenemos la voz en español.

Codigo GitHub

Entradas más populares de este blog

Problemas resueltos de álgebra lineal - ESCOM

Me gustaría compartir un doc que me ayudo mucho cuando estudiaba en la ESCOM. Son un conjunto de problemas de álgebra lineal resueltos paso a paso, esto ayuda mucho a la hora del examen (En especial cuando haces el ETS xD) Los autores son:       M.C. Florencio Guzmán Aguilar       Dr. Samuel Domínguez Hernández

Instalado Cuda + Tensorflow + Jupyter con Conda en Ubuntu 20.04

Una forma alternativa de instalar tensorflow + cuda en Ubuntu, la ventaja de esta forma es que es más sencillo y se pueden tener varias versiones de tensorflow con cuda. También es posible crear un kernel para jupyter y tener diferentes opciones a la hora de usarlo.

Clasificador de gatos y perros usando TensorFlow

El otro día estaba buscando información acerca de redes de convolución y encontré un estupendo video 1 en youtube, el cual explicaba como realizar un clasificador de imágenes en 5 min, así que dije ¿Por que no hago un clasificador de gatos y perros, pero a mi estilo?  - why not?. Configurando todo Básicamente es utilizar el ejemplo de TensorFlow llamado retrain.py que es un script de entrenamiento de una red de convolución Inception-v3 2 y entrenar nuestra red con las imágenes que queremos clasificar, en este caso gatos y perros. Vamos a necesitar muchas pero muchas imágenes de gatos y perros así que  para obtener las imágenes de nuestro entrenamiento tenemos dos posibles ideas. * Ir a Imagenet y obtener el archivo con todas las url de las imágenes y usando wget descargarlas. * Descargar las imágenes de google images utilizando un plugin para chrome o firefox.  Una vez obtenidas las imágenes para nuestro entrenamiento vamos a crear nuestro proyecto, primero tenemos qu