*** Version HD1 alfa 5 *** A pesar de que casi no tuve tiempo para dedicarle al proyecto, tuve un par de dias, separados entre si, en los que primero tuve un gran fracaso, y luego un gran exito. En el resultado final, lo unico que se nota es que ahora el sintetizador no pierde la potencia de la voz cuando se usan notas mas bajas, que son las que mas naturalmente suenan. Con estas mejoras, me parece que el sintetizador de voz quedaria en un estado casi final, faltando nada mas arreglar los problemas del sintetizador musical, y agregar algunas funciones de compatibilidad con el HR4.
Atencion: El que no quiera que le explote la cabeza con una historia completa del desarrollo, necesaria para entender lo que cambia en la ultima version, huya ya mismo, contento con saber que hay un avance mas. Al que le interese un poco de los avances que fui logrando en las diferentes versiones y como todo cierra al final, quiera saber como funciona internamente el cambio de tono y nota de la voz, o simplemente esta aburrido y se aburre menos leyendo textos interminables (???), continue con la historia abajo.
Version larga de la historia: Hace unos años, cuando estaba haciendo el sintetizador HR2, vi que necesitaba cambiar el tono de la voz para poder acentuar las silabas y expresar por ejemplo interrogacion. Ya en el HR1, quien sabe por que, se me ocurrio ajustar la voz a la nota musical mas cercana, algo que no tenia mucho sentido ya que era un sintetizador de un solo tono. Sin embargo, esta decision influencio a todas las versiones posteriores, ya que todos los parametros de tono de voz se ajustan en semitonos. Esto tambien hizo que las mejoras se compararan tambien en terminos musicales, como por ejemplo el rango de la voz en octavas, en lugar de usar porcentaje de frecuencia o algun otro tipo de medicion. Y por supuesto, tambien inicio una carrera paralela para tratar de que el sintetizador cantara mejor, como un medio para lograr una mayor naturalidad en la voz.
Como prueba del rango de notas de la voz, use el himno nacional argentino, por una razon de evitar problemas de copyrights en youtube, y ahi vi que alcanza con una octava para cantar la mayoria de las cosas.
Cuando empece lo que ahora es el sintetizador HD1, dije que solo se iba a poder cambiar el tono (tipo) de la voz, pero no la nota, porque a pesar de tener sonido de mejor calidad y naturalidad, al basarse mas en sonido digitalizado se limita el proceso que se le puede aplicar a las ondas para cambiarles la nota. Sin embargo, y teniendo en cuenta que con un rango de una octava alcanza para la mayoria de las cosas, decidi incorporarle el algoritmo de cambio de nota utilizado en las primeras versiones del sintetizador HR2, y eso, con mucho mas de tecnica y calidad que entonces, es lo que estaba usando el HD1 hasta la version alfa 4.
A ver si puedo explicar la evolucion de los algoritmos sin entrar en detalles muy tecnicos. Como dije antes, el sintetizador HR1 tenia un solo tono de voz, en el HR2, por una necesidad de incorporar una minima expresividad a la voz (para hacer acentos) se empieza a probar algoritmos de cambio de nota a las ondas. Inicialmente se probo con un algoritmo muy simple, que consiste en agregar silencio a un ciclo de la onda, de forma tal que el tono de la voz es el mismo (suena como la misma persona), pero la nota a la que sale la voz es menor cuanto mas silencio se agregue.
Cuales son las limitaciones de este metodo? La primera es que solo se puede bajar la nota de la voz, no subir, porque esto requeriria que la onda fuera mas corta que la original, y la segunda es que a medida que se baja la nota hay mayor porcentaje de silencio por ciclo, llegando al punto en que al bajar una octava, cada ciclo de la onda tiene una mitad de sonido y la otra de silencio, provocando que el volumen caiga a la mitad. Si bien esto ultimo suena bien para voces roboticas, hace que la voz se entienda un poco menos. La primera limitacion tambien implica que las ondas de la voz tienen que estar capturadas a la maxima nota que queremos emitir, ya que solo se puede bajar la nota de la voz.
Vistas las limitaciones de este metodo, desarrolle otro mas estandar, basado en "deslizarse" por la onda, es decir reproduciendola a mayor o menor velocidad para cambiar de nota. Esto resulto mucho mejor, pero despues de meses de prueba y varias confirmaciones con los años, vi que por lo general al cantar la voz se mantiene con el mismo tono, y solo cambia la nota. Con el metodo de variar la velocidad de reproduccion, se cambia exitosamente la nota, pero tambien cambian las componentes de la voz, por lo que solo sirve en rangos muy chicos, como +-3 semitonos, porque al variar en una octava o incluso menos, ya suena como una persona distinta. En definitiva, este metodo permitia cambiar la nota sin perder volumen, pero no servia para cantar porque parecia que iba cambiando de persona. Y el primer metodo servia para cantar porque se reconocia siempre la misma voz, pero tenia un rango muy limitado si no queriamos perder volumen.
Como se podia resolver esto? Comenzando un nuevo sintetizador, el HR3, que intentaria combinar estos metodos para tener lo mejor de los dos. Y como me fue con el HR3? Fue un rotundo fracaso, tanto que lo abandone para empezar un metodo nuevo en el HR4. Lo que intentaba hacer el HR3 era variar la velocidad de reproduccion para cambiar el tipo de la voz, y una vez elegido eso, usar el metodo de agregar silencio a los ciclos de las ondas para bajar la nota de la voz. Eso se logro. Quedaban para resolver dos cosas, la primera era lograr emitir notas mas altas que la de la onda original, acortandola como fuera necesario para mantener el tipo de voz pero a la vez lograr una nota mayor, y la otra era encontrar una solucion a la perdida de volumen al bajar la nota. El primer problema se resolvio, pero ya que las ondas se cortaban sin ningun tipo de suavizado, esto podia generar bastante distorsion. El segundo problema tuvo algunos ensayos que aumentaron la complejidad del programa al punto tal que al final quedo sin terminar.
Buscandole solucion a estos problemas, vino a mi mente una idea inspirada en los primeros metodos de sintesis de voz que use en Commodore 64, donde generaba la voz usando formantes y una envolvente, para resumirlo, por cada vocal generaba dos ondas triangulares con las frecuencias correspondientes al fonema, y luego se le aplicaba una envolvente, que determinaba la nota de la voz. Y si pudiera recomponer el sonido original antes de la "envolvente" que le aplica la boca para lograr la voz que escuchamos? Si pudiera hacer eso, podria rellenar el silencio continuando la onda original. Cuando capturamos la voz con un microfono, lo que se ve es un sonido complejo modulado en volumen por una envolvente similar a una triangular, que determina la nota sin cambiar el tipo de voz. Si tengo esas ondas originales, reconstruyendo lo que sigue cuando el volumen baja a cero, podria emitir ese sonido y luego aplicarle yo la envolvente de la frecuencia que quiera, sin que quede silencio entre cada ciclo. Basicamente eso es lo que hacen los sintetizadores HR4 y HR5, utilizan ondas base, en parte originales, un poco inventadas, un poco imaginadas, a las que se les aplica una envolvente despues para obtener una onda parecida a la que uno capturaria de una voz real.
Claramente, gran parte del trabajo de los HR estaba en las ondas, el resto se lograba acelerando o retrasando la velocidad de las ondas base y la envolvente, para poder variar de forma independiente tanto tipo como nota de la voz. Estos sintetizadores podrian ser los mejores, si tan solo tuvieran las ondas adecuadas, que no puedo capturar, y aunque hacen un trabajo bastante bueno, no pueden competir con la claridad de un sintetizador con voz digitalizada como el HD1.
En cierto punto del desarrollo del HR4, tuve curiosidad de saber si la limitada inteligibilidad de la voz tenia que ver con la calidad de la frecuencia de muestreo del sonido y de la cantidad de muestras de las ondas, lo que me llevo a desarrollar dos proyectos, por un lado una simulacion del sintetizador por soft, con ondas calculadas para 44KHz y 16 bits de resolucion, implementado en C para Linux, y por otro lo que termino siendo el sintetizador HR5, que usa para las ondas 119 muestras en lugar de 66, y 15625 Hz de muestreo para el audio en lugar de 8680 Hz. Despues de muchas pruebas, la conclusion fue que si bien mejoraba con mas muestras y mejor calidad de sonido, la mejora no justificaba la diferencia drastica de recursos, teniendo en cuenta que 15625 Hz es mas de lo necesario para representar bien la voz. Estos resultados decepcionantes hicieron que el HR5 tuviera un progreso muy lento, ya que estaba condenado a ser solo una mejora leve del HR4, sin una gran diferencia en cuanto a inteligibilidad.
Y asi llegamos hasta el HD1, donde decidi basarme en un sintetizador que nunca implemente, basado enteramente en fonemas digitalizados. Este sintetizador iba a ser totalmente diferente de los otros, ya que los fonemas tendrian duracion fija, y tendria un proceso de aceleracion/desaceleracion para realizar los cambios de nota, limitados solo a los acentos, por lo que solamente se necesitaba generar 3 notas. Sin embargo, estas eran las expectativas cuando diseñe ese sintetizador hace años, pero mis desarrollos desde entonces me daban instantaneamente dos posibilidades que no tenia originalmente: la duracion de los fonemas ya no tendria que ser fija, y el tipo de la voz podria variar. En eso me apoyaba cuando dije que solo se podria cambiar el tipo de voz y no la nota.
Como dije al principio, decidi usar el primer metodo de cambio de nota usado en el HR2, agregando silencio para bajar la nota, y luego el metodo del HR3, cortando la onda para lograr notas mayores. Es decir que de a poco estaba reintentando lo que no pude resolver en el sintetizador HR3, pero esta vez con mas recursos tecnicos que antes. En el HR3 habian quedado dos problemas pendientes, el primero era el corte abrupto de las ondas que generaba distorsion, eso se resolvio facilmente agregando un algoritmo de suavizado, el segundo era el problema de "rellenar" el silencio cuando se bajaba la nota de la voz. Esto ultimo es lo que quedo resuelto en la version alfa 5, aplicando una de las tantas pruebas de algoritmos que intente en el HR3 y que con menos experiencia no pude resolver en ese momento.
Que se logra con este ultimo cambio? Que un sintetizador basado en sonido digitalizado pueda alcanzar facilmente un rango de 2 octavas hacia abajo, cuando antes apenas alcanzaba una y con perdida de calidad.
Lo curioso de esto es que esta iba a ser una version reducida del sintetizador basado en sonido digitalizado, ya que solo tiene 8 fonemas digitalizados y el resto es sintetizado, no esperaba que tuviera la calidad que tiene ni que los fonemas sintetizados en algunos casos funcionaran mejor que sus versiones digitalizadas (ironicamente, lo sintetico anda mejor que lo real). Hice una prueba con una captura de voz del HD1, reemplazando en un programa de audio algunos fonemas sintetizados por los que iba a usar en el futuro sintetizador digitalizado, y comprobe que los fonemas sinteticos en muchos casos suenan mas claros que los reales.
Otra cosa interesante es que al resolver en el HD1 los problemas del HR3, se pueden aplicar los progresos retroactivamente a los sintetizadores anteriores, ya que los HR2 y HR3 pueden verse como versiones limitadas del HD1, porque sus motores de sintesis de voz tienen mas en comun con el HD1 que con los HR4 y HR5. Lo que implica esto, es que ahora podria tener los sintetizadores HR4 y HR5 con ondas basadas en las del HD1, y los algoritmos ahora resueltos del HR3, lo que seguramente le daria mayor calidad que el motor de sintesis actual de los HR, aun cuando solo usarian un 15% de los sonidos del HD1. Tal vez haga la prueba solo por curiosidad, pero no creo que eso llegue a distribuirse, probablemente haga clones llamados HR6 y HR7 y solo me limite a probar como suenan, para luego archivarlos.
Y a que me referia al principio con lo de un gran fracaso, antes de un gran exito?
Resulta que en un momento, frustrado por la perdida de volumen en las notas bajas, y en un impulso de esos radicales que me hacen empezar una nueva version de sintetizador, decidi rehacer las ondas del sintetizador HR5, utilizando esta vez metodos mas cientificos que los que utilice en su momento. Lo primero que hice fue tratar de deducir la forma de la envolvente que define la nota de la voz, para esto capture mi voz e intente emitir varias notas para comparar los cambios, esto me confirmo dos cosas: que la teoria sobre la que se basan los HR4 y HR5 es correcta, la voz se comporta exactamente como pensaba, y la segunda, que si fuera cantante me moriria de hambre, porque de 5 o 6 "notas" (lo digo asi porque no deben estar ni cerca de notas reales) supuestamente diferentes, habia solo 2 o 3 frecuencias distintas.
Una vez verificado que la onda base (lo que suena dentro de la envolvente) se mantiene casi igual en distintas notas, me puse a observar varias grabaciones que hice, tratando de deducir una forma de envolvente mas aproximada a la realidad que la simple onda triangular que usaba. Comparando varias notas y distintas vocales, obtuve una onda modelo, que luego diseñe en GoldWave usando la generacion de ondas a partir de funciones. En lugar de usar simples pendientes, queria algo hecho con partes de ondas senoidales, pero al complicarse el calculo y no tener paciencia para investigarlo mejor, decidi usar lineas y luego aplicar filtros para darle el suavizado requerido.
Una vez lograda la envolvente buscada, el siguiente paso fue hacer un programa en lenguaje C (lo que tenia a mano en ese momento) para aplicar una envolvente inversa a las ondas (desenvolverlas?), de forma de lograr algo cercano a las ondas originales, para que luego al aplicarles la envolvente se obtuviera algo cercano a lo real. Lo del programa en C se termino abruptamente cuando se me ocurrio que el propio GoldWave permite hacer funciones entre las muestras de distintas ondas cargadas, por lo que luego de un rato de experimentar pude hacer lo que pretendia. El trabajo resulto ser mas complicado de lo que parecia, ya que no era tan sistematico como pense en un principio, porque para aplicar siempre la misma envolvente habia primero que normalizar las ondas, aplicandole filtros y otros ajustes, que luego requerian retoques manuales. En definitiva, que estuve horas para lograr hacer solo el fonema A, o mas bien 1/6 del fonema, pero justo lo necesario para el HR5, y el resultado fue decepcionante. Si bien sonaba perfecto y casi no tenia diferencia cuando se aplicaba la envolvente a la nota original de la onda, al aplicarle una envolvente con nota distinta no respondia como debia, sonando a veces en una frecuencia distinta, y otras agregando distorsion. No me puse a investigar demasiado la razon, la respuesta era simple: las ondas no mejoraban lo que ya habia en el HR5, y el trabajo que requerian hacian que tuviera que dedicarle un dia a rehacer cada fonema, por lo que tenia mas de una semana de trabajo intensivo por delante.
La conclusion, como dije al principio, es que la idea fue un gran fracaso.
Sin embargo, al recomponer las ondas originales, me fui dando cuenta de la forma que tenian, cosa que no habia visto en detalle hasta entonces, porque antes no habia visto patrones que ahora se veian claramente, y eso me quedo en la mente hasta un par de dias despues, cuando recorde los intentos hechos en el HR3, y de pronto estaba probando varios metodos en GoldWave, simulando lo que haria el sintetizador, hasta que di con el adecuado. Y ahi quedo eliminada la ultima limitacion del HD1.
Si alguien llego hasta aca, espero que haya aprendido algo, del desarrollo de estos proyectos, no de teoria de sintesis de voz, porque la mayoria de lo que se al respecto lo se por pura observacion, y me doy cuenta con los años de cuanto esfuerzo desperdicie por no saber, o de que tan acertado o errado estuve en el pasado con las cosas que hacia. Lo positivo de estos dias, mas alla de haber completado los algoritmos que me faltaban en el HD1, es que al final el HR3, que hasta ahora era un experimento fallido, ahora tiene su lugar en la historia, aunque sea en la pequeña historia de mis desarrollos. Y el punto de vista negativo, es que visto desde ahora, si hubiera dedicado mas tiempo a hacer andar el HR3, tal vez no habrian existido los HR4 y HR5, y habria llegado al estado actual mucho antes.
Pero tal como paso con el HR3, probablemente el dia que encuentre las ondas perfectas, los HR4 y HR5 pasen de nuevo al frente.