Le synthetiseur vocal MEA 8000

De MicElectroLinGenMet.

Sommaire

Le synthétiseur vocal MEA 8000

(Tiré des photocopies classeur MEA8000.)

Ce chapitre est consacré à la description détaillêe du MEA 8000, à son interfaçage avec le processeur de contrôle, ainsi qu'aux principes généraux de sa programmation.


Datasheets:


Particularités du MEA 8000

Le MEA8000 est un synthétiseur à formants et correspond de ce fait aux caractéristiques générales de ceux-ci, expliquées au chapitre précédent.

Du point de vue physique, il s'agit d'un circuit périphérique de microprossesseur ou microcontrôleur à bus de données 8 bits; ses principales caractéristiques sont résumées à l'annexe 1, où l'on trouvera également son [#brochage brochage] et le schéma de principe général d'application. Les particularités essentielles du MEA 8000 sont les suivantes:

Image:Mea8000_21.jpg

• Quatre formants, chacun réalisé sous forme d'un filtre numérique du second ordre à trois multiplicateurs (voir figure 6).

La mise en cascade de ces quatre résonateurs reproduit le modèle du conduit vocal; elle est représentée par la figure 7.

Image:Mea8000_7.jpg

Dans le cas du MEA 8000, les trois premiers formants sont programmables en fréquenoe centrale (FM1, FM2, FM3) et en bande passante (BW1, BW2, BW3). Le quatrième formant n'est programmable qu'en bande passante (BW4), sa fréquence centrale étant fixée à 3500 Hz.

Outre les sons purement vocaux, le synthétiseur est capable de reproduire d'autres types de sons tels que des bruits ou de la musique.

Une méthode simple pour générer des sons musicaux consiste à utiliser comme générateur la source de bruit et à accorder les formants 1 et 2 sur la même fréquence (celle de la note à générer) pour créer un filtre très sélectif; il est également possible d'utiliser le générateur périodique en accordant les formants sur des harmoniques de celui-ci pour créer le timbre recherché.

L'enveloppe du son (attaque et décroissance) peut être obtenue en créant une courbe d'amplitude appropriée. Le nombre et la durée des trames utilisées déterminera celle de la note.

Il est toutefois certain que les performances du MEA 8000 en ce domaine n'égalent pas celles des synthétiseurs musicaux spécialisés qui offrent une gamme d'octaves plus étendue et plusieurs voix simultanées.

La génération de bruits spéciaux (explosion, coup de feu, train, etc.) est possible en utilisant le générateur de bruit et en jouant sur les formants, l'amplitude et la répétition des sons; quelques sons de ce type sont fournis à titre d'exemple en fin d'ouvrage.

Durée de trame programmable; dans le cas du MEA 8000, la durée de trame est programmable en quatre valeurs de 8, 16, 32, 64 ms au moyen de 2 bits du code de trame qui en compte 32 en tout. Ceci permet de tirer parti de certains passages où les paramètres varient lentement ou pas du tout en utilisant une durée de trame de 32 ou 64 ms.

A l'inverse, l'utilisation des trames de 16, et, plus rarement, de 8 ms permet une reproduction fidèle des passages tels que les plosives (sons p, t, k par exemple), caractérisées par une évolution rapide des paramètres vocaux. L'utilisation judicieuse de la durée de trame lors du codage permet d'obtenir une parole de qualité avec un débit de l'ordre de 1000 bits/seconde.

Convertisseur numérique/analogique de sortie intégré; ce convertisseur incorpore un circuit de suréchantillonnage qui intercale sept échantillons interpolés entre deux échantillons à 8 kHz fournis par la partie "synthèse" du circuit. Ceci a pour effet de fournir, en sortie du circuit, un signal dont la fréquence d'échantillonnage est de 64 kHz, très supérieure à la fréquence limite d'audition, et donc beaucoup plus facile à éliminer du signal de sortie (un simple filtre RC passe bas suffit dans la majorité des cas).
Outre les fonctions liées à la synthèse proprement dite, le circuit inoerpore un générateur d'horloge à quartz (4,00 MHz), une interface microprocesseur et un circuit de sortie analogique. La figure 8 représente le synoptique simplifié du MEA8000.


Description du circuit

Le synoptique détaillé du MEA8000 est représenté par la figure 9 sur laquelle on peut distinguer trois grands blocs fonctionnels.

Image:Mea8000_9.jpg


La partie "synthétiseur à formants"

Elle est située au centre du synoptique. La source périodique, la source de bruit et les quatre résonateurs à formants décrits au chapitre précédent consistent en fait en un ensemble de multiplicateurs et d'additionneurs à 16 bits qui calcule les échantillons vocaux au rythme de 8 kHz. Les échantillons de 16 bits résultants sont tronqués à 11 bits avant application au circuit de sortie.

Le synthétiseur est contrôlé par 11 paramètres représentant la hauteur (pitch) et sa variation pour les sons voisés, ou la source de bruit pour les sons non voisés, l'amplitude ainsi que les quatre fréquences centrales et les quatre bandes passantes des formants.

Chaque paramètre est défini sur 14 bits, d'où un total de 154 (11 x 14) bits pour commander l'ensemble du synthétiseur sur une trame. Pour réduire le nombre de bits nécessaires à la définition d'une trame, chaque paramètre est codé au moyen d'une quantification appropriée; ceci permet de réduire à 27 le nombre des bits nécessaires au codage des paramètres du conduit vocal.

La logique d'interpolation de paramètres calcule la différence entre deux valeurs consécutives et réalise une interpolation linéaire entre elles pour lisser les transitions; l'intervalle d'interpolation est obtenu par décodage des deux bits FD qui déterminent la durée de trame. Ce sont les sorties de cette logique qui commandent toutes les fonctions de synthèse (pitch, voîsé/non voisé, amplitude, formants).

D'autre part. le codage du pitch est effectué en valeur relative (variation en Hz sur un intervalle de 8 ms) ceci permet de réduire de 8 à 5 le nombre de bits nécessaire au codage de ce paramètre, autorisant une variation de -15 à +15 Hz/8 ms soit près de +/-2 kHz/s, ce qui est suffisant. La valeur particulière 16 sélectionne le générateur de bruit pour les sons non voisés. Une trame est donc entièrement définie au moyen de 32 bits.

Cette méthode de codage implique de fournir la valeur initiale du pîtch en début d'expression, sous forme d'un premier octet, avant l'envoi des données relatives à la première trame à prononcer. Chaque trame est ensuite définie par quatre octets.

Circuit d'interface et de traitement des données

C'est la partie supérieure du synoptique de la figure 9. Comme nous l'avons vu au chapitre précédent, les paramètres du synthétiseur doivent être actualisés de façon périodique. Ces données sont fournies au circuit par un bus parallèle à 8 bits et envoyées dans un registre tampon de 32 bits lorsque A0 = 0. La figure 10 indique l'affectation des différents bits du code de trame.


Image:Mea8000_10b.jpg

La figure 11 représente les valeurs corespondantes des paramètres en fonction du code de trame.

Image:Mea8000_11.jpg

Le circuit possède également un registre de commande vers lequel les données sont aiguillées lorsque A0 = 1. Ceci permet de déterminer le mode de fonctionnement du synthétiseur par l'envoi d'une commande "STOP" (voir "Mise en oeuvre du MEA 8000"). Un registre d'état à 1 bit (REQ) permet de connaître l'état du synthétiseur pour l'envoi des données vocales en mode actif. Des signaux de contrôle CE, W, R/W permettent un interfaçage simple avec le processeur de commande.

Le circuit de sortie

C'est la partie inférieure du synoptique de la figure 9.Après un arrondi à 8 bits, les échantillons à 8 kHz provenant de la sortie des filtres numériques sont appliqués à un interpolateur linéaire qui intercale 7 échantillons interpolés entre deux échantillons consécutifs à 8 kHz; ceci accroît donc la fréquence effective d'échantillonnage en sortie à 64 kHz et permet un post-flltrage analogique très simple.

Ces échantillons de 8 bits à 64 kHz attaquent ensuite le convertisseur analogique/numérique de la figure 12, dont le courant de référence I est défini par la résistance externe connectée à la borne REF (borne 19). Les 4 bits de poids fort déterminent le temps de conduction d'un générateur de courant 16 x I, et les 4 bits de poids faible celui d'un générateur de courant I. Ceci permet donc un total de 16 x 16 = 256 combinaisons nécessaires à la conversion 8 bits.


L'amplificateur de puissance externe peut être réalisé de façon très simple au moyen du schéma de la figure 13 pour attaquer une ligne, un casque ou un petit haut-parleur d'impédance 50 à 100 ohms il assure également le filtrage de sortie.


La figure 14 représente un schéma utilisant un amplificateur intégré type TDA 1011 pouvant fournir jusqu'à 4 watts à H.P. de 4 ohms. Tout autre amplificateur peut convenir et l'entrée. Péritel d'un téléviseur, en particulier, est une solution tout indiquée lorsqu'on utilise ce type de moniteur pour la visualisation.


Mise en oeuvre du MEA 8000

Le MEA8000 est un circuit périphérique de microprocesseur ou microcontrôleur et peut être adressé comme un circuit d'entrée/sortie ou une mémoire, grâce aux signaux de contrôle CE, W,R/W à l'entrée d'adresse A0 et au signal REQ.

Le registre de commande et le tampon d'entrée sont à écriture seule, alors que le registre d'état est à lecture seule. La table de vérité de la [#fig15 figure 15] indique la manière d'y accéder. Les caractéristiques temporelles des signaux sont données en annexe au paragraphe "Caractéristiques principales du MEA 8000".

Registre tampon d'entrée

Ce registre de 32 bits (4 octets) contient les codes d'une trame de parole et peut être adressé lorsque A0 = 0.

Registre d'état

Ce registre n'est constitué en fait que d'un seul bit appelé REQ. Il peut être lu sur le bit 7 du bus de données lorsque_R/W est à l'état bas et apparaît également (inversé) sur la borne REQ si elle a été validée. Lorsque le bit REQ est à "0", le MEA 8000 est occupé et ne peut recevoir de nouvelles données. Il indique qu'il demande ses données par la mise à 1 du bit REQ. La borne REQ (active bas) peut être validée par mise à la masse de la borne 14 (REQEN) ou par logiciel en mettant à "1" le bit ROE du registre de commande avec REQEN à l'état haut. Ceci permet donc l'utilisation du MEA 8000 en interruption ou en scrutation.

Registre de commande
Le MEA8000 dispose d'un registre de conimande de 5 bits dans lequel un mot de commande peut être écrit lorsque A0 = 1. Le tableau ci-dessous indique le rôle des différents bits de ce registre:

|  D4             |   D3          |  D2              |  Dl          |  D0
|  STOP           |   CONT enable |  CONT            |  ROE enable  |  ROE
|  0 = sans effet |   0           |  X               |  0           |  X
|  1 = STOP       |   1           |  0 = ARRET LENT  |  1           |  0 = REQ inhibé
|                 |   1           |  1 = CONTINU     |  1           |  1 = REQ validé 

D5, D6, D7 inutilisés.
ROE = validation de la sortie REQ.
X = indifférent.

STOP (D4): Si ce bit est à l'état "1", le synthétiseur s'arrêtera dès la réception du mot de commande (initialisation).

CONT (D2) ce bit ne peut être modifié que Si le bit CONT enable (D3) est à l'état "1"; Si CONT est à l'état "1", le synthétiseur répètera indéfiniment la dernière trame en cas d'interruption dans la réception des codes.

ROE (D0): ne peut être modifié que Si le bit ROE enable (D1) est à l'état "1". ROE = "1" entraîne l'apparition du bit REQ (inversé) sur la borne REQ. Le même résultat est obtenu en mettant la borne REQEN à "0".

A la mise sous tension, les bits CONT et ROE sont mis à "0", ce qui équivaut à l'envoi du mot de commande 00011010 (Hex 1A) ; c'est donc la lecture de REQ sur le bus de données (D7) et la procédure "arrêt lent" qui sont sélectionnés par défaut.

Modes de fonctionnement

Le MEA 8000 a deux modes de fonctionnement:

• Mode INACTIF: caractérisé par une sortie silencieuse et le bit d'état REQ à "1". Ce mode est provoqué par la mise sous tension ou l'envoi d'une commande STOP qui provoque un arrêt immédiat du synthétiseur, ou bien à la fin d'une procédure d'arrêt lent (voir ci-dessous). Dans ce cas, la trame est répétée avec une amplitude réduite avant l'arrêt du synthétiseur.

- Mode ACTIF: ce mode est activé par la réception de l'octet de pitch initial, et le circuit prononce ensuite les sons correspondant aux trames reçues. Pour un fonctionnement normal, les 4 octets de la trame suivante doivent être reçus avant la fin de la trame en cours de prononciation. Si tel n'est pas le cas, le circuit entame l'une des deux procédures suivantes selon l'état du bit CONT:
- ARRET LENT Si CONT = "0" (répétition de la trame avec amplitude réduite, puis retour au mode INACTIF).
- CONTINU Si CONT = "1": dans ce cas, le circuit répète indéfiniment la dernière trame reçue jusqu'à la réception d'une nouvelle trame ou d'une commande STOP.

La figure 16 montre l'évolution du signal de sortie en cas d'interruption des codes selon que l'une ou l'autre procédure a été choisie.

Image:Mea8000_16.jpg


La figure 17 correspond au cas de fonctionnement "normal", avec arrêt du synthétiseur par une commande STOP. Afin que la dernière trame du message ne soit pas raccourcie, cette commande ne doit pas arriver avant la fin de la prononciation de celle-ci. Le moyen le plus simple d'y parvenir consiste à envoyer une trame silencieuse (constituée par exemple de 4 octets à "00") après la dernière trame utile du message, et d'envoyer ensuite la commande STOP.


Envoi des données vocales au MEA 8000

Les codes vocaux peuvent être envoyés vers le registre tampon d'entrée du synthétiseur lorsque CE, W et A0 sont à "0" et R/W à "1", alors que le bit REQ est à l'état "1". REQ est remis à "0" à chaque opération d'écriture d'un octet.

A partir du mode INACTIF, le premier octet reçu est interprété comme la valeur initiale du fondamental (pitch initial) et le bit REQ repasse à l'état "1" au bout d'un maximum de 8 ms. Les quatre octets suivants sont interprétés comme les codes de la première trame du message et, bien que le bit REQ passe à l'état "1" entre chaque octet, il suffit de lire son état à la fin de chaque trame pour envoyer la suivante.

Le MEA 8000 commence donc à parler après le cinquième octet reçu. Pour que le fonctionnement soit normal (ininterrompu), il faut que les octets de la trame suivante soient tous arrivés au MEA 8000 avant la fin de la prononciation de la trame en cours. Compte tenu de la durée de trame minimale de 8 ms, cela ne pose aucun problème pour tout microprocesseur programmé en langage-machine, mais interdit l'emploi du BASIC pour cette partie du programme.

La lecture de REQ par scrutatîon de D7 interdit au microprocesseur toute autre tâche pendant_que le MEA 8000 parle; pour éviter cela, on devra utiliser la borne REQ pour actionner une entrée d'interruption. Dans ce cas la synthèse ne demandera que quelques pour cent du temps du microprocesseur qui pourra vaquer à d'autres occupations comme Si de rien n'était.

Ces données nous permettent maintenant de concevoir un logiciel pour commander le MEA 8000; c'est l'objet du chapitre suivant.

Logiciel de commande

Principe

Le vocabulaire correspondant à l'application est stocké en mémoire ROM ou RAM selon l'organisation représentée par la figure 18. En général, plusieurs expressions, mots ou éléments de vocabulaire (phonèmes par exemple) sont stockés dans un espace-mémoire déterminé. Afin de faciliter l'accès à ce vocabulaire et pour rendre le programme de commande indépendant de celui-ci, on dispose en début de la zone mémoire de vocabulaire une table d'adresse (directory) indiquant l'adresse de début de chacun de ses éléments. Chacune de ces adresses est codée sur deux octets, poids fort en tête; ceci permet donc de trouver l'adresse de l'adresse d'une expression quelconque à partir de son numéro d'ordre N, par la relation:


AN = A0 + 2 x N


où A0 Adresse de début de table, AN Adresse de l'adresse de l'expression N.

La table d'adresses se termine par la séquence "FF 00" ou "FF FF" selon le dispositif de codage utilisé.
Chaque expression débute elle même par un "en tête" de 4 octets, dont les deux premiers représentent le nombre total d'octets de l'expression (en-tête compris) et le quatrième le pitch initial. Le troisième octet représente le pitch en fin d'expression ou est à 00 selon le dispositif de codage; il n'est en général pas exploité par le logiciel de synthèse. Les trames qui suivent étant elles-mêmes codées sur 4 octets, la longueur d'une expression est toujours un multiple de 4 octets.

Image:Mea8000_18.jpg


Connaissant ce qu'il faut envoyer au synthétiseur et la façon dont les informations sont stockées dans la mémoire, il est nous maintenant possible d'en déduire l'organigramme général d'une routine permettant de faire prononcer au MEA 8000 une expression en mémoire.
Cette routine devra être réalisée en langage-machine, le BASIC n'étant pas assez rapide pour cette application. Son
organigramme est représenté par la[#fig19 figure 19]. L'adresse de début de l'expression à prononcer est supposée avoir été préalablement chargée à un endroit approprié pour l'adressage indirect.

Image:Mea8000_19.jpg


Après avoir testé l'état du bit "REQ", on initialise le synthétiseur par l'envoi d'une commande STOP (A0 = 1) qui
déterminera en outre la procédure d'arrêt suivie en cas d'interruption dans l'envoi des codes ("continu" ou "arret lent").

Il faut ensuite lire les deux octets de la longueur d'expression et les stocker dans un registre ou en mémoire. Il est
commode, pour adresser les octets successifs de l'expression, d'utiliser un index qui pourra être un registre
permettant l'adressage indexé. Cet index sera donc positionné à 0 au départ pour pointer la longueur d'expression;
après lecture de la longueur, on le positionnera à 3 pour pointer l'octet de pitch initial.

C'est le premier octet de données vocales à envoyer au MEA 8000 (A0 à "0"), après quoi on incrémente l'index pour
pointer l'octet suivant. On teste de nouveau le bit REQ avant l'envoi des trames vocales. Les quatre octets de la
trame peuvent être envoyés en bloc sans test de REQ entre chacun d'eux lorsque l'on travaille par scrutation de D7,
après quoi on incrémente l'index de 4.

On peut aussi envoyer chaque octet et incrémenter de 1 l'index, ce qui permet d'utiliser la même routine pour l'envoi
du pitch initial et des octets de trame; c'est la solution que nous avons choisie.

Après chaque trame, il faut tester si l'index a atteint la valeur de la longueur de l'expression; Si ce n'est pas le cas, on
teste de nouveau REQ, on envoie la trame suivante, et ainsi de suite. Lorsque les deux valeurs sont égales, on est
arrivé à la fin de l'expression et on peut envoyer une trame silencieuse (00000000) suivie, après test de REQ, de la
commande STOP finale.

lCette trame "fictive" n'est pas indispensable si on a pris la précaution, lors du codage, de terminer chaque
expression par une trame d'amplitude nulle. C'est le cas pour le vocabulaire fourni en annexe et les expressions
créées par les logiciels de composition phonétique décrits qui permettent de se passer de trame fictive dans la
routine de base.

On peut se rendre compte, sur l'organigramme de la figure 19, que certaines opérations sont effectuées à plusieurs
endroits du programme, ce qui justifie leur réalisation au moyen d'un sous-programme:

- STOP: Envoi de la commande STOP
- TREQ: Test de l'état de REQ
- TRAM: Envoi d'un octet de données et incrémentation d'index.

Le programme principal définit le séquencement des opérations et assure directement la réalisation de celles ne
figurant qu'une une seule fois (initialisation, lecture de la longueur, test de fin).




22 août 2002