Autor Tema: Sintetizador de voz en español por RS232  (Leído 36020 veces)

E_Blue

  • PIC24F
  • *****
  • Mensajes: 2226
  • Electric Blue
Re: Sintetizador de voz en español por RS232
« Respuesta #30 en: Marzo 20, 2013, 02:34:20 pm »
Pero las instrucciones de PIC18 son mas potentes, y hay PIC18 que corren a 64MHz(16MIPS). ;)

Ademas como la memoria la podes direccionar de forma continua ya no tenes que estar saltando de un lado a otro con las tablas y eso, creo, te ahorra instrucciones.
U2kgZXN0YXMgbGV5ZW5kbyBlc3RvIGVyZXMgdW4gTkVSRCEhIQ ==
Procesando...

Si quieres ayuda con tu proyecto recuerda agregar información del mismo, y no seas haragán y esperes tener todo servido, esto es un foro, no una bolsa de trabajo.

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #31 en: Marzo 20, 2013, 02:47:26 pm »
Si, yo creo que con las ventajas que tiene el PIC18 va a andar perfectamente, pero me asegure de optimizar todo lo posible porque ademas voy a necesitar implementar algun tipo de sincronizacion entre canales, y tambien temporizacion musical, ya que ahora todos los tiempos se especifican por cantidad de ciclos de las ondas, lo cual significa tiempos diferentes segun la nota musical que se haya elegido. Falta agregar todo el codigo para que se puedan especificar los pulsos por minuto y el tipo de nota (blanca, negra, corchea, etc.), es decir que pueda manejar todo con tiempos absolutos, todo eso es proceso extra ademas de multiplicar por 4 el tiempo que consume el codigo actual. Y no nos olvidemos de que ademas estoy pasando a usar el triple de frecuencia de muestreo (26KHz contra 8,6KHz), es decir que en numeros brutos necesito 12 veces mas capacidad de proceso, lo que todavia no se es cuanto usa el programa del proceso disponible en el 16F648A a 20MHz.
« Última modificación: Marzo 20, 2013, 02:49:28 pm por pastbytes »

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #32 en: Marzo 21, 2013, 05:02:32 am »
Recorde que la placa anterior tenia zocalo para el cristal, precisamente porque iba probando distintas velocidades, en particular me fue util cuando adapte el programa para un 12F683 para que funcionara con oscilador interno, le puse un cristal de 8MHz a una version antigua para poder desarrollarla mas comodamente en el 16F648A. Desde ese momento pasaron un par de años y el programa crecio mucho, pero ahora probe la version actual en esa placa, primero a 10MHz, y arranco sin problemas, hasta la pude controlar desde la PC a 600 bps, luego probe con un cristal de 8MHz y tambien arranca perfectamente, si capturo el audio y lo reproduzco a 2 veces y media la velocidad sale exactamente igual que a 20MHz, por lo cual ya se que mi programa tiene margen para incrementar en complejidad 2,5 veces mas en el 648A, con eso casi compenso las 3 veces que voy a aumentar la frecuencia de muestreo, y con el paso a un PIC18 de 40MHz compenso un canal extra de sonido. Es decir que sin optimizar demasiado (o nada) el programa ya puedo tener 26KHz de muestreo y 2 canales de 8 bits. Ahora solo me falta optimizar mas el programa aprovechando las ventajas del PIC18 para conseguir 4 canales, lo que va a estar bastante complicado, porque equivaldria a que el programa funcionara tal como esta, pero en un PIC16 de alrededor de 4MHz. Me parece que logre un programa portable y optimizado a la vez, sabia que a 8MHz andaba, y que a 4MHz no alcanzaba la velocidad pero por casi nada, pero pense que el requerimiento actual de velocidad estaria en algun lugar entre 10 y 20MHz. El cristal de 20MHz no estaba puesto porque lo necesitara, ya que originalmente iba a ser uno de 8MHz, sino porque si no iba a usar el oscilador interno de 4MHz para ahorrarme un cristal, daba igual el valor que tuviera, y por lo tanto era mejor usar el mas comun, que es el de 20MHz.

salvador

  • PIC12F
  • **
  • Mensajes: 137
  • if (think) exist;
    • club de interpretes en chip
Re: Sintetizador de voz en español por RS232
« Respuesta #33 en: Marzo 21, 2013, 01:39:01 pm »
lindo programa, me hizo recordar el SP0256, cuando lo usabamos en el cole con un z80 u 6502, por cierto

