Logiciel Bouche automatique - Tiny Speech Synthesizer
Ceci est un port de go du synthétiseur de la parole Great Sam. C'est essentiellement une réécriture semi-automatique de C pour aller à ce qui était, à son tour, une réécriture semi-automatique de l'assemblage à C :). Par conséquent, ce n'est pas censé être lisible.
Repo original: https://github.com/vidarh/sam. Basé sur ce commit.
Comme un défi et juste pour le plaisir.
Sam est un très petit programme de texte vocale (TTS) écrit en C, qui fonctionne sur les plates-formes les plus populaires. Il s'agit d'une adaptation à C du logiciel de discours SAM (logiciel automatique de bouche) pour le Commodore C64 publié en 1982 par Don't Ask Software (maintenant SoftVoice, Inc.). Il comprend un convertisseur de texte à phonème appelé Reciter et une routine de phonème-dispection pour la sortie finale. Il est si petit qu'il fonctionnera également sur les ordinateurs intégrés. Sur mon ordinateur, il faut moins de 39 Ko (beaucoup plus petit sur les périphériques intégrés car l'exécutable n'est pas nécessaire) de l'espace disque et est un programme entièrement autonome. Pour la sortie immédiate, il utilise la bibliothèque SDL, sinon il peut enregistrer des fichiers .wav.
Une version en ligne et des exécutables pour Windows se trouvent sur le site Web: http://simulationcorner.net/index.php?page=sam
Tapez simplement "faire" dans votre invite de commande. Afin de compiler sans SDL, supprimez les instructions SDL des variables CFLAGS et LFLAGS dans le fichier "MakeFile".
Il doit compiler sur chaque système d'exploitation de type UNIX. Pour Windows, vous avez besoin de cygwin ou de mingw (+ libsdl).
taper
./sam I am Sam
pour la première sortie.
Si vous avez désactivé SDL
./sam -wav i_am_sam.wav I am Sam
Pour obtenir un fichier WAV. Ce fichier peut être joué par de nombreux lecteurs multimédias disponibles pour le PC.
Vous pouvez essayer d'autres options comme -Pitch Number -Speed Number -Truat Numéro -Mouth Numéro
Certaines valeurs typiques écrites dans le manuel original sont:
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
Il peut même chanter un regard sur le fichier "chanter" pour un petit exemple.
Pour la table d'entrée Phonème, regardez dans le wiki.
Une description de fonctionnalités supplémentaires peut être trouvée dans le manuel d'origine à http://www.retrobits.net/atari/sam.shtml ou dans le manuel du programme Apple II équivalent http://www.appe-iigs.info/newdoc/sam.pdf
Ce programme a été converti semi-automatique en C en convertissant chaque opcode d'assembleur. par exemple
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
Ensuite, il a été réécrit manuellement pour supprimer la plupart des sauts et enregistrer les variables dans le code et renommer les variables aux noms propres. La majeure partie de la description ci-dessous est le résultat de ce processus de réécriture.
Malheureusement, c'est toujours un très bon lisible. Mais tu devrais voir où j'ai commencé :)
Tout d'abord, je me limiterai ici à une description très grossière. Il existe de nombreuses exceptions définies dans le code source que je n'expliquerai pas. Beaucoup de code est également inconnu pour moi, par exemple Code47503. Pour une compréhension complète du code, j'ai besoin de plus de temps et surtout plus d'yeux jettent un œil sur le code.
Il change le texte anglais en phonèmes par un ensemble de règles indiqué dans le wiki.
La règle "fourmi (i)", "ay", signifie que s'il trouve un "i" avec les lettres précédentes "fourmi", échangez le i par le phonème "ay".
Il y a des signes spéciaux dans ces règles comme # & @ ^ +:% qui peuvent signifier par exemple qu'il doit y avoir une voix ou une consonne ou autre chose.
Avec l'option -debug, vous obtiendrez les règles correspondantes et les phonèmes résultants.
Voici l'arbre complet des appels de sous-programme:
Sammain () parser1 () parser2 () insert () copystress () setphonEMELNGLNGHT () code48619 () code41240 () insert () code48431 () insert ()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain () est la routine d'entrée et appelle toutes les autres routines. PARSER1 transforme l'entrée du phonème et la transforme en trois tables PhonèmeIndex [] Stress [] PhoneMelength [] (zéro en ce moment)
Ces tables sont maintenant modifiées:
PARSER2 échange certains phonèmes par d'autres et insère de nouvelles. La copystress ajoute 1 à la contrainte dans certaines circonstances SetphonEmlengle définit les longueurs de phonème. Code48619 modifie le phonème longueur Code41240 ajoute quelques phonèmes supplémentaires Code48431 a quelques règles supplémentaires
Le wiki montre tous les phonèmes possibles et certains champs de drapeau.
Le contenu final de ces tables peut être vu avec la commande -debug.
Dans la fonction préparentput (), ces tables sont partiellement copiées dans les petites tables: phonemeIndexOutput [] stressOutput [] PhoneMenglenthOutput [] pour la sortie.
À l'exception de certains phonèmes spéciaux, la sortie est construite par une combinaison linéaire:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
où le rect est une fonction rectangulaire avec la même périodicité que le péché. Cela semble vraiment étrange, mais c'est vraiment suffisant pour la plupart des types de phonèmes.
Par conséquent, les phonèmes ci-dessus sont convertis avec certaines tableaux en hausses [] fréquence1 [] = f1 fréquence2 [] = f2 fréquence3 [] = f3 amplitude1 [] = A1 amplitude2 [] = A2 amplitude3 [] = a3
La formule ci-dessus est calculée dans une très bonne routine aptialisée. Il ne comprend que 26 commandes:
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
Le reste est géré d'une manière spéciale. Pour le moment, je ne peux pas comprendre de quelle manière. Mais il semble qu'il utilise un peu de bruit (par exemple pour "S") en utilisant une table avec des valeurs aléatoires.
Le logiciel est une version inartigiste d'un logiciel commercial publié il y a plus de 30 ans. Le titulaire actuel du droit d'auteur est Softvoice, Inc. (www.text2speech.com)
Toute tentative de contacter l'entreprise a échoué. Le site Web a été mis à jour pour la dernière fois en 2009. Le statut du logiciel d'origine peut donc mieux décrire comme Abandonware (http://en.wikipedia.org/wiki/abandonware)
Tant que c'est le cas, je ne peux pas mettre mon code sous une licence logicielle open source spécifique, utilisez-le à vos propres risques.
Si vous avez des questions, n'hésitez pas à me poser. Si vous avez découvert de nouvelles connaissances sur le code, veuillez m'envoyer un courrier.
Sebastian Macke Courriel: [email protected]