Préambule : cliquez éventuellement sur les photos pour les voir en meilleure qualité.

Expériences avec le synthétiseur SC-01-A de chez VOTRAX

Introduction

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 PROMSLIENS
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]

[DOC1]Documentation officielle du SC‑01‑A

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 :

  1. Maximum autorisé = 20 V ;
  2. Normal operation 10V <= Vp <= 14V.

[DOC4]Documentation complémentaire SC-01

C'est une autre documentation d’origine, moins bien scannée (tronquée par endroit) mais avec d’autres informations dedans :

  • description générale ;
  • dictionnaire anglais donnant la correspondance mots/phonèmes ;
  • description des signaux ;
  • timing specifications ;
  • schéma fonctionnel ;
  • utilisation et applications typiques ;
  • caractéristiques électriques ;
  • copie supplémentaire du datasheet ;
  • dictionnaire phonétique plus complet avec les mots usuels anglais.

[DOC5] Dictionnaire phonétique du SC‑01

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.

[DOC6] Version Excel du dictionnaire phonétique du SC‑01

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).




Préparation à l'utilisation d'un microcontrôleur pour piloter le SC-01-A

1er jet du programme de test ARDUINO

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 :

  1. Accuser réception du phonème envoyé par le microcontrôleur ;
  2. Demander l'envoi du phonème suivant.

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 !

Le sketch ARDUINO

// 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 ;
}
 

Schéma servant à tester la routine d'interruption

Test de l'interruption
Simple schéma pour tester la routine d'interruption indépendamment du SC‑01‑A...

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 !

Le montage réalisé pour tester le bon fonctionnement de la routine d'interruption

Test de l'algorithme
Appui sur poussoir = front haut vers bas = AR / Relâchement du poussoir = front bas vers haut...

On voit le résultat ci-dessous.

Sortie série
Les messages échangés entre l'Arduino et les broches Acknowledge/Request New Phoneme Data et STROBE.



Montage N°2 utilisation d'un microcontrôleur pour piloter le SC-01-A

D'infinies précautions pour ne pas griller le SC-01-A

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 :

  1. Faire un schéma logique sur papier ;
  2. Prendre les composants nécessaires à sa réalisation ;
  3. Réaliser le schéma d'implantation (la maquette) avec Fritzing
  4. Router manuellement le schéma logique
  5. Router manuelle la partie PCB (même si je l'utiliserai pas dans un premier temps)

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.

Pourquoi Fritzing ?

  • Ca permet de représenter directement le positionnement des composants sur la plaque de montage
  • Lorsque l'on clique sur une des connexions de la plaque de montage virtuelle, ça allume des points jaunes sur tous les contacts qui lui sont reliés ! Ca c'est très pratique pour vérifier qu'on n'a rien oublié et qu'on n'a pas fait de court-circuit !
  • Ca permet de regénérer le schéma logique pour un contrôle final avec le schéma papier d'origine
  • Ca permet de choisir les couleurs de fils (en adéquation avec ceux dont on dispose), ce qui diminue les chances de se tromper
  • Ca permet de générer un shield Arduino double face !

Le schéma d'implantation sur la platine d'expérimentation

Pilotage SC-01-A avec un Arduino UNO
C'est l'Arduino UNO qui émet les codes phonèmes à la demande du SC-01-A...

Le schéma logique de pilotage du SC-01-A regénéré par Fritzing

Pilotage SC-01-A avec un Arduino UNO, le schéma logique
Le schéma logique du pilotage du SC-01-A par un Arduino UNO...

Un PCB de schield pour le cas où...(généré par Fritzing)

Avec ma photo en prime sur le circuit imprimé.

Le PCB du shield
Le PCB du shield

Quelques exemples de sons crées avec ce montage

Bonjour Electro-bidouilleurs ==> Bonjour Electro-bidouilleurs

Bonjour Bertrand, bonjou Electro-bidouilleurs ==> VBonjour Bertrand, bonjour électro-bidouilleurs

Very very Super, Thank you very much ==> 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 !!! ==> 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é ==> C'est un petit pas pour l'homme, mais un bond de géant pour l'humanité

Copyright 2004-2023 © Bruno VIVIEN tous droits réservés.