LE VIRTUAL TO2026 / EXTENSIONS / EXT 26-101
Le synthétiseur vocal.
Le module EXT 26-101 porte la puce MEA8000, celle du synthétiseur vocal des Thomson, refaite d’après la documentation de Philips : une source sonore traverse quatre résonateurs réglés par des trames de 4 octets. Le TO2026 y ajoute la lecture du français : SPEAK "Bonjour" suffit.
- Référence
- TO2026 · EXT 26-101
- Module
- Synthétiseur vocal
- Puce
- MEA8000
- Port
- port d’extension EXT 26-112, sur le côté de l’écran
- Mise en place
- cocher le module dans EXTENSIONS, sur la page Explorer la machine
- SYNTHÈSE8 kHz
par formants, comme les synthétiseurs vocaux de 1985
- TRAME4 octets
8, 16, 32 ou 64 ms, les paramètres glissant de l’une à l’autre
- FORMANTS4
résonateurs en cascade
- REGISTRES&HA7FE
2 octets : donnée et commande
01 / CE QU’IL FAIT
Une voix faite de résonances.
La parole humaine est un son produit par les cordes vocales, ou un souffle, que la bouche et le nez filtrent : les résonances de ce filtre, les formants, font qu’un a ne sonne pas comme un i. Le MEA8000 reproduit ce principe. Une impulsion périodique (les voyelles, les consonnes voisées) ou un bruit (les s, les ch) traverse quatre résonateurs en cascade, dont la puce fait glisser les fréquences et les largeurs de bande d’une trame à la suivante.
Sur les Thomson, le programme devait fournir lui-même les trames. Le TO2026 ajoute une couche de lecture : SPEAK transcrit le texte en phonèmes par des règles du français, sans dictionnaire (les nombres sont lus en toutes lettres, la ponctuation donne les pauses et l’intonation), puis change chaque phonème en trames. La voix est robotique, comme en 1985, mais elle se comprend.
02 / LES REGISTRES
Deux octets, et des trames de quatre.
Le programme écrit d’abord la hauteur de départ dans le registre de donnée, puis les trames, octet par octet. La puce garde une trame d’avance : le bit 7 de l’état dit quand elle peut en recevoir une autre. La variation de hauteur 16 désigne le bruit au lieu de la voix.
| ADRESSE OU OCTET | CONTENU | RÔLE |
|---|---|---|
| &HA7FE | donnée (écriture) | hauteur de départ, puis les octets des trames |
| &HA7FF | commande (écriture) | bit 4 : arrêt de la parole |
| lecture | état | bit 7 à 1 : prête à recevoir une trame |
| trame, octet 0 | BW1 BW2 BW3 BW4 | largeurs de bande des 4 formants, 2 bits chacune |
| trame, octet 1 | FM3, FM2 | fréquence du formant 3 (3 bits), puis du formant 2 (5 bits) |
| trame, octet 2 | FM1, amplitude | formant 1 (5 bits), puis les 3 bits hauts de l’amplitude |
| trame, octet 3 | amplitude, durée, hauteur | bit bas de l’amplitude, durée (8 à 64 ms), variation de hauteur (5 bits ; 16 = bruit) |
03 / EN BASIC
Faire parler la machine.
| INSTRUCTION | EFFET |
|---|---|
SPEAK texte$ | lit un texte français, en tâche de fond ; une phrase suivante se met à la suite |
SPEAK PITCH n / SPEAK SPEED n | hauteur de 50 à 400 (110 par défaut), débit de 30 à 300 (100) |
SPEAK PHONEMES p$ | dit une suite de phonèmes, écrits comme les rend PHONEMES$ |
SPEAK CODE o$ | envoie des octets bruts à la puce, un caractère par octet |
SPEAK STOP | interrompt la parole |
SPEAKING / WAIT SPEAK | vrai tant qu’elle parle / attendre la fin |
PHONEMES$(texte$) | la transcription en phonèmes, pour la vérifier ou la retoucher |
speak "Bonjour, je suis le TO deux mille vingt-six." print "je parle :"; speaking wait speak print "fini :"; speaking
Au haut-parleur : « Bonjour, je suis le TO deux mille vingt-six », d’une voix de synthèse.
je parle :-1 fini : 0
Les phonèmes sont séparés par des espaces ; _ marque une pause. Une voix plus aiguë dit ensuite « bonjour ».
print phonemes$("bonjour")
print phonemes$("21 chats")
speak pitch 160 : speak phonemes "b o~ Z u R"
wait speak : speak pitch 110b o~ Z u R v e~ _ e _ e~ _ S a
04 / À LA MAIN
Lire l’état de la puce.
Le registre d’état se lit par PEEK, depuis les deux BASIC. Un programme qui envoie ses propres trames attend que le bit 7 passe à 1 avant chaque nouvelle trame ; SPEAK CODE s’en charge pour lui.
print "pret :"; (peek(&HA7FF) and 128) = 128 speak "un" print "parle :"; speaking speak stop print "arretee :"; speaking
pret :-1 parle :-1 arretee : 0