aquí pueden bajar el emulador

http://pic-club.net/basic_8051/chiptalksetu.zip

otro muy bueno

http://analogx.com/files/sayiti.exe

y pastbytes si se anima a vender aqui tiene uno de sus futuros clientes.

main()
{
if (think)
exist;
}
http://pic-club.net

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #34 en: Marzo 22, 2013, 06:25:16 am »
No tengo problema en enviar algun chip, en el estado en que se encuentre en ese momento el programa, por supuesto funcionando, pero en la ultima version estable. El inconveniente es que si es de fuera de Argentina eso tal vez tenga que pasar por aduana, y eso requiere ir al correo los dias en que atienden y en los horarios reducidos que tienen, creo que eran 3 dias a la semana y dos horas cada dia. Tambien los precios del correo son impredecibles asi que tendria que averiguar mas o menos y cobrar algo que lo cubra, porque cada vez que mire los precios en la web o pregunte un aproximado, al ir a enviar cambiaba mucho. Y sumando a eso por supuesto lo que me cueste reponer el PIC. Por estas complicaciones, si alguien esta interesado me va a tener que esperar a que averigüe bien cuales son los costos y tenga tiempo de enviar. Probablemente por el tamaño del envio no haga falta el tramite de aduana y sea mas facil. Si es alguien de Argentina por supuesto el asunto es mucho mas facil.
Con respecto al proyecto, estuve viendo que el codigo para RS232 ocupa 164 palabras, lo que usando el modulo USART del PIC se reduciria notablemente. Lo que me falta por implementar, que no es necesario en todos los casos pero seria muy util en algunos, es un comando para detener la reproduccion inmediatamente, vaciando el buffer. Esto es util por ejemplo si se esta controlando el PIC desde una computadora, si implementamos un juego que use el PIC para sonido, y estamos en el menu del juego, podemos enviarle continuamente una secuencia para ejecutar musica en la presentacion en espera de que el jugador presione una tecla o un boton del joystick. El problema es que si no se envian los datos en tiempo real, es decir en el tiempo justo en que tienen que reproducirse, y en lugar de eso se envia el texto sin control, puede ocurrir que el jugador comience el juego y el PIC aun tenga datos en el buffer para reproducir. Con ese comando se solucionaria. Tambien es util si hacemos un proyecto con otro PIC, que muestre menues en pantalla que podemos recorrer uno por uno, el PIC podria ir leyendo cada menu a medida que se selecciona, y si el usuario avanza rapidamente por las opciones, cada vez que se avanza se enviaria un comando para que se detenga, seguido del nuevo texto. De esta manera no habria que esperar a que se termine de hablar cada opcion, y el mismo programa podria funcionar con o sin el PIC sintetizador de voz, si hay un sintetizador colocado se hablaria y sino los comandos irian a ninguna parte y no se notaria diferencia en pantalla (LCD o lo que fuera), solamente el hecho de que no habria voz.
Estoy mirando como funciona el MIDI y no parece muy complicado de implementar, tengo que darle forma a como se controlaria desde un secuenciador o teclado, por ahora lo unico que tengo con conector MIDI es la Amiga 4000 con un adaptador de RS232 a MIDI que compre hace unos años y que va a tener uso por primera vez.
« Última modificación: Marzo 22, 2013, 06:34:24 am por pastbytes »

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Sintetizador de voz en español por RS232
« Respuesta #35 en: Marzo 22, 2013, 07:51:32 am »
Hola!

Seguramente usar el módulo por hard te va a reducir el código. Y liberar ciclos de clock (creo) para otros procesos.

