023:software2

Microhobby 23. Año II, del 09 al 15 de abril de 1985

Oscar Domingo

Por fin, presentamos el programa íntegro en código máquina que podrá deleitarnos con la audición de las frases que es capaz de pronunciar nuestro Spectrum. Si conectas un amplificador a la clavija EAR, te verás gratamente sorprendido por el resultado.

En el artículo anterior vimos como se habían desarrollado los sonidos de las vocales y preparamos un programa BASIC que nos permitía modificar a nuestro gusto el sonido de las mismas.

Para desarrollar todos los sonidos consonantes, se siguió un proceso algo diferente y sensiblemente más lento, pues aunque los españoles tenemos la presunción de que el castellano se pronuncia igual que se escribe, cuando se estudia de cerca esto no es cierto del todo, y lo máximo que tendríamos que decir es que el castellano es de los idiomas que más asemeja lo escrito a lo hablado.

Con el programa de análisis de la voz (que ha sido publicado en la parte primera de esta serie) se analizaron, una a una, todas las consonantes, grabando primeramente muchas sílabas que contuvieran la consonante a estudiar y luego, con el programa analizador, se codificaban y escuchaban, probando a codificarlas a diferentes volúmenes de sonido hasta lograr que el sonido resultante se pareciera lo más posible a la grabación original.

Cuando se decidía que la codificación era inteligible, se estudiaban las gráficas de cada sílaba y se separaba el trozo que correspondía a la consontante en estudio; como era de esperar, cada gráfica de una misma consonante pronunciada en una sílaba distinta era diferente a las otras. Entonces, se volvían a montar las sílabas pero esta vez utilizando ya las vocales sintetizadas anteriormente (programa de vocales de la parte II) y cada una de las gráficas diferentes de la misma consonante que habíamos obtenido. De este análisis se seleccionaba la consonante que nos parecía sonar más natural y si no nos convencía ninguna, se volvía a empezar. (Seleccionar todos los sonidos consonantes nos llevó seis meses.)

Al ir realizando este análisis surgió otra contrariedad muy lógica cuando se ven las cosas «a posteriori»: los silencios. Así por ejemplo la letra «P» y la letra «B», que fonéticamente son muy dispares, resultaban tener unas gráficas casi idénticas, mucho más idénticas que algunas consonantes consigo mismas. La diferencia estribaba en el silencio previo: Antes de pronunciar una «P» hacemos un ligero silencio de algunos milisegundos, y, cuando pronunciamos la «B», no lo hacemos. Hicimos algunas pruebas y resultaron un éxito, bastaba un ligero silencio casi imperceptible (50000 tiempos de cpu) para que una «B» se convirtiera en una «P». Se preguntarán ahora, si la diferencia es un silencio previo, qué diferencia hay entonces entre una palabra que empieza con «B» a otra que empieza con «P». Nosotros nos hicimos la misma pregunta y tuvimos que aceptar que al principio de palabra no hubiera diferencia entre las dos consonantes.

Como curiosidad, decir en voz alta y enérgicamente «Padre», y luego, de la misma manera, decir «Badre», a continuación buscar la diferencia.

Las consonantes específicas del castellano nos depararon sorpresas curiosas; así, la «LL» daba una gráfica muy parecida a la sílaba «Li», pero con la duración de la vocal mucho más corta. Para resolver el problema se dispuso que la «y» sería una letra que sonaría igual que la «i», pero con una duración mucho menor, de esta manera se resolvían varios problemas: la «LL» se reproducía de una forma aceptable con el grupo «Ly» y, además, una «i» más corta se utiliza en muchas palabras, como «piedra» o como «fiesta», sustituyendo la »i» por la «y».

