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.

TO2026 · EXT 26-101PAROLEMEA8000 · 8 kHzCouper l’alimentationavant la mise en place.MEA8000
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 OCTETCONTENURÔLE
&HA7FEdonnée (écriture)hauteur de départ, puis les octets des trames
&HA7FFcommande (écriture)bit 4 : arrêt de la parole
lectureétatbit 7 à 1 : prête à recevoir une trame
trame, octet 0BW1 BW2 BW3 BW4largeurs de bande des 4 formants, 2 bits chacune
trame, octet 1FM3, FM2fréquence du formant 3 (3 bits), puis du formant 2 (5 bits)
trame, octet 2FM1, amplitudeformant 1 (5 bits), puis les 3 bits hauts de l’amplitude
trame, octet 3amplitude, durée, hauteurbit bas de l’amplitude, durée (8 à 64 ms), variation de hauteur (5 bits ; 16 = bruit)

03 / EN BASIC

Faire parler la machine.

INSTRUCTIONEFFET
SPEAK texte$lit un texte français, en tâche de fond ; une phrase suivante se met à la suite
SPEAK PITCH n / SPEAK SPEED nhauteur 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 STOPinterrompt la parole
SPEAKING / WAIT SPEAKvrai tant qu’elle parle / attendre la fin
PHONEMES$(texte$)la transcription en phonèmes, pour la vérifier ou la retoucher
PROGRAMME
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.

À L’ÉCRAN
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 ».

PROGRAMME
print phonemes$("bonjour")
print phonemes$("21 chats")
speak pitch 160 : speak phonemes "b o~ Z u R"
wait speak : speak pitch 110
À L’ÉCRAN
b 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.

PROGRAMME
print "pret :"; (peek(&HA7FF) and 128) = 128
speak "un"
print "parle :"; speaking
speak stop
print "arretee :"; speaking
À L’ÉCRAN
pret :-1
parle :-1
arretee : 0