Lo que me falta por implementar, que no es necesario en todos los casos pero seria muy util en algunos, es un comando para detener la reproduccion inmediatamente, vaciando el buffer. Esto es util por ejemplo si se esta controlando el PIC desde una computadora, si implementamos un juego que use el PIC para sonido, y estamos en el menu del juego, podemos enviarle continuamente una secuencia para ejecutar musica en la presentacion en espera de que el jugador presione una tecla o un boton del joystick. El problema es que si no se envian los datos en tiempo real, es decir en el tiempo justo en que tienen que reproducirse, y en lugar de eso se envia el texto sin control, puede ocurrir que el jugador comience el juego y el PIC aun tenga datos en el buffer para reproducir. Con ese comando se solucionaria. Tambien es util si hacemos un proyecto con otro PIC, que muestre menues en pantalla que podemos recorrer uno por uno, el PIC podria ir leyendo cada menu a medida que se selecciona, y si el usuario avanza rapidamente por las opciones, cada vez que se avanza se enviaria un comando para que se detenga, seguido del nuevo texto. De esta manera no habria que esperar a que se termine de hablar cada opcion, y el mismo programa podria funcionar con o sin el PIC sintetizador de voz, si hay un sintetizador colocado se hablaria y sino los comandos irian a ninguna parte y no se notaria diferencia en pantalla (LCD o lo que fuera), solamente el hecho de que no habria voz.

Esa sería una opcion casi indispensable para darle un uso "profesional" al chip. Algo asi como la "cereza del postre" ;)
Quedaría perfecto!

Un abrazo!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

javier_ale

  • PIC10F
  • *
  • Mensajes: 86
Re: Sintetizador de voz en español por RS232
« Respuesta #36 en: Marzo 22, 2013, 10:29:17 pm »
pastbytes, muy buen trabajo.
Con tu permiso, le voy a pasar el video a un compañero de trabajo que es ciego para ver que opina.  ;)
El utilizaba hace años uno llamado cibervoz (adjunto la foto). Voy a ver si me lo presta para poder estudiarlo. Ya me lo ha dado en otras oportunidades ( cuando aun era relativamente nuevo) para cambiarle algun que otro conector (fuente o salida de auriculares).  El ya no lo utiliza. Ahora utiliza un programa que directamente se instala en la pc.
Si obtengo alguna informacion, con gusto te la transmitire.
Saludos

Hola pastbytes.
Te cuento que ya le he pedido el aparato a mi compañero de trajabo. Me dijo que me lo iba a prestar, pero creo que esta dudando y "no lo va a poder encontrar". Estoy esperando que me lo traiga.
Por otro lado le he hecho escuchar el audio de tus videos. Solo pudo reconocer el audio que todos podemos reconocer. Que tenga el oido acostumbrado no significo de mucho. Despues de hacerle escuchar como 5 de los videos y cuando ya se iba le pregunte que puntaje entre 1 y 10 le daba el sintetizador. Lo penso y dijo 5, pero me aclaro que sabiendo el laburo y las dificultades ( la limitacion en memoria, el lenguaje asembler y que estes trabajado con un chip) te daria un 6 o 7. O sea, lo que interpreto que quiso decir, tangibilidad del sintetizador =5 , tangibilidad + laburo + esfuerzo, etc= 6,7 o mas ( asi me dijo 6,7 o mas). Dijo que si logras que no este tan gangozo estaria bueno. No se si te sirva de algo, es solo una opinion mas.
Ya que estamos, les paso un video de un control por voz hecho en java (no es mio el projecto). Esta en portugues.

Saludos!!!!
« Última modificación: Marzo 22, 2013, 10:30:54 pm por javier_ale »
Usuario Baneado por Comportamiento indebido en el Foro

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #37 en: Marzo 22, 2013, 11:28:28 pm »
Hola!

Seguramente usar el módulo por hard te va a reducir el código. Y liberar ciclos de clock (creo) para otros procesos.

Lo que me falta por implementar, que no es necesario en todos los casos pero seria muy util en algunos, es un comando para detener la reproduccion inmediatamente, vaciando el buffer.

Esa sería una opcion casi indispensable para darle un uso "profesional" al chip. Algo asi como la "cereza del postre" ;)
Quedaría perfecto!

Un abrazo!

