Pour générer de la parole dans les années 1980, il y avait plusieurs solutions. Certains appareils utilisaient un processeur de parole SC‑01‑A de chez Votrax, société aujourd'hui disparue. Ce circuit ressemble à celui que l'on trouvait dans les boutiques TANDY, le SPO256AL2 de General Instruments.
Il suffit d'envoyer le code de chaque phonème ainsi qu'une vitesse de jeu au SC‑01‑A. En retour, il répond par un accusé de réception puis par un signal indiquant qu'il est prêt à recevoir le code du phonème suivant. Ce dernier signal est émis en parallèle de la production sonore, ce qui permet au circuit qui le pilote de ne pas perdre de temps dans l'émission des phonèmes suivants. C'est en enchaînant les phonèmes que l'on parvient à faire des phrases à peu près compréhensibles.
LIENS VERS LA DOCUMENTATION ET LES PROMS | LIENS |
---|---|
LES DATASHEETS DU SC-01-A | |
Documentation d'origine du SC‑01‑A. C'est la seule documentation correspondant à la version -A du SC-01, et de plus elle est bien scannée ! | [DOC1] |
Documentation d'origine du SC-01. Celui qui est présent sur la carte livrée par Pascal est une version plus récente : le SC‑01‑A qui dispose d'une alimentation différente et améliore certaines choses. | [DOC2] |
ATTENTION ! les colonnes MIN et MAX sont inversées dans les caractéristiques électriques page 8/9: il faut lire "Digital Input Logic 1 (except I1, I2, MCX) MIN = VG+4.0 et MAX = Vp+0.5" alors qu'il est écrit l'inverse ! | [DOC3] |
INformations complémentaires sur le SC-01 | [DOC4] |
Dictionnaire phonétique du SC-01-A (tous les codes phonèmes + une liste de mots déjà prêts à utiliser + préfixes et suffixes). | [DOC5] |
Fichier Excel contenant la liste des mots et phonèmes prêts à utiliser (+ préfixes et suffixes). | [DOC6] |
LIENS VERS DES INFORMATIONS COMPLEMENTAIRES | |
Des informations intéressantes sur le circuit et les autres processeurs de parole des années 1980. | [LNK1] |
C'est la seule documentation concernant la version -A du SC-01, les niveaux de tension pour la broche Vp ne sont plus les mêmes que ceux du synthétiseur précédent (SC-01).
Attention donc !
Tension Vp du SC‑01‑A :
C'est une autre documentation d’origine, moins bien scannée (tronquée par endroit) mais avec d’autres informations dedans :
Ce documet contient la liste des phonèmes et les codes associés. Il contient aussi une liste de mots déjà prêts à être utilisés, ainsi que les préfixes et suffixes.
J'ai réalisé une déclinaison du dictionnaire au format Excel, c'est très pratique pour filtrer et ne retenir que les mots qui nous intéressent. Ce fichier permet d'utiliser le copier-coller vers une console série permettant d'envoyer les séquences de phonèmes au programme Arduino qui pilote le SC-01 (CF MONTAGE N°12 plus bas).
J'ai chosi l'ARDUINO UNO pour réaliser un premier programme de test du SC‑01‑A.
Le but de ce premier programme préparatoire est de vérifier la bonne prise en compte des interruptions issues du SC-01-A. J'ai en effet décidé d'utiliser le mécanisme des interruptions pour prendre en compte le signal A/R issu du SC-01-A. Comme on peut le voir dans les différents datasheets, ce signal sert à 2 choses :
Pour simuler l'interruption envoyée par l'Arduino (et mettre au point ce sketch), j'ai utilisé un simple bouton poussoir muni d'une capacité pour éviter les rebonds ! Voir le schéma logique après le sketch suivant.
Le sketch suivant est largement inspiré de celui développé par Bertrand the BOSS ELECTRO-BIDOUILLEUR ! Électro-Bidouilleur, le meilleur de l'électronique... The boss !// Programme largement inspiré de celui de Bertand the BOSS ELECTRO-BIDOUILLEUR // Définition des broches du SC-01-A de chez VOTRAX #define P0 8 // pin 14 du SC-01-A = bit 0 du mot de 6 bits permettant d'adresser le phonèmes #define P1 9 // pin 13 du SC-01-A = bit 1 du mot de 6 bits permettant d'adresser le phonèmes #define P2 10 // pin 12 du SC-01-A = bit 2 du mot de 6 bits permettant d'adresser le phonèmes #define P3 11 // pin 11 du SC-01-A = bit 3 du mot de 6 bits permettant d'adresser le phonèmes #define P4 12 // pin 10 du SC-01-A = bit 4 du mot de 6 bits permettant d'adresser le phonèmes #define P5 13 // pin 9 du SC-01-A = bit 5 du mot de 6 bits permettant d'adresser le phonèmes #define STB 3 // pin 7 du SC-01-A ==> pour verrouillage des données. Le verrouillage a lieu sur le front montant de STB. #define AR 2 // INT0 (interruption externe sur la broche 2 Arduino) servira à recevoir le signal AR pin 8 du SC-01-A // front haut vers bas un cycle d'horloge après le front actif de STB ==> accusé réception du code phonème // front bas vers haut ==> SC-01-A prêt à recevoir le code de phonème suivant. // liste des phonèmes. Le N° d'ordre dans le tableau constitue le code à envoyer au SC-01-A String Phonemes_list[] = {"EH3", "EH2", "EH1", "PA0", "DT", "A2", "A1", "ZH", "AH2", "I3", "I2", "I1", "M", "N", "B", "V", "CH", "SH", "Z", "AW1", "NG", "AH1", "OO1", "OO", "L", "K", "J", "H", "G", "F", "D", "S", "A", "AY", "Y1", "UH3", "AH", "P", "O", "I", "U", "Y", "T", "R", "E", "W", "AE", "AE1", "AW2", "UH2", "UH1", "UH", "O2", "O1", "IU", "U1", "THV", "TH", "ER", "EH", "E1", "AW", "PA1", "STOP"}; volatile int CodePhonemeRecu = false ; volatile int PretPourPhonemeSuivant = false ; void ARTriggered(); void setup() { // put your setup code here, to run once: Serial.begin(9600); attachInterrupt(0, ARTriggered, CHANGE); // interruption 0 (associée à la pin 2), pointeur sur routine, condition de déclenchement digitalWrite(STB, LOW) ; // Configuration des broches d'entrée/sortie pinMode(P0, OUTPUT); pinMode(P1, OUTPUT); pinMode(P2, OUTPUT); pinMode(P3, OUTPUT); pinMode(P4, OUTPUT); pinMode(P5, OUTPUT); pinMode(STB, OUTPUT); } void loop() { // LEs variables de la fonction int i ; char RxChar; String RxStr; int ctr; int num_phonemes; int phoneme[100] = {}; RxStr = ""; ctr = 0; num_phonemes = 0; //for (i=0;i<100;i++) phoneme[i]=0; while (true) { if(Serial.available()>0) // Caractères disponibles dans la mémoire tampon du port série ? { //oui RxChar = Serial.read(); //lire le caractère if ((RxChar == '\n') && (RxStr == "")) break; // Fin de chaîne reçue, on sort if ((RxChar != ',') && (RxChar != '\n')) RxStr += RxChar ; // Le transférer dans la chaîne de caractère en RAM else { i = 0; while ((Phonemes_list[i] != RxStr) && (i < 63)) i++; // Recherche du Phonème dans la liste if (i==64) // Phonème pas trouvé dans la liste { Serial.print ("Erreur avec '"); // Afficher un message d'érreur Serial.print(RxStr); Serial.println("'"); } else // Phonème trouvé dans la liste { phoneme[num_phonemes]=i; // Transférer la position du phonème de la liste comme code de phonème num_phonemes++; // incrémenter la position du phonème dans la phrase à envoyer } RxStr = ""; if (RxChar == '\n') break; // Fin de chaîne reçue, on sort } } } // Tous les phonèmes sont reçus. On peut produire la phrase for (i=0; i< num_phonemes; i++) // Boucle d'incrémentation des phonèmes à prononcer { CodePhonemeRecu = false; PORTB = (PORTB & B11000000) | (phoneme[i]); // Transférer le phonème sur le port vers le SC-01-A digitalWrite(STB, HIGH); // Donner une impulsion haute sur la ligne strobe delayMicroseconds(1); digitalWrite(STB, LOW); Serial.print("Envoi code phonème"); Serial.print(Phonemes_list[phoneme[i]]); // Afficher le phonème Serial.print(" -->\t\t"); Serial.println(phoneme[i]); // Afficher le code du phonème while(!CodePhonemeRecu) ; Serial.println("<-- phonème reçu"); while(!PretPourPhonemeSuivant) ; Serial.println("<-- prêt à recevoir le phonème suivant"); } } void ARTriggered() { CodePhonemeRecu = !digitalRead (AR) ; PretPourPhonemeSuivant = !CodePhonemeRecu ; }
J'ai mis en parallèle sur le poussoir, un condensateur de 20 nF et une résistance de 10 kohms en série vers le +5V, ceci afin d'éviter les rebonds... Et ça fonctionne très bien !
On voit le résultat ci-dessous.
Afin de prendre toutes les précautions nécessaires, j'ai décidé d'utiliser le logiciel Fritzing
Voici la méthode que j'ai utilisée :
Bien entendu, la liste ci-dessus est loin d'être représentative... Car pour bien faire les choses, j'ai dû créer le composant SC-01-A dans Fritzing et là j'ai passé une bonne semaine à essayer de comprendre la logique de création ! Créer un composant dans ce logiciel est un véritable calvaire, il faut deviner beaucoup de chose et manipuler des logiciels de création d'images vectorielles comme Inkscape.
J'en ai profité également pour crée un composant de type "alimentation" représentant mon alimentation HP E3610A.
Avec ma photo en prime sur le circuit imprimé.
Bonjour Electro-bidouilleurs ==>
Bonjour Bertrand, bonjou Electro-bidouilleurs ==>
Very very Super, Thank you very much ==>
Ci dessous, j'ai crée la célèbre phrase avec le SC-01-A que j'ai jouée en parallèle avec la voix de Neils Armstrong, ensuite on entend la voix de Neils seul et enfin, la voix du SC-01-A seul. Duo SC-01 + Neils Armstrong That's one small step for a man, one giant leap for mankind !!! ==>
C'est un petit pas pour l'homme, mais un bond de géant pour l'humanité ==>