MsxKun
|
|
« : 29 de Enero de 2012, 04:38:01 pm » |
|
Buenas! En mis busquedas por ahi en las interwebs he encontrado esto: http://www.pastbytes.com/apps/tav/Es un sintetizador de voz multiplataforma creado por un usuario argentino, Jorge Castillo. Entre las versiones, esta la de MSX (TAVMSX), la cual usa el PSG para reproducir voz en castellano (si bien, un poco argentinizado, esas LL que son SH... y tal) que suena bastante bien y puede ser usado desde BASIC. Incluso canta! El programa aun es beta, ya que su creador tiene problemas para testearlo en MSX real pues su Talent MSX no va muy fina. Asi que me he ofrecido a echar una mano y testear lo que haga falta en MSX reales. Efectivamente, en mi Sony HB-20P el programa casca tras un rato. Me ha dicho que no ha visto mucho interes de la gente, asi que me he ofrecido a dar un toque en los foros de por aqui, para que os animeis a probarlo y, el que pueda, testear y echar una mano, si hace falta. A ver si esa beta se convierte en una version 1.0 totalmente funcional Ahi queda!
|
|
|
En línea
|
-- She Bops!
|
|
|
aorante
|
|
« Respuesta #1 : 30 de Enero de 2012, 12:53:53 pm » |
|
Esta muy interesante! es muy bueno encontrar proyectos de este tipo! Yo tengo los fuentes en c de una reverse-engineering del Software Automatic Mouth (SAM), para PC. Mi intención es la de intentar adaptarlo para MSX, pero ahora estoy liado con otros temas y lo tengo aparcado. Intentare buscarlos por si alguien le quiere echar un tiento.. De todas formas el de Jorge, tiene una ventaja frente al SAM, y es que es muy compacto (4k?) y seria útil para usarlo en juegos, como aventuras conversacionales... Saludos!
|
|
|
En línea
|
|
|
|
MsxKun
|
|
« Respuesta #2 : 30 de Enero de 2012, 01:04:43 pm » |
|
El SAM de PC lo tengo por ahi, ni lo he probado... no tiene gracia sintetizar voz en un PC Hay multitples Text to Speech para eso... Asi que para algun voz en los temas de Destroy the Core! usaba el SAM. Pero ahora usare el MSX
|
|
|
En línea
|
-- She Bops!
|
|
|
MsxKun
|
|
« Respuesta #3 : 14 de Febrero de 2012, 11:03:41 am » |
|
Por cierto, hace unos dias, el creador del software me dijo que se habia registrado aqui en el foro, pero aun no habia recibido el alta. Esta solucionado?
Saludos.
|
|
|
En línea
|
-- She Bops!
|
|
|
pitpan
|
|
« Respuesta #4 : 14 de Febrero de 2012, 11:41:31 am » |
|
Pues lo suyo sería que me enviase un e-mail o algo... Hay demasiado spam como para poder identificarlo entre los centenares de usuarios "falsos" que se apuntan cada día. O dame tú su nick y trataré de activarlo directamente. Siento las molestias, pero es que es todo un festival.
|
|
|
En línea
|
|
|
|
MsxKun
|
|
« Respuesta #5 : 15 de Febrero de 2012, 03:03:31 pm » |
|
Pues lo suyo sería que me enviase un e-mail o algo... Hay demasiado spam como para poder identificarlo entre los centenares de usuarios "falsos" que se apuntan cada día. O dame tú su nick y trataré de activarlo directamente. Siento las molestias, pero es que es todo un festival.
Su nick es pastbytes. Saludos.
|
|
|
En línea
|
-- She Bops!
|
|
|
pitpan
|
|
« Respuesta #6 : 15 de Febrero de 2012, 05:45:38 pm » |
|
Cuenta activada. Perdón por las molestias.
|
|
|
En línea
|
|
|
|
pastbytes
|
|
« Respuesta #7 : 16 de Febrero de 2012, 03:14:52 am » |
|
Gracias, por fin pude acceder, saludos a todos. Hace unos meses comence la conversion del programa a C64, que es el origen de la version para Z80, la primera conversion para ese procesador iba a ser para MSX, pero como no conocia del todo bien la arquitectura, y casi nada del procesador Z80, mas alla de la informacion basica, resulto mas facil hacer una conversion para Spectrum, TS2068 y ZX81. TAVMSX es una modificacion de la version para Spectrum 128K, que usa el PSG, los primeros intentos estaban diseñados para correr bajo MSX-DOS, aunque en ese momento no tuve en cuenta que tenia que llamar a la BIOS en otro slot, por lo cual no funciono. Entonces, como aun estaba aprendiendo sobre el sistema, opte por lo seguro y adapte el programa para ser llamado desde el BASIC. Por el momento tengo mi MSX1 archivado por falta de espacio asi que las pruebas las hice en el BlueMSX, donde funciona como deberia. MsxKun me ha dicho que hay un par de modelos, de MSX2 creo, donde corre bien, y hablamos de hacer unas pruebas para ir descartando si son las llamadas a BIOS o el acceso al VDP los que provocan que deje de funcionar al tiempo. Por ahora estoy un poco ocupado con un trabajo por lo que no pude reformar el programa, pero el codigo no hace mas que imprimir algun texto y cambiar los colores de texto y fondo en el VDP, todo eso usando llamadas a la BIOS, mientras que el PSG se accede de forma directa. Probablemente el problema solo sea algun detalle que me haya olvidado de inicializar. Cuando estaba haciendo la version para ZX81 vi que hay unos cuantos usuarios que usan interfases de sonido que incorporan un PSG, por lo cual decidi hacer una version para aprovecharlo. De un foro de ZX81 salio la idea de soportar ingles, pero al no conocer suficiente del ingles hablado como para hacer este tipo de programas, empece a basarme en los sonidos del SP0256-AL2, que no parece ser complicado de simular. Este proyecto esta como en un 10%, va a llevar bastante tiempo sintetizar todos esos sonidos, y el tamaño del programa se incrementaria ya que son muchos mas sonidos. El programa actual ocupa casi 4K solamente en Commodore 64, incluida la interfaz de usuario, algo que en las otras plataformas se deja a un programa BASIC. Las versiones para Z80 andan todas cerca de los 5K, el codigo Z80 es mas largo, supongo que un poco por el Z80 mismo y otro poco por mi poca experiencia con ese procesador, tambien el codigo para colocar una muestra de sonido de 4 bits en el PSG es mas largo que en C64, donde solo se utiliza una instruccion. Hace poco actualice mi sitio agregando una demo del sintetizador cantante en desarrollo, junto con un video corriendo en C64, esto no es mas que un experimento para probar el codigo con algun tema y saber como suena. Esa misma demo sigue siendo portable a MSX o Sinclair, tiene que sonar exactamente igual salvo por algun sonido que difiere ligeramente entre 6502 y Z80, pero no tiene mucho sentido convertirla a otra plataforma, mas aun si la beta no esta funcionando correctamente. La diferencia de sonido entre las versiones 6502 y Z80 tiene que ver con que en un afan de comprimir los sonidos todo lo posible, use el propio codigo 6502 o Z80 como tablas de ondas para generar ruido, pero esto afecta a un par de fonemas nada mas, en el resto el sonido tiene que ser exactamente el mismo, con la excepcion de que en Z80 las tablas de ondas tienen mas muestras por generar el sonido a una frecuencia de muestreo mayor.
|
|
« Última modificación: 16 de Febrero de 2012, 04:53:50 am por pastbytes »
|
En línea
|
|
|
|
MsxKun
|
|
« Respuesta #8 : 16 de Febrero de 2012, 10:21:02 am » |
|
Bienvenido [quote author=pastbytes link=topic=2248.msg27573#msg27573 date=1329MsxKun me ha dicho que hay un par de modelos, de MSX2 creo, donde corre bien, y hablamos de hacer unas pruebas para ir descartando si son las llamadas a BIOS o el acceso al VDP los que provocan que deje de funcionar al tiempo. [/quote] En un MSX2 y en un TurboR va bien, y sospecho que de MSX2 para arriba ira bien en cualquier lado. En MSX1, en los dos modelos que he probado, falla. Eso y la manera que tiene de quedarse la pantalla en blanco es lo que me hace sospechar que sea algo del VDP.... Alguien tiene alguna otra sugerencia?
|
|
|
En línea
|
-- She Bops!
|
|
|
Mortimer
|
|
« Respuesta #9 : 16 de Febrero de 2012, 03:10:21 pm » |
|
Pues he estado echando un vistazo al código, y todos los cambios de color de borde (Y son muchos) se hacen con las interrupciones habilitadas, también se hacen sin apenas retardos: LD A,color OUT 99h,A LA A,87h OUT 99h,A Pero no recuerdo ahora si también hay que esperar entre este tipo de comandos o sólo para escribir a vram... Así que para empezar se podría probar a poner su EI y su DI y algún NOP y ver si mejora la cosa! PD: Probar como suena con esto: JAMONJAMONJAMONJAMONJAMONJAMONJAMONJAMONJAMON
|
|
« Última modificación: 16 de Febrero de 2012, 03:12:06 pm por Mortimer »
|
En línea
|
|
|
|
pastbytes
|
|
« Respuesta #10 : 16 de Febrero de 2012, 10:19:48 pm » |
|
En realidad se deshabilitan las interrupciones al comenzar a emitir el sonido y se habilitan al terminar, pero se me debe haber escapado alguna llamada a la BIOS que tal vez las habilita en el medio. Con cada muestra emitida, alrededor de 9500 veces por segundo, lo primero que se hace es cargar un color de tinta y fondo en el VDP e inmediatamente escribirlos en el registro 7, sin pausa entre las dos escrituras al puerto $99. Podria dejar una de las instrucciones al comienzo y otra al final, despues del cambio de volumen de los 3 canales. El cambio de color de fondo se hace para reflejar el nivel de volumen de la muestra, con colores mas brillantes cuanto mas se aleje la muestra del medio, es decir que una muestra de valor 15 mostraria el color blanco, lo mismo que una muestra de valor 0. Es un detalle poco importante, si da problemas se lo elimino.
|
|
|
En línea
|
|
|
|
Mortimer
|
|
« Respuesta #11 : 17 de Febrero de 2012, 10:07:35 am » |
|
Entonces, además de ser quizás la causa de los fallos, tenerlas habilitadas estará afectando a la calidad el sonido ¿No? A mí me gusta mucho el efecto de las líneas, lo único para la versión definitiva hacerlas opcionales. (Probad: "SALUDOS PROFESOR FALKEN" )
|
|
|
En línea
|
|
|
|
pastbytes
|
|
« Respuesta #12 : 17 de Febrero de 2012, 11:54:44 am » |
|
Ahora que lo probe de nuevo, me parece que no suena del todo bien, eso parece confirmar que es un tema de interrupciones, voy a ver si me hago un momento en el fin de semana para hacer todos los chequeos que tengo pendientes. El programa deberia sonar igual que en C64, ya que emite sonido de 4 bits con volumen lineal, tal como se hace en la otra version, pero puede que el BlueMSX no tenga tan buena calidad de sonido y en un MSX real suene mejor. En C64 el sonido es muy claro, y para emitir sonido digital no tiene ventajas sobre el PSG, en C64 se pueden lograr frecuencias de muestreo mas altas porque requiere menos instrucciones, una de carga en el acumulador y otra de escritura en memoria, mientras que mi codigo en MSX usa 12 instrucciones para hacer lo mismo. Sin embargo, esto no cuenta como desventaja en este caso porque la frecuencia de muestreo en la version MSX es mayor, en C64 se podria alcanzar una frecuencia mayor de lo posible en MSX, aunque no tiene mucho sentido pasar de los 8KHz para la voz. Una opcion que tengo que implementar para que sea util y no un simple programa curioso, es que se le puedan definir teclas para capturar y retornar, esto es por ejemplo que al llamarlo con una frase se le indique que teclas pueden interrumpir la reproduccion, digamos que fueran las teclas de cursor, esto facilitaria que se pueda hacer un menu en BASIC donde al moverse a cada opcion se hable esa opcion, complementando asi lo impreso en pantalla. Pero esto deja de ser practico si por cada opcion hay que esperar al texto entero, lo ideal es que podamos avanzar en las opciones del menu y en cada una comience a hablar, pero no detenga el tiempo de respuesta del menu, simplemente se podria pasar rapidamente entre las opciones, empezando a hablar en todos los casos pero interrumpiendose inmediatamente al detectar las teclas indicadas, retornando al BASIC con la tecla recibida como parametro. El programa BASIC entonces llamaria al sintetizador y al retornar chequearia el valor retornado, si es 0 no haria nada, si es distinto sabria que es la tecla que interrumpio el sonido y la procesaria, en este caso al ser de cursor avanzaria a la opcion que corresponda o entraria a otro menu. Implementandolo de esta manera la voz seria bastante transparente y no habria que armar una interfaz especial para el sintetizador, simplemente se manejaria todo como siempre pero la voz complementaria lo existente, aunque incluso segun como se haga podria permitir el uso del programa sin pantalla. Por cierto, en el sitio del programa esta la tabla con los comandos disponibles, como las vocales acentuadas que se expresan como A+ E+ I+ O+ U+, son el mismo sonido pero con tono ligeramente mayor, lo mismo con -, suena con un tono menor y se usa para la ultima silaba de una oracion, para que suene un poco mas natural. En la pantalla cuando ejecuta la demostracion se pueden ver impresos los comandos de parte de lo que dice. Tambien se puede usar < para bajar el tono de lo que venga a continuacion, por defecto siempre se usa el tono mayor, que tambien se puede especificar con >, todo esto esta explicado en los manuales de las versiones Spectrum o C64. Ejemplo de acentuacion: E+ME E+SE E+KI-S Sin acentos el tono es siempre el mismo y por lo tanto la voz es mas robotica.
|
|
|
En línea
|
|
|
|
PAC
Karoshi Fan
Mensajes: 91
|
|
« Respuesta #13 : 17 de Febrero de 2012, 12:36:42 pm » |
|
Sólo una propuesta, aunque no sé si será posible implementarla ya que deduzco reproducir texto por el PSG consume bastantes recursos.
¿Sería posible ir indicando que sílaba o letra está leyendo el programa en cada momento en vez del cambiar el color de borde?
|
|
|
En línea
|
|
|
|
pastbytes
|
|
« Respuesta #14 : 17 de Febrero de 2012, 12:58:41 pm » |
|
Sólo una propuesta, aunque no sé si será posible implementarla ya que deduzco reproducir texto por el PSG consume bastantes recursos.
¿Sería posible ir indicando que sílaba o letra está leyendo el programa en cada momento en vez del cambiar el color de borde?
Como poder se podria, seria un poco complicado especificarlo, porque el programa habla con texto fonetico, no con palabras en castellano, ademas a veces difiere mucho lo que uno quiere imprimir y lo que se habla, por ejemplo se podria hablar E+ME E+SE E+KI-S e imprimir MSX. En la version C64 se hace eso de imprimir mientras se habla, en principio se utilizaba la ROM para imprimir cada letra, pero resulto que el retraso aunque pequeño era suficiente para que sonara mal, porque agregaba un espacio entre cada sonido. Esto lo solucione imprimiendo el texto en pantalla con el mismo color de fondo, y el programa simplemente va cambiando el color de lo que haya en la pantalla de texto para ir haciendo visible el texto ya impreso a medida que habla, pero esta solucion es posible en C64 por implicar nada mas que dos instrucciones por caracter, ya que se trata simplemente de un acceso a memoria. En MSX todo se hace indirectamente, asi que me parece que es mas rapido directamente colocar los caracteres accediendo al VDP, lo que implica que hay que especificar el texto en el codigo que use el VDP y no en ASCII, de lo contrario el programa tendria que hacer algun tipo de traduccion previa. Ademas de eso hay que decirle de alguna manera al programa lo que se va a imprimir y cuando, por ejemplo para que diga MSX se podria hacer algo asi: (M)E+ME (S)E+SE (X)E+KI-S, indicando entre parentesis lo que tiene que imprimir y no ser hablado. Se podria llegar a agregar a la siguiente version, pero tengo que mirar bien como hacerlo, ya que si uso rutinas de la ROM probablemente tenga el mismo problema que en C64, por eso lo ideal seria hacer mi propia rutina de impresion directa al VDP, que respete las coordenadas actuales de texto (como para que se las pueda definir previamente con LOCATE) y el color de tinta. No se si el VDP tiene acceso directo por coordenadas a la pantalla de texto, sino habra ademas que hacer algunos calculos para determinar la direccion en VRAM donde hay que colocar el caracter. Lo de cambiar el color del fondo en realidad no tiene sentido, es una opcion hecha para C64 y Spectrum, donde existe realmente el borde, cuando converti el programa a MSX me di cuenta que no existia el color de borde en la pantalla normal de texto, y que solo se puede tener un color de tinta en toda la pantalla. Estas limitaciones vuelven inutiles los trucos que use en las otras versiones, y en una aplicacion es molesto que vaya cambiando el fondo mientras se la esta usando.
|
|
« Última modificación: 17 de Febrero de 2012, 01:03:27 pm por pastbytes »
|
En línea
|
|
|
|
|