El resultado de todo este largo proceso fue el programa sintetizador de voz que suponemos todos ya conocéis porque se ha publicado en el primer «Microhobby cassette». Al programa original se le añadió una rutina que busca la variable v$ y mide su longitud, así se puede utilizar con mucha más comodidad desde el BASIC, pues basta asignar a la variable v$ la frase que queremos que pronuncie el sintetizador y llamar al programa mediante la llamada estándar a C/M: RANDOMIZE USR 63000. El programa sólo utiliza la memoria posterior a la dirección 63000, por lo que se puede añadir tranquilamente a cualquier programa BASIC hecho por nosotros mismos.

Para aquellas personas que quieran utilizar el programa sintetizador de voz desde dentro de un programa en código máquina, damos a continuación el listado de una versión del mismo que lo permite, pues en vez de colocar la frase asignada a una variable alfanumérica, deben colocarse los códigos ASCII a partir de la dirección 60000. Para su utilización, se debe de tener en cuenta que el programa leerá todos los códigos ASCII a partir de la posición de memoria 60000 y sólo parará al encontrar un código que no se corresponda con una letra pronunciable.

La dirección de comienzo de los códigos ASCII es cambiable a voluntad con la información que hay al final, pero la rutina en C/M no es relocatable y, por tanto, no puede cambiarse de lugar.

Direcciones interesantes de la rutina sintetizador de voz que viene listada al final del artículo. (No coinciden con las mismas de Microhobby cassette.)

63157, 63158 Dirección de memoria que contiene la información de la dirección donde empieza el texto. En origen, viene con la dirección 60000.

63153 Esta es el comienzo verdadero de la rutina.

63227, 63228 En esta dirección se guarda la duración de un silencio.

Cada letra tiene asignada una base de datos. Estos datos se han codificado de una forma algo inusual para conseguir que el espacio de memoria ocupado fuera el mínimo.

La información de cada letra comienza por un byte que indica las veces que se repite el ciclo codificado. A continuación, hay otro byte que indica cuantos bytes tiene de largo la codificación de la letra dividido por dos y después vienen los bytes de código. La dirección de principio de cada letra es:

Tabla de datos de letras
J 63049 * M 63781
A 63288 * K 63832
O 63305 V 63913
S 63314 * D 64049
E 63427 * Z 64138 *
I 63452 * Y 64335 *
U 63469 * X 64352
P 63476 C 64138 *
B 63543 H 64352
W 63580 O 63832
R 63589 T 64723
N 63634 * F 64856 *
L 65037 G 65148 *

Las letras que van acompañadas de un «*» tienen un ciclo repetitivo y las que no lo llevan tienen un ciclo único

	CLEAR 59999
10 INPUT A$
20 FOR N = 1 TO LEN A$
30 POKE 59999 + N, CODE A$(N)
40 NEXT N
50 POKE 59999 + N,0
60 RANDOMIZE USR 63000
70 GOTO 10

Este programa coloca en memoria, a partir de la dirección 60000 de la misma, los códigos ASCII de la variable A$ y al final, coloca un código 0 para que el sintetizador de voz pare y retorne al BASIC.

Llegamos con esto al final de esta serie de tres artículos en los que se ha explicado el desarrollo de un programa de investigación restringido y que ha dado como resultado una rutina curiosa que, aprovechando las posibilidades sonoras del Spectrum, simula que éste habla como si estuviera dotado de un costoso sintetizador de voz.

Por otro lado, queremos divulgar todo el Soft que se ha utilizado en la experiencia, pues estamos convencidos de que el programa es muy mejorable y no queremos que nadie se reprima el deseo de hacerlo. Como idea, podría pensarse que si conseguimos que cada vocal suene en las diferentes notas de la escala, se podría conseguir, teóricamente, un programa que cante.

Errata publicada en el #025 concerniente a este artículo.

Un 0 indiscreto se nos infiltró entre las lineas 2180 y 9000 que, si bien no puede ser tecleado, si puede hacer perder el tiempo. Hay que borrarlo.

Esperamos sepáis perdonarnos.

  • 023/software2.txt
  • Última modificación: d/m/Y H:i
  • por miguel