Software Automatic Mouth - Synthesizador de voz pequeño
Este es un puerto de Go del Gran Synthesizador de Sam Speech. Básicamente es una reescritura semiautomática de C para ir de lo que fue, a su vez, una reescritura semiautomática de la asamblea a C :). En consecuencia, esto no debe ser legible.
Repo original: https://github.com/vidarh/sam. Basado en este compromiso.
Como un desafío y solo por diversión.
SAM es un programa de texto a voz muy pequeño (TTS) escrito en C, que se ejecuta en las plataformas más populares. Es una adaptación a C del Specis Software SAM (Software Automatic Mouth) para el Commodore C64 publicado en el año 1982 por Don't Ask Software (ahora SoftVoice, Inc.). Incluye un convertidor de texto a fonema llamado recitador y una rutina de fonema a voz para la salida final. Es tan pequeño que también funcionará en computadoras integradas. En mi computadora, se necesitan menos de 39 kb (mucho más pequeño en dispositivos integrados, ya que la sobrecarga ejecutable no es necesaria) del espacio de disco y es un programa totalmente independiente. Para la salida inmediata, utiliza la biblioteca SDL, de lo contrario puede guardar archivos .WAV.
Se puede encontrar una versión en línea y ejecutables para Windows en el sitio web: http://simulationcorner.net/index.php?page=sam
Simplemente escriba "hacer" en su símbolo del sistema. Para compilar sin SDL, elimine las declaraciones SDL de las variables CFLAGS y LFLAGS en el archivo "Makefile".
Debe compilar en cada sistema operativo similar a UNIX. Para Windows necesita Cygwin o Mingw ( + LibsDL).
tipo
./sam I am Sam
para la primera salida.
Si ha deshabilitado SDL, intente
./sam -wav i_am_sam.wav I am Sam
Para obtener un archivo WAV. Este archivo puede ser jugado por muchos reproductores multimedia disponibles para la PC.
Puede probar otras opciones como -Pitch Number -Número de velocidad -Número de homicidio -Número de boca
Algunos valores típicos escritos en el manual original son:
DESCRIPTION SPEED PITCH THROAT MOUTH
Elf 72 64 110 160
Little Robot 92 60 190 190
Stuffy Guy 82 72 110 105
Little Old Lady 82 32 145 145
Extra-Terrestrial 100 64 150 200
SAM 72 64 128 128
Incluso puede cantar el archivo "Sing" para un pequeño ejemplo.
Para la tabla de entrada del fonema, busque en el wiki.
Se puede encontrar una descripción de las características adicionales en el manual original en http://www.retrobits.net/atari/sam.shtml o en el manual del programa de Apple II equivalente http://www.apple-iigs.info/newdoc/sam.pdf
Este programa se convirtió semiautomático en C al convertir cada código de operación de ensamblador. p.ej
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
Luego se reescribió manualmente para eliminar la mayoría de los saltos y registrar variables en el código y cambiar el nombre de las variables a los nombres propios. La mayor parte de la descripción a continuación es el resultado de este proceso de reescritura.
Lamentablemente, todavía no es muy bien legible. Pero deberías ver dónde empecé :)
En primer lugar, me limitaré aquí a una descripción muy gruesa. Hay muchas excepciones definidas en el código fuente que no explicaré. También se desconoce mucho código para mí, por ejemplo, código47503. Para una comprensión completa del código, necesito más tiempo y especialmente más ojos, eche un vistazo al código.
Cambia el texto en inglés a fonemas mediante un conjunto de reglas que se muestra en el wiki.
La regla "hormiga (i)", "ay", significa que si encuentra un "i" con letras anteriores "hormiga", intercambia el i por el fonema "ay".
Hay algunos signos especiales en estas reglas como # & @ ^ +: % que puede significar, por ejemplo, que debe haber una voz o una consonante o algo más.
Con la opción -debug, obtendrá las reglas correspondientes y los fonemas resultantes.
Aquí está el árbol completo de las llamadas de la subrutina:
Sameda () parser1 () parser2 () insert () copystress () setPhonEmelength () code48619 () code41240 () insert () code48431 () insert ()
Code48547
Code47574
Special1
Code47503
Code48227
Samnain () es la rutina de entrada y llama a todas las rutinas adicionales. Parser1 transforma la entrada del fonema y la transforma en tres tablas Phonemeindex [] Estrés [] Fonemelgenty [] (cero en este momento)
Estas tablas ahora se cambian:
Parser2 intercambia algunos fonemas por otros e inserta nuevos. Copystress agrega 1 al estrés en algunas circunstancias setPhonemElggth establece longitudes de fonema. Code48619 Cambia el código de longitud del fonema41240 agrega algunos fonemas adicionales El código48431 tiene algunas reglas adicionales
El wiki muestra todos los fonemas posibles y algunos campos de bandera.
El contenido final de estas tablas se puede ver con el comando -debug.
En la función PrepareOutput (), estas tablas se copian parcialmente en las tablas pequeñas: PhonemeIndexoutput [] StressOutput [] PhonemElgentingOutput [] para la salida.
Excepto de algunos fonemas especiales, la salida se construye mediante una combinación lineal:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
donde RECT es una función rectangular con la misma periodicidad como el pecado. Parece realmente extraño, pero esto es realmente suficiente para la mayoría de los tipos de fonemas.
Por lo tanto, los fonemas anteriores se convierten con algunas tablas en tonos [] frecuencia1 [] = F1 Frecuencia 2 [] = F2 F2 [] = F3 Amplitude1 [] = A1 Amplitud2 [] = A2 Amplitud3 [] = A3
La fórmula anterior se calcula en una muy buena rutina omptimizada. Solo consiste en 26 comandos:
48087: LDX 43 ; get phase
CLC
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl1,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
STA 56 ; store
LDX 42 ; get phase
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl2,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC Var56 ; add with previous values
STA 56 ; and store
LDX 41 ; get phase
LDA 42496,x ; load rect value (high 4 bits)
ORA TabAmpl3,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC 56 ; add with previous values
ADC #136
LSR A ; get highest 4 bits
LSR A
LSR A
LSR A
STA 54296 ;SID main output command
El resto se maneja de manera especial. Por el momento no puedo entender de qué manera. Pero parece que usa algo de ruido (por ejemplo, "S") usando una tabla con valores aleatorios.
El software es una versión de ingeniería inversa de un software comercial publicado hace más de 30 años. El titular actual de los derechos de autor es SoftVoice, Inc. (www.text2speech.com)
Cualquier intento de contactar a la compañía falló. El sitio web se actualizó por última vez en el año 2009. El estado del software original puede describirse mejor como abandonado (http://en.wikipedia.org/wiki/abandonware)
Siempre que este sea el caso, no puedo colocar mi código en ninguna licencia de software de código abierto específica, usé su propio riesgo.
Si tiene preguntas, no dude en preguntarme. Si descubrió algunos conocimientos nuevos sobre el código, envíeme un correo electrónico.
Sebastian Macke Correo electrónico: [email protected]