Sintetizador de voz por puerto de joystick

Página 1/2
| 2

Por pastbytes

Supporter (12)

Imagen del pastbytes

15-09-2016, 14:31

Hace muchos años empezaba a experimentar con sintesis de voz, tratando de lograr un chip que pudiera hablar castellano y que fuera barato y simple de usar. Para poder lograr estas dos ultimas condiciones, siempre le di prioridad al ahorro de recursos antes que a la calidad del sonido, y a medida que los microcontroladores se fueron abaratando, la razon para mantener bajo el uso de recursos empezo a ser otra: cuanto menos proceso y memoria consumiera la generacion de sonido, mas canales simultaneos se podrian reproducir en el futuro.
Pero el futuro no llega todo lo rapido que queremos, en particular si es un proyecto que depende del poco tiempo que puedo dedicarle, por eso es que despues de tantos años mis sintetizadores de voz solo disponen de un canal de sonido.
En 2011, cuando estaba desarrollando el segundo sintetizador, HR2, decidi que iba a empezar a programar en ordenadores para los que nunca habia desarrollado hard o soft, ya que tenia una coleccion de equipos que estaban guardados y no habia usado mas que para probarlos. Esto me llevo a decidir intentar portar la sintesis de voz a ordenadores de 8 bits, lo que servia para lograr varias cosas en un solo proyecto: programar en ordenadores de 8 bits que no tuve en los 80s, programar en asm de Z80, y saber que tan bien podria sonar la voz con las limitaciones de esos equipos. Para no hacer larga la historia, de este experimento dentro del experimento salieron los sintetizadores de voz TAV, como el TAVMSX. Lamentablemente para ese mini proyecto, una vez que logre emitir voz por soft en MSX, Spectrum 48K, Spectrum 128K, Timex Sinclair 2068, Commodore 64 y ZX81, perdi el interes y ahi se quedaron sin llegar a versiones finales, salvo la de Commodore 64. Pero volvi al desarrollo del sintetizador HR2.
Intentando que el chip pudiera cantar, fui probando varios algoritmos para cambiar la nota y tipo de la voz, lo cual me llevo a descartar metodos de sintesis, se cancelo el HR2, aparecio el HR3, se cancelo tambien ese y llegamos al HR4.
A partir del sintetizador HR4 surgieron proyectos paralelos, y decidi que el HR4 seria el que estaria disponible publicamente, quedando los otros para desarrollo interno. Tambien el HR4 seria el estandar minimo, y los siguientes tendrian como minimo las mismas funciones y serian intercambiables para el usuario, de forma que se pudiera tener un HR4 y luego cambiarlo por uno superior sin modificar el soft que lo controla.
Si bien el sintetizador esta diseñado para conectarse a una variedad de dispositivos, queria que fueran usables desde ordenadores de 8 bits, y esto me llevo a probar con una conexion RS232. Para conectarlo al MSX mi intencion era usar el puerto de impresora, pero me dijeron que no todos los MSX tenian uno, por lo que termine usando el puerto de joystick, y una rutina que simula la transmision por RS232 a 19200 bps.
Aqui se puede ver como se conecta al MSX:

Este es el circuito armado en una placa experimental:


Unos videos mostrando el funcionamiento del sintetizador:

Esta es una prueba controlandolo desde el BASIC del Spectrum 48K, a traves del puerto RS232 de la Interface 1, es una prueba antigua, el sonido actual del sintetizador es mas claro:
https://www.youtube.com/watch?v=Au8V4iX4EPg

Esta es una prueba controlandolo desde un MSX, enviando secuencias en modo directo desde BASIC:
https://www.youtube.com/watch?v=LiVwDyXdBpE

Por ultimo, en este se prueba el sintetizador mas avanzado, HD1, con el MSX corriendo la aventura conversacional Neutronia, escrita en BASIC, y luego el juego REC, de DamianWorf:
https://www.youtube.com/watch?v=bVWhbYiDAgs