No parece complicado implementar la conexion por hard, voy a ver si me puedo hacer un tiempo el fin de semana para adaptarlo, y de paso agregar el comando que falta. Me parece que voy a utilizar algunos pines que quedaron reservados para la conexion a un bus de CPU, para colocarle jumpers y seleccionar por ejemplo si se quiere eco de lo recibido, o la velocidad de recepcion.

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #38 en: Marzo 22, 2013, 11:58:36 pm »
Hola pastbytes.
Te cuento que ya le he pedido el aparato a mi compañero de trajabo. Me dijo que me lo iba a prestar, pero creo que esta dudando y "no lo va a poder encontrar". Estoy esperando que me lo traiga.
Por otro lado le he hecho escuchar el audio de tus videos. Solo pudo reconocer el audio que todos podemos reconocer. Que tenga el oido acostumbrado no significo de mucho. Despues de hacerle escuchar como 5 de los videos y cuando ya se iba le pregunte que puntaje entre 1 y 10 le daba el sintetizador. Lo penso y dijo 5, pero me aclaro que sabiendo el laburo y las dificultades ( la limitacion en memoria, el lenguaje asembler y que estes trabajado con un chip) te daria un 6 o 7. O sea, lo que interpreto que quiso decir, tangibilidad del sintetizador =5 , tangibilidad + laburo + esfuerzo, etc= 6,7 o mas ( asi me dijo 6,7 o mas). Dijo que si logras que no este tan gangozo estaria bueno. No se si te sirva de algo, es solo una opinion mas.

Solo los ultimos dos videos de mi canal son de la version actual, los otros no generan la voz de la misma manera y muchos de esos la emiten a 7,1KHz. Me da la impresion de que el oido entrenado sirve mas para escuchar a velocidades a las que no estamos acostumbrados, pero valia la pena probar.  ;)
Tengo claro que en el estado actual las aplicaciones son generar efectos como voz robotica en musica tocada en vivo, y generar voz en aplicaciones donde el vocabulario dentro de un contexto sea reducido, es decir donde se esperen por ejemplo 5 mensajes diferentes que no sean demasiado parecidos. Es decir las aplicaciones son mas o menos las mismas que cualquier chip para robotica del tipo del SP0256-AL2 o similares.
Pero tambien es cierto que no estoy probando el chip en condiciones favorables, lo pruebo siempre con textos tecnicos porque la idea es que la voz se entienda perfectamente en algun momento. Si hubiera usado textos de prueba con palabras mas comunes o frases que todos conozcan, daria la impresion de que se entiende mas, pero esa no es la gracia. Sin embargo como dije, en contextos donde las opciones son lo suficientemente diferentes se tiene que entender todo perfectamente.
Todavia falta hacer ajustes al volumen de las consonantes, en el programa todo se genera al 100% de volumen y se reduce en tiempo real segun haga falta, asi que hacer esos ajustes implica tocar unos pocos numeros, pero hay que probar combinaciones de palabras para saber como quedan mejor. Para hacer algo realmente inteligible, la idea es usar 26KHz de muestreo y un PIC18.

ZeK005

  • Administrator
  • PIC24F
  • *****
  • Mensajes: 2742
Re: Sintetizador de voz en español por RS232
« Respuesta #39 en: Marzo 23, 2013, 12:13:08 am »
Che.... voy a meter la cuchara en el medio para tirarle un poroto a Pastbytes..... alguno se puso a pensar LO DIFICIL Y COMPLICADO que es realizar esta tarea con el hardware que esta utilizando? Con una computadora, soft y hard apropiado hacemos que hable loquendo directamente, con distintas voces y todo, pero el tema pasa por el hecho de que pastbytes lo esta haciendo todo con un microcontrolador de microchip de los pequeños, con memoria ram muy limitada, que trabaja con 8 bits, sin placa de sonido, etc. La verdad es un laburazo de la puta madre y si bien a fines practicos no tenga una aplicacion en si mismo es un tremendo PoF (proof of concepts) que enriquece muchisimo a la persona y le da mas herramientas a la hora del manejo de microcontroladores, mas aun, tiene la amabilidad de compartir con nosotros tanto tiempo de desarrollo y aprendizaje.

En mi opinion...... 10 se queda corto. Es facil criticar y comparar desde un soft, si te pongo loquendo te rompo el c...... como suele decirse, pero nos estamos olvidando de las salvedades y las distancias que hay en lo que se esta comparando. Es como comparar un helicoptero apache de ultima generacion con la maquina voladora de DaVinci.



