Encodeur de parole MEA8000
La synthèse vocale avec le MEA8000 a toujours été un sujet passionnant. Les kits d’époque pour produire les trames de données sont entourés d’un certain mystere. Un jour peut être aurons-nous l’explication de leur fonctionnement. En attendant nous vous proposons un convertisseur en python qui réalise l’encodage depuis un fichier wav.
Ce que sait faire le chip
Le MEA8000 est un synthétiseur à formants : une source d’excitation, une dent de scie à la hauteur de la voix pour les sons voisés ou un bruit pour les consonnes sourdes, traverse quatre résonateurs en cascade. Les trois premiers imitent les résonances du conduit vocal, les formants, qui font qu’un a n’est pas un i ; le quatrième est fixé à 3500 Hz. Une trame de 4 octets règle tout cela :
- la fréquence de chacun des trois formants (32, 32 et 8 valeurs possibles) et la largeur de bande de chacun des quatre résonateurs (726, 309, 125 ou 50 Hz),
- l’amplitude, sur 16 codes en progression logarithmique, le code 0 étant le silence,
- le pas de hauteur, de −15 à +15 Hz par 8 ms, ou la valeur spéciale qui bascule sur le bruit,
- la durée de la trame : 8, 16, 32 ou 64 ms.
Entre deux trames, le chip interpole linéairement chaque paramètre. Une trame longue est donc une rampe droite du réglage précédent au nouveau, ce qui explique qu’une voyelle tenue se contente de trames de 64 ms et qu’une consonne demande du 8 ms.
Le dialogue avec le processeur est minimal : deux registres, données et commande. On envoie une commande d’arrêt, la hauteur de départ, puis les octets des trames, chacun quand le bit REQ du registre d’état indique que le chip accepte un octet. Une trame d’amplitude 0 termine le mot. Les formats de fichiers de Philips, repris tels quels par Cedic-Nathan, ne sont que cela : une longueur, la hauteur de départ, les trames.
L’encodeur, étape par étape
L’encodeur travaille en tranches de 8 ms, la résolution du chip, sur l’enregistrement ramené à 8 kHz.
-
Analyse. Pour chaque tranche, on mesure le niveau, on décide si le son est voisé ou du souffle, et on estime la hauteur de la voix en cherchant la période qui se répète dans le signal, avec un choix cohérent d’une tranche à l’autre.
-
Modèle du chip. On sait calculer exactement le spectre que produit un réglage donné des quatre résonateurs, avec la source correspondante. Ce sont des formules de filtres à deux pôles, celles de la documentation Philips.
-
Cible. On relève le spectre de l’enregistrement sur la tranche : les harmoniques quand c’est voisé, l’enveloppe lissée quand c’est du souffle.
-
Recherche exhaustive. On compare la cible aux 2 097 152 réglages possibles des résonateurs et on garde ceux dont le spectre colle le mieux, à un décalage de volume près. Un produit de matrices fait cela en quelques millisecondes par tranche.
-
Lissage. Entre tranches voisines, on préfère les réglages qui bougent comme une bouche bouge. Un saut brusque de résonance est pénalisé : le chip le rendrait comme un balayage, un « chirp ».
-
Hauteur. Le chip ne monte ou ne descend que de 15 Hz par 8 ms, ou repart d’une nouvelle hauteur en coupant. On choisit, tranche par tranche, le chemin qui suit au mieux la hauteur mesurée sous ces contraintes.
-
Volume. On simule ce que le chip sortira avec le réglage retenu et on prend le code de volume dont le niveau est le plus proche de l’enregistrement.
-
Durée des trames. On regroupe les tranches de 8 ms en trames de 16, 32 ou 64 ms là où l’interpolation du chip trahit peu le signal, avec un prix par trame qui règle le compromis entre taille et fidélité.
-
Horloge. Le boîtier Cedic-Nathan fait tourner le chip à 4 MHz au lieu des 3,84 MHz de référence : tout joue 4 % trop vite et trop haut. L’encodeur analyse le son 4 % trop lent pour compenser, et la machine dit l’enregistrement à sa vitesse et sa hauteur d’origine.
Le simulateur
Le simulateur du projet est dérivé du composant MEA8000 écrit par Antoine Miné : un modèle au niveau des registres, en arithmétique entière, qui reproduit le chip bit à bit, y compris son interpolateur de sortie et son générateur de bruit. Deux corrections y ont été apportées: une division d’amplitude qui rendait muets les codes les plus faibles, et le fondu de la première trame qui était inversé.
Le rapport
La commande d’encodage peut produire une page HTML autonome qui montre le spectre de l’audio en entrée et en sortie.
L’enregistrement (une phrase de Mozilla Common Voice, voix féminine, français) :
Le rendu du chip, à partir de 1888 octets de trames :
Les résonateurs, trame par trame : le centre de chaque bande est la fréquence du formant, sa hauteur la largeur de bande, et les rampes sont celles que le chip interpole réellement.
Pour écouter :
L'enregistrement :
Le chip :
Ce qui marche, et ce qui ne marche pas
L’encodeur donne de bons résultats sur de la parole propre, parlée ou chantée, dans n’importe quelle langue. Sa bande utile va de 100 à 4000 Hz.
Utilisation
L’outil s’installe avec Python 3.12 ou plus récent, sur macOS, Linux ou Windows :
pip install mea8000-encoder
mea8000 encode voix.wav voix.mea --report
voix.mea contient les fichiers de parole, un par groupe de mots, dans le format de Philips ; voix.html est le rapport, avec à côté le WAV du rendu. Les autres commandes :
mea8000 render voix.mea voix.wav # entendre ce que dira le chip
mea8000 inspect voix.mea # le contenu du fichier, trame par trame
mea8000 profiles # les profils livrés
Un profil dit comment convertir : pour quelle machine (l’horloge), dans quel format, avec quelle politique de hauteur, quelle longueur de trame et quelle qualité, et à travers quels filtres. C’est un petit fichier TOML ; trois sont livrés, thomson par défaut, et chaque valeur se surcharge en ligne de commande.
clock_hz = 4000000 # le boîtier Cedic-Nathan cadence le chip à 4 MHz
format = "speech" # "speech" : fichiers de parole à la suite ; "vocabulary" : une
# image avec table d'offsets, chaque mot accessible par son numéro
pitch = "local" # une hauteur de départ par groupe de mots ; "global" : une seule
frame_ms = 8 # la trame la plus courte autorisée : 8, 16, 32 ou 64
quality = "best" # "best", "balanced" (environ 40 % d'octets en moins), "compact" (60 %)
channel = "left" # canal d'un enregistrement stéréo
highpass_hz = 0 # passe-haut avant analyse, 80 à 150 Hz contre les basses
normalize = true # ramène la crête à pleine échelle
trim = true # supprime le silence avant le premier son et après le dernier
Le même fichier peut porter des décisions sur des passages de l’enregistrement : forcer un passage au silence, à une hauteur, y démarrer un nouveau fichier. C’est ce qui permet de corriger à la main les rares endroits où l’analyse se trompe.
Côté 6809
Jouer un fichier de parole tient en quelques lignes. La routine ci-dessous a la forme du lecteur publié avec les démonstrations Cedic-Nathan : un arrêt, la hauteur de départ, puis chaque octet des trames après un test de REQ. Pas d’arrêt à la fin : la dernière trame d’un fichier a une amplitude nulle, le chip s’éteint dessus tout seul, et on attend qu’il l’ait fait avant le fichier suivant. Envoyer un STOP à ce moment-là ferait une course avec l’horloge du chip, et le son dépendrait du timing du processeur.
; play - joue un fichier de parole (format Philips / Cedic-Nathan)
; entrée : [X] adresse du fichier
; sortie : [X] adresse de l'octet suivant (le fichier suivant d'un flux)
play
pshs d,y,u
ldd ,x
leau d,x ; U = fin du fichier
pshs u ; gardée sur la pile pour le test de fin
ldb #$1A
stb map.MEA8000.A ; STOP, arrêt lent, REQ inactif
ldb 3,x ; hauteur de départ (l'octet libre en 2,x est ignoré)
leax 4,x
stb map.MEA8000.D ; accepté tout de suite : le chip est arrêté
@byte cmpx ,s ; fin du fichier ?
bhs @done
bsr @wait
lda ,x+
sta map.MEA8000.D
bra @byte
@done bsr @wait ; la trame de fin a démarré
ldy #3000 ; 24 ms : elle joue 8 ms, le chip s'éteint 8 ms plus tard
@settle leay -1,y ; (8 cycles par tour à 1 MHz)
bne @settle
leas 2,s
tfr u,x ; X = le fichier suivant
puls d,y,u,pc
@wait tst map.MEA8000.A ; REQ : bit 7 à 1 quand le chip accepte un octet
bpl @wait
rts
Sur TO8, les registres du boîtier sont en $E7FE (données) et $E7FF (commande). Le format des fichiers de parole et celui des images de vocabulaire, avec le protocole complet, sont documentés octet par octet dans le dépôt du projet.
Références
- Philips, MEA8000 voice synthesizer: principles and interfacing, Technical Publication 101, 1983.
- Signetics, MEA8000 datasheet, 1985.
- Parole et Micros, Cedic-Nathan, 1985.
- L’émulation MEA8000 par Antoine Miné (licence BSD-3).
- Le dépôt du projet : github.com/wide-dot/mea8000-encoder, licence MIT, avec trois échantillons et leurs rapports.