Ya comentare despues algunas cosas mas, por el momento con esto se puede saber de que se trata. Si alguno tiene interes en armarse una placa para probarlo, me puede contactar y le envio el binario para grabar el PIC, esto va a ser publico pero como esta en beta prefiero que por ahora lo tengan los que realmente vayan a probarlo.
De todas maneras probablemente esta sea la version final, y ni bien me haga un tiempo para reescribir el manual incluyendo los agregados desde la v1.0, seguramente voy a publicar todo junto.

Login sesión o register para postear comentarios

Por osises

Master (214)

Imagen del osises

19-09-2016, 14:09

Hola pastbytes:

Me parece una idea genial, sobre todo por que parece muy barato de fabricar.

Recuerdo cuando vi la película "Juegos de Guerra" que el protagonista tenía un ordenador de las primeras épocas, de los años 70. Tenía un sintetizador de voz que daba un aire muy cibernético-futurista (vaya palabro).

Todos sabemos que en algún momento existió esto para MSX, pero nadie parece haber tenido interés en explotarlo. Recuerdo también haber jugado alguna vez a Cobras Arc (creo que era este), que era conversacional y "hablaba" todos los textos que mostraba. Lo probé bastante y me di cuenta que la fonética era en español, o eso parecía.

El caso es que habría que determinar si un circuito como el tuyo tendría realmente uso. Me refiero a que si por software se puede conseguir resultados tan buenos como los del juego que comento, quizás no haría falta; habría que determinar si la longitud de la rutina que hace este proceso es suficientemente corta como para implementarlo en cualquier otro desarrollo. Por lo que recuerdo, era de bastante buena calidad y presiento que no debe ocupar mucho.

Por otro lado, si se trata de experimentar, bienvenido sea. Me encantan este tipo de proyectos. Si de alguna forma pudiera liberar recursos al MSX a la hora de reproducir voz, mucho mejor. Pero creo que lo que planteas acapara cierto proceso del equipo enviando información al dispositivo, ¿no es así?

Para finalizar, felicitarte por el "invento".

Por pastbytes

Supporter (12)

Imagen del pastbytes

19-09-2016, 15:29

Saludos osises, en mi presentacion en el foro general ("saludos desde argentina") comentaba un poco sobre mis sintetizadores multiplataforma "TAV", en MSX ocupa algo asi de 5K, pero con parser para escribir en ASCII foneticamente, podria ser menos sin eso. Mi intencion es poner al dia ese codigo y publicar el fuente en asm, asi el que quisiera podria usarlo en sus programas, pero la desventaja de esos sintetizadores es que consumen bastante memoria y proceso, el mio en particular emite audio de 4 bits a alrededor de 9500 hz, y eso no deja mucho margen para integrarlo en juegos, salvo que sea una aventura o algo donde la pantalla sea mas o menos estatica mientras habla.
Con respecto al chip sintetizador, el mismo dispone de un buffer para que se pueda ir enviando el texto de forma adelantada, esto permite que un juego aproveche tiempos muertos para hacer los envios. Sin embargo, un puerto serie a 19200 bps aun asi consume bastante tiempo, entonces hace unos meses empece a experimentar si podia comunicarme con el chip a 57600 bps, y como conozco mas el hard del Commodore 64, las pruebas se hicieron ahi.
Con el humilde 6502 a 1MHz pude no solo enviar sino tambien recibir datos desde el chip a 57600 bps, aunque claro hay poco margen para procesar lo que se recibe. Pero que tal si combinamos los 57600 bps con las interrupciones de video? Se me ocurrio que no es necesario enviar datos continuamente para la voz, aun si se quisiera hablar continuamente, ya que la voz usa un flujo lento de datos, entonces mi idea fue enviar tan solo 1 byte en cada interrupcion de video (50 caracteres por segundo en PAL, 60 en NTSC), pero a 57600 bps, de manera de usar el minimo tiempo posible en la interrupcion. A 57600 bps el envio de un byte toma 170 microsegundos, alrededor de 3 lineas de barrido del video. No es poco, pero tampoco es excesivo.
Para probar la factibilidad de hacer un sistema asi, hice una rutina para el Commodore 64 que se dispara apenas comienza a dibujarse el borde inferior de la pantalla, esto es necesario porque en el Commodore toda la memoria tiene contencion mientras se dibujan los graficos, no asi en los bordes ya que el chip de video no tiene que leer nada desde la RAM y no detiene al procesador. En un MSX esto no ocurre y por tanto tiene ventaja, ademas de tener un procesador mas rapido. Con esto quiero decir que si es posible en un Commodore, con mas razon lo es en un MSX.
Volviendo a mi rutina de prueba, una vez que se dispara la interrupcion (60 veces por segundo en mi C64 NTSC), se lee un byte desde un buffer de 256 caracteres donde tengo un texto cargado, se envia el byte actual, se incrementa el puntero y se retorna. Durante el envio, la rutina tambien pone el borde de color amarillo, para poder distinguir en pantalla cuantas lineas de video se pierden en eso.
La rutina envia el texto del buffer una y otra vez, ya que solo era una prueba, y aqui hay un video donde se la ve funcionando, y donde mientras esto ocurre, ingreso y ejecuto un programa BASIC simple, y consulto el directorio del disco (una tarjeta SD en una SD2IEC, una placa que emula una disketera).
El video es este:
https://www.youtube.com/watch?v=ZUitF2iytSw