Me explico a lo que voy?

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #40 en: Marzo 23, 2013, 12:38:32 am »
Las criticas estan bien, yo soy el mas critico de programa, ya habria una version mejor si la hubiera hecho facil y hubiera pasado a un PIC18 o superior, pero la idea era conseguir algo medianamente inteligible con los menores recursos posibles. El sintetizador original es teorico, lo hago a 44KHz con audio de 16 bits, el programa que hago en el PIC es una implementacion de eso y con la minima calidad necesaria para reproducir la voz. Por otro lado, es un sintetizador de fonemas, es el mas basico que puede haber, el SP0256-AL2 es un sintetizador que usa alofonos, esto es que graba los sonidos de transicion entre fonemas, el equivalente en español seria tener para decir "hola", los alofonos O, OL, LA y A, las O y A serian sonidos puros, y los otros empiezan como uno y terminan como otro, de esa manera sale un poco mas natural al unirlos. Yo lo solucione de otra manera, haciendo una gran cantidad de edicion al sonido de forma que las transiciones no se noten, el sonido de todo esta ajustado al mismo tono y volumen. Para las futuras versiones me queda implementar la transformacion en tiempo real de una onda a otra (morphing), que supongo haria la transicion mucho mas natural, pero por ahora es suposicion, simular todo eso incluso en programas de audio lleva mucho tiempo, estoy considerando escribir el sintetizador para la PC, con audio en calidad CD, aunque sea para ir experimentando con nuevos algoritmos antes de hacerlo en el PIC.
En mi opinion tener que usar una PC o celular para emitir voz en un proyecto simple es una bestialidad, esta perfecto si la aplicacion misma requiere el uso de una PC, pero en ese caso ya hay herramientas de todo tipo, lo mio apunta a lo portable, al bajo consumo de bateria, y a la integracion en otros proyectos sin incrementar significativamente el costo. Con lo que estoy compitiendo, y por ahora no muy favorablemente, es con los chips del tipo ISD o similares, pero dependiendo de la aplicacion este chip es mas conveniente, si el audio hablado puede variar lo suficiente como para que complique tenerlo fijo.
« Última modificación: Marzo 23, 2013, 12:40:21 am por pastbytes »

ZeK005

  • Administrator
  • PIC24F
  • *****
  • Mensajes: 2742
Re: Sintetizador de voz en español por RS232
« Respuesta #41 en: Marzo 23, 2013, 01:27:47 am »
Sabes que estaria bueno que nos compartas (ya que casi todos estamos en bolas con este tema), cuales son los fonemas, que son los alofonos, como los trabajas etc. Vos sabes que a la mayoria de nosotros nos gusta entender el procedimiento en vez de que nos den algo ya armado, y conocer el concepto de funcionamiento seria muy muy interesante.

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #42 en: Marzo 23, 2013, 02:37:58 am »
Este es un sintetizador de concatenacion de fonemas, esto es, que simplemente cada sonido del español (fonema) se reproduce uno detras de otro para formar palabras. Normalmente este tipo de sintetizadores, de concatenacion, se hace con audio digitalizado para cada fonema, pero aca no puedo darme el lujo de almacenar todo, si tuviera la memoria para eso el programa se limitaria a secuenciar "wavs". En lugar de eso uso procedimientos de compresion buscando partes repetitivas, y generando otros sonidos (en particular los basados en ruido) por programa.
Los fonemas que soporta este programa son A E I O U B CH D F G J K L M N P R R2 S T SH, y se escriben asi tal cual en ASCII para que el programa los reconozca. R corresponde a la RR (fuerte) y R2 a la R suave, podria haber usado RR y R, pero dado que la RR es mas comun que la R suave, se terminaria escribiendo demasiado. Elimine sonidos redundantes, al menos como se habla aca, por ejemplo la Z que se reemplaza por S, la C, que debe reemplazarse por S o K segun corresponda, la V que se reemplaza por B. El fonema G se usa solo como suena en Gato, no como suena en General, ya que para ese ultimo esta la J. No quise atar al sintetizador a la escritura de un lugar en particular, porque segun la region la LL se pronuncia como i, sh o li, y lo mismo pasa con otras letras que tambien varian, por eso uso un sistema fonetico, que es mas flexible.
Se supone que uno al hablar no pronuncia los sonidos puros, sino que entre un fonema y otro se va haciendo una transicion, por eso el sistema de alofonos, que es mas avanzado y como dije es el que usa el SP0256-AL2, almacena todas las combinaciones que puede haber de sonidos, como explique con lo de "hola", en mi programa se almacenan los fonemas O, L y A, mientras que en un sintetizador de alofonos se almacena un alofono O (que dura la mitad de mi O), OL (que es una transicion entre O y L, y dura la mitad de tiempo cada una), LA (transicion entre L y A, durando la mitad cada una), y A (que tambien dura la mitad que mi A). De esta manera el sonido suena mas natural porque hay sonidos intermedios entre un fonema y otro, pero requiere una gran cantidad de sonidos almacenados, para hacer cualquier combinacion posible de una vocal, una L y otra vocal, en mi programa necesito los fonemas AEIOUL, mientras que en uno de alofonos necesitaria AEIOU, y ademas las combinaciones AL, EL, IL, OL, UL, y las combinaciones LA, LE, LI, LO y LU. Por eso el SP0256 tiene una gran cantidad de sonidos, y aun asi son pocos para el ingles. Con memoria suficiente podria poner todas las combinaciones necesarias del español, pero intento hacerlo por programa, como comente, con morphing entre ondas, que espero cumpla esa funcion.
Hace un par de años hice un sintetizador (teorico tambien porque no lo implemente en ningun PIC) con voz completamente digitalizada, y los calculos me daban creo que casi 22K (bytes, no palabras) de audio de 15KHz que necesitaba para almacenarlo, no llegue a implementarlo en un PIC18 pero seria perfectamente posible, tengo el sonido ya renderizado en un archivo binario, pero ahi se quedo, hoy se podria incluso mejorar. No lo segui haciendo por una cuestion practica, si lo unico que se hace es almacenar audio, es muy facil copiarlo, ya que podrian emitir todos los fonemas e implementar un programa simple que los reprodujera desde memoria de programa. Ya que yo estaria usando un PIC grande con memoria de sobra para almacenar ese audio, les estaria dando ventaja al poner requerimientos elevados. Al final decidi que era mejor hacer lo mas posible por programa, para que aunque se pudiera copiar, no se lo pudiera implementar facilmente con los mismos recursos minimos.
Si el mundo fuera ideal, o si fuera un programa de investigacion donde no importara que me roben el trabajo de años, los resultados habrian sido mucho mejores, pero hay que buscar un punto medio donde pueda conservar el control del proyecto y a la vez se consigan los mejores resultados y el menor costo posibles.
En cuanto al programa, se usa un motor de sonido que es basicamente un secuenciador de ondas, hay dos buffers, uno es la lista de reproduccion interna, con codigos tambien internos, el motor lee un elemento, llama a una rutina que le devuelve las propiedades, como cantidad de muestras, cantidad estandar de repeticiones (ciclos de duracion), y refresca algunos otros parametros como el tono de voz. Eso se hace cada vez que se empieza a reproducir un elemento de la lista de reproduccion, luego mientras dure ese fonema, por cada muestra se llama a una tabla de saltos que llama a la rutina correspondiente que devuelve el valor actual de la muestra (segun el numero de muestra y el numero de fonema actuales). Al estar todo hecho con tablas de saltos, algunos fonemas estan implementados de forma directa, y la rutina se limita a obtener la siguiente muestra de una tabla de valores, pero otros fonemas estan implementados como codigo o mezcla de codigo y tablas. El escalado de nota y tono de voz es totalmente transparente al motor de sonido, ya que se hace dentro de cada rutina, el motor de sonido siempre cree que reproduce la misma cantidad de muestras. Esto hace el programa bastante complejo de seguir, pero muy flexible porque se puede eliminar o modificar el escalado de frecuencia sin afectar a lo demas.
Paralelamente a esto, esta la recepcion RS232, apenas se recibe algo valido se agrega a un buffer de recepcion, y se envia de forma inmediata el eco por RS232. Luego se llama al parser, que analiza los comandos en ASCII y si encuentra que se completo un comando (pueden tener hasta 3 caracteres) se lo convierte a un codigo interno y se agrega a la lista de reproduccion, si no se completo un comando se retorna de la interrupcion y se espera a la proxima muestra, si el comando no es valido se descarta y se retorna. Si se llena el buffer de RS232, se activa la linea CTS para indicar que no se pueden recibir mas datos. Ese buffer es una cola implementada como lista "circular" (del mismo modo que la lista de reproduccion), donde se continua almacenando en el primer lugar de la lista si se llego al ultimo, siempre que este libre, por supuesto.
Todo eso que comente sucede en una interrupcion de PWM, es decir que ocurre 8600 veces por segundo, de programa principal (fuera de la interrupcion) no hay nada mas que un bucle que no hace nada. En aplicaciones de alarma donde use el motor de sonido, en el programa principal esta el codigo de la alarma, y existian funciones "puente" que servian para interactuar con el motor de sonido, por ejemplo para agregar un elemento a la lista de reproduccion, detener la reproduccion de sonido, volver a comenzar, vaciar la lista, etc., comunicandose con el motor a traves de banderas. Para el programa principal todo funciona como si hubiera algo que magicamente emite el sonido en paralelo. En ese tipo de aplicaciones donde el vocabulario es mas bien fijo, se puede eliminar el parser, y por supuesto las rutinas de RS232, lo que no se puede hacer es temporizar por codigo, hay que usar los timers para todo, ya que el programa es interrumpido continuamente por el motor de sonido.
Como prueba de concepto, va adjunto un mp3 armado con los sonidos del sintetizador de audio digitalizado, renderizado a 16KHz y 8 bits, es una prueba muy vieja, de junio de 2011, estaba dos versiones atras y no conocia tanto de como habia que utilizar la entonacion de los fonemas (acentos por decirlo mas facilmente) para que sonara mas natural. Eso deberia sonar tal cual en un PIC con memoria suficiente, pero hoy se podria rehacer con sonidos mejorados. Mi meta es armar un modelo de la voz digitalizada por programa para poder reconstruirla lo mas parecida posible, por eso no segui por ese otro camino, que incluso ni necesita un PIC, porque bien se podrian haber grabado los fonemas en un ISD o similar, o en una memoria flash. Por cierto, por si no se entiende, el audio dice "commodore 64", o en el lenguaje del PIC: KO+MODOR SESE+NTAIKUA+TRO.
« Última modificación: Marzo 23, 2013, 05:17:29 am por pastbytes »

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Sintetizador de voz en español por RS232
« Respuesta #43 en: Marzo 23, 2013, 09:59:42 am »
alguno se puso a pensar LO DIFICIL Y COMPLICADO que es realizar esta tarea con el hardware que esta utilizando? Con una computadora, soft y hard apropiado hacemos que hable loquendo directamente, con distintas voces y todo, pero el tema pasa por el hecho de que pastbytes lo esta haciendo todo con un microcontrolador de microchip de los pequeños, con memoria ram muy limitada, que trabaja con 8 bits, sin placa de sonido, etc. La verdad es un laburazo de la puta madre y si bien a fines practicos no tenga una aplicacion en si mismo es un tremendo PoF (proof of concepts) que enriquece muchisimo a la persona y le da mas herramientas a la hora del manejo de microcontroladores, mas aun, tiene la amabilidad de compartir con nosotros tanto tiempo de desarrollo y aprendizaje.