Se puede ver que al final reseteo el Commodore y el chip sigue reproduciendo el resto de texto aun pendiente en su buffer interno, esto demuestra que 50/60 bytes por segundo sobran para la voz, por lo cual pocas veces se daria este caso extremo de enviar 1 byte en todos los cuadros. El led azul de la placa indica que el buffer esta lleno y que no puede recibir mas datos, se puede ver que esta practicamente todo el tiempo asi, porque recibe mas de lo qu epuede procesar.
En cuanto al MSX, ya que la rutina actual envia a un maximo de 19200 bps, el primer paso seria escribir una nueva a 57600 bps, y despues intentar hacer lo mismo usando interrupciones de video.

Por pastbytes

Supporter (12)

Imagen del pastbytes

10-11-2016, 12:56

*** Sintetizador de voz HR4 version 1.2 ***

Despues de algunos experimentos decidi cambiar el diseño del sintetizador HR4 para que se pueda expandir en el futuro sin tener que modificar el circuito. Ahora la placa para MSX tiene una entrada de datos desde el sintetizador, ya que se agregaron comandos que devuelven una respuesta, y se reservaron dos salidas para una futura placa que tenga sintetizador de voz y modulo wifi compartiendo el "RS232" del puerto de joystick.
Ya que ahora se puede consultar el modelo del sintetizador de voz y la version del firmware, seria posible hacer una autodeteccion para saber donde esta conectado el modulo (joystick 1, joystick 2, puerto centronics, cartucho, etc.).
Ademas de cambios en la asignacion de pines del PIC, en esta version se reservaron pines para conectar un joystick analogico de PC, o 2 paddles/potenciometros y 2 botones. Esta funcion todavia no esta implementada pero en alguna futura version seguramente lo este, por el momento los comandos de consulta de joystick estan funcionando, pero reportan un valor fijo con los ejes X e Y en el centro, aunque si reportan correctamente el estado de los dos botones.
El nuevo plano es este:

A diferencia de la v1.1, que cambiaba de lugar la salida de datos del MSX al sintetizador, esta version es totalmente compatible con el (poco) soft existente.
Esta version 1.2 es la primera que va a ser publica, quien quiera armarse una placa me puede pedir el binario para grabarse el PIC.

En este video se ve la nueva placa funcionando con el soft de demostracion:
https://www.youtube.com/watch?v=h3C_XnbxJek

Y unas fotos:





Por PAC

Guardian (5213)

Imagen del PAC

10-11-2016, 16:49

La verdad es que este hardware iría muy bien para acompañar a un juego, esa voz robotizada tan característica me recuerda irremediablemente a la película Juegos de guerra Smile .

Por pastbytes

Supporter (12)

Imagen del pastbytes

10-11-2016, 19:12

La voz se puede modificar, aqui esta usada en un estilo mas robotico:
https://www.youtube.com/watch?v=iDFFgrF5bGQ
En un juego hecho en asm deberia quedar mejor.

Por pastbytes

Supporter (12)

Imagen del pastbytes

19-12-2016, 19:03

Acabo de terminar de editar una version completa del manual, habia hecho antes una version con las primeras paginas, sigue siendo preliminar y sujeto a cambios, pero por lo menos esta el contenido completo del manual original de la v1.0, con la actualizacion correspondiente para la v1.2, pero ademas paso por una reorganizacion del texto y un cambio de estilo.
Tal vez tendria que agregar 3 o 4 paginas mas con algunos graficos para explicar mejor algunas cosas como el tipo y nota de la voz, y la modulacion de los instrumentos, pero por ahora esto es lo que hay.
El manual se puede descargar de aqui:
http://www.pastbytes.com/apps/picsynth/ManualHR4v1.2_preliminar2.pdf

Por pastbytes

Supporter (12)

Imagen del pastbytes

04-02-2017, 10:23

Breve actualizacion:
- Hice una nueva version preliminar del manual, formateado para imprimir. Se puede descargar con este enlace:
http://www.pastbytes.com/apps/picsynth/ManualHR4v1.2_prelimi...
- Rehice mi sitio web pastbytes.com, sin contenido nuevo, pero con otra organizacion de directorios para poder crear un nuevo sitio para el sintetizador de voz.
- Ahora toda la informacion del sintetizador HR4 y los futuros de la serie, estara en http://www.pastbytes.com/microsint
- Entrando en el sitio de microsint, se puede consultar todo el manual seleccionando HR4 en los iconos superiores, una vez ahi se puede navegar las secciones del manual con los iconos azules.

Por pastbytes

Supporter (12)

Imagen del pastbytes

24-03-2017, 07:52

Ultimamente estuve rehaciendo una secuencia que hice hace años para que el sintetizador de voz cante. La prueba la hice controlando el sintetizador desde un Commodore 64, a 57600 bps, pero ahora ya pude portar el programa a MSX-BASIC.
Se usa una pequeña rutina que envia bytes a 19200 bps por el puerto de joystick, esta rutina esta contenida en lineas DATA dentro del programa BASIC, por lo que solo es necesario cargar y ejecutar HIMNO.BAS
La cancion que canta es el himno nacional argentino, simplemente porque es lo suficientemente antigua para no tener problemas de copyrights, y porque en los 80s escuche al sintetizador de voz SAM para Commodore 64 cantar el himno de EEUU, por lo que mi sintetizador de voz tenia que cantar el de Argentina.
Se podria adaptar cualquier cancion si se tiene una secuencia MIDI o alguna composicion en un tracker, en mi caso yo use un mod de Amiga que hizo uctumi, un musico argentino que compone para Commodore 64 y Amiga.
Aqui se puede ver el video de la prueba en MSX:
https://www.youtube.com/watch?v=0PvK0QFE-lc
Subire los programas del diskette de demostracion del sintetizador de voz al sitio de microSint en cuanto tenga tiempo, pero si alguien los quiere antes para ver como es la secuencia o los comandos, me los puede pedir.

Por yodh

Champion (402)

Imagen del yodh

27-03-2017, 23:39

¡GRACIAS por el trabajazo que te estás metiendo @pastbytes!!! Cool
Me temo Crying que mi ayuda se limita a meramente dar todos mis ánimos para que puedas concluir tu proyecto ya que mis conocimientos sobre el tema son prácticamente nulos (bueno... ´tirando´ de chiste malo (re-malo LOL! ): se puede quitar sin problemas el ´prácticamente´ Smile ).

Ya hablando en serio... pienso que si a un juego le añadimos unas voces sintetizadas bien escogidas y puestas en el momento justo... ese efecto puede provocar al jugador una sensación de que el juego es aún mejor ya que NUNCA deja de sorprender que en unos ´simples´ (con todos los respetos) ordenadores de ocho bits se puedan reproducir voces que sean tan similares a las humanas... poder tener un sistema que pueda permitir hacer algo así en nuestros proyectos de juegos sería como un sueño hecho realidad.

Por pastbytes

Supporter (12)

Imagen del pastbytes

28-03-2017, 19:04

Es ideal para juegos como Berzerk:
https://www.youtube.com/watch?v=d6eBbvITzCU

Que en la version original tiene voz:
https://www.youtube.com/watch?v=DFSQ0Pl4KDk

Página 1/2
| 2