+1

Exactamente eso es lo que le comenté cuando hace más o menos un año conocí el proyecto. Si no lo hubiese escuchado, hubiese creido que no era posible o que me estaban jodiendo. ¡Es un laburazo!


En mi opinion tener que usar una PC o celular para emitir voz en un proyecto simple es una bestialidad, esta perfecto si la aplicacion misma requiere el uso de una PC, pero en ese caso ya hay herramientas de todo tipo, lo mio apunta a lo portable, al bajo consumo de bateria, y a la integracion en otros proyectos sin incrementar significativamente el costo. Con lo que estoy compitiendo, y por ahora no muy favorablemente, es con los chips del tipo ISD o similares, pero dependiendo de la aplicacion este chip es mas conveniente, si el audio hablado puede variar lo suficiente como para que complique tenerlo fijo.

Eso, eso!!!!! Eso es lo que hace casi único a tu proyecto. (Y digo casi por que no he visto algo parecido en PIC, pero quizas lo haya. ;) )


Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

pastbytes

  • PIC12F
  • **
  • Mensajes: 170
Re: Sintetizador de voz en español por RS232
« Respuesta #44 en: Marzo 23, 2013, 11:13:06 am »
Hay cosas parecidas, como el SpeakJet, que es en ingles y cuesta USD 25:  http://www.speakjet.com/
Creo que ese esta implementado en un PIC18, en el sitio salen sonidos de demostracion, no solo hace voz sino tambien algunos efectos de sonido. Y ahora no me acuerdo pero hay uno mas de precio y prestaciones similares, creo que tambien hecho en un PIC18.
No busque ultimamente, pero cada tanto miraba que habia en español, y lo mas barato que encontre es un modulo de voz natural en ingles y español que estaba de 150 dolares para arriba.

 

anything