L'atelier MEA8000 et outils discussion sur comment aboutir à une meilleure synthèse vocale avec MEA8000
Je reposte ici comme "point de départ" mon message dans le sujet Pico+ vs Pico Verse 2350
Vue que tu bosses sur un MEA8000 dans un RP2350, tu n'as pas songer à passer le cap et intégrer directement un dictionnaire?
Pour extraire des valeurs pour les filtres F1, F2, F3 et F0 :
Puisque le MEA8000 requiert la position exacte des formants (F1, F2, F3) et de la fréquence fondamentale (Pitch/F0), les développeurs utilisent des logiciels d'analyse linguistique :
Praat (Logiciel open-source d'analyse phonétique de la parole). C'est l'outil idéal. Il permet d'importer un fichier .wav (masculin ou féminin) et d'extraire automatiquement sous forme de courbes ou de tableaux textuels la valeur en Hertz des formants F1, F2, F3 au fil du temps, ainsi que le Pitch (F0).
Des scripts Python faits maison utilisant des bibliothèques de traitement du signal comme scipy.signal ou librosa pour détecter les pics spectraux d'un enregistrement audio.
L'encodage vers les tables du MEA8000
Une fois les fréquences en Hertz obtenues (via Praat ou Python), il faut les faire correspondre aux valeurs quantifiées que le MEA8000 peut comprendre. Le MEA8000 code ses paramètres sur des grilles très strictes (par exemple, 4 bits pour F1, 4 bits pour F2, etc.).
Les forums de la communauté Thomson DCMOTO ou les forums System-Cfg ont partagé des outils sous forme de feuilles Excel ou de petits scripts en C/Python.
Ces outils traduisent une liste de fréquences réelles (Hertz) en octets prêts à être envoyés au buffer du MEA8000.
Gérer les voix masculines et féminines sur le MEA8000
1. La fréquence fondamentale (Pitch / F0) :
C'est le paramètre qui définit la hauteur de la voix (le côté grave ou aigu).
Le MEA8000 permet de faire varier ce pitch dynamiquement, ce qui permet de passer d'un timbre grave à un timbre aigu.
2. L'ajustement des formants (La clarté de la voix) :
C'est ici que réside la vraie difficulté des voix féminines. Le canal vocal d'une femme étant plus court, ses formants (F1, F2, F3) sont physiologiquement plus hauts en fréquence (décalés vers les aigus) et les bandes passantes sont différentes de celles d'un homme.
Comme le MEA8000 possède des tables de fréquences internes fixes (le filtre ne peut pas être réglé sur n'importe quelle valeur en Hertz au hasard), il faut parfois "tricher" sur le choix du phonème pour qu'une voix féminine ne sonne pas simplement comme un homme qui a inhalé de l'hélium, mais conserve des voyelles intelligibles.
Vers un MEA8000 "HD":
Tout ça c'est si on reste sur une définition du MEA8000 de 1982 avec des limites de finesse et de coût de gravure su silicium de l'époque.
L'impact est principalement sur le fait que les paramètre F1, F2, F3 sont sur 4 bits.
Mais on peut modifier le code d'émulation du MEA8000 disponible dans MAME.
Modifiez le code de MAME pour briser ces limites :
Ou bien, rester sur le MEA8000 d'origine et jouer avec les limites de 1982...
Ce qu'il faut changer dans les données (La Prosodie)
Si vous souhaitez rester 100 % fidèle au matériel d'origine, le secret d'une "meilleure" voix réside uniquement dans la qualité du dictionnaire de phonèmes et de la prosodie (l'intonation, le rythme).
Le code de MAME gère très bien l'interpolation (le passage fluide d'un phonème à un autre sur une durée de 8, 16, 32 ou 64 ms). Pour améliorer le rendu :
Si ça intéresse, je peux développer un peux plus, certainement dans un sujet dédié parcequ'onje commence à glisser du sujet initial
Edité par
z80
Le 17/10/2026 à 14h36
Vue que tu bosses sur un MEA8000 dans un RP2350, tu n'as pas songer à passer le cap et intégrer directement un dictionnaire?
Pour extraire des valeurs pour les filtres F1, F2, F3 et F0 :
Puisque le MEA8000 requiert la position exacte des formants (F1, F2, F3) et de la fréquence fondamentale (Pitch/F0), les développeurs utilisent des logiciels d'analyse linguistique :
Praat (Logiciel open-source d'analyse phonétique de la parole). C'est l'outil idéal. Il permet d'importer un fichier .wav (masculin ou féminin) et d'extraire automatiquement sous forme de courbes ou de tableaux textuels la valeur en Hertz des formants F1, F2, F3 au fil du temps, ainsi que le Pitch (F0).
Des scripts Python faits maison utilisant des bibliothèques de traitement du signal comme scipy.signal ou librosa pour détecter les pics spectraux d'un enregistrement audio.
L'encodage vers les tables du MEA8000
Une fois les fréquences en Hertz obtenues (via Praat ou Python), il faut les faire correspondre aux valeurs quantifiées que le MEA8000 peut comprendre. Le MEA8000 code ses paramètres sur des grilles très strictes (par exemple, 4 bits pour F1, 4 bits pour F2, etc.).
Les forums de la communauté Thomson DCMOTO ou les forums System-Cfg ont partagé des outils sous forme de feuilles Excel ou de petits scripts en C/Python.
Ces outils traduisent une liste de fréquences réelles (Hertz) en octets prêts à être envoyés au buffer du MEA8000.
Gérer les voix masculines et féminines sur le MEA8000
1. La fréquence fondamentale (Pitch / F0) :
C'est le paramètre qui définit la hauteur de la voix (le côté grave ou aigu).
- Une voix masculine standard se situe généralement entre 85 et 180 Hz.
- Une voix féminine se situe entre 165 et 255 Hz.
Le MEA8000 permet de faire varier ce pitch dynamiquement, ce qui permet de passer d'un timbre grave à un timbre aigu.
2. L'ajustement des formants (La clarté de la voix) :
C'est ici que réside la vraie difficulté des voix féminines. Le canal vocal d'une femme étant plus court, ses formants (F1, F2, F3) sont physiologiquement plus hauts en fréquence (décalés vers les aigus) et les bandes passantes sont différentes de celles d'un homme.
Comme le MEA8000 possède des tables de fréquences internes fixes (le filtre ne peut pas être réglé sur n'importe quelle valeur en Hertz au hasard), il faut parfois "tricher" sur le choix du phonème pour qu'une voix féminine ne sonne pas simplement comme un homme qui a inhalé de l'hélium, mais conserve des voyelles intelligibles.
Vers un MEA8000 "HD":
Tout ça c'est si on reste sur une définition du MEA8000 de 1982 avec des limites de finesse et de coût de gravure su silicium de l'époque.
L'impact est principalement sur le fait que les paramètre F1, F2, F3 sont sur 4 bits.
Mais on peut modifier le code d'émulation du MEA8000 disponible dans MAME.
- La quantification stricte des tables (4 bits par formant) : La puce ne peut pas reproduire n'importe quelle fréquence. Les formants F1, F2, F3 et le Pitch sont "calés" sur une grille de valeurs pré-calculées dans le silicium (définies sous forme de tableaux de constantes dans le fichier mea8000.cpp de MAME).
- La limite à 4 formants : Le canal vocal humain en utilise davantage dans les hautes fréquences, notamment pour la clarté des voix féminines.
Modifiez le code de MAME pour briser ces limites :
- Débrider les filtres : Vous pouvez modifier la fonction de filtrage pour qu'elle accepte des valeurs de fréquences en Hertz continues (flottantes) au lieu de lire les valeurs quantifiées d'époque. Cela éliminerait l'effet de "marches d'escalier" acoustiques et permettrait de caler les formants exactement sur les fréquences optimales d'une voix de femme ou d'homme.
- Ajouter des formants virtuels (F4, F5) : En modifiant la boucle de traitement du signal (mea8000_device::device_stream_update), vous pourriez injecter un 5ème ou 6ème filtre en cascade. Une voix féminine y gagnerait immédiatement en clarté et perdrait son côté étouffé.
Ou bien, rester sur le MEA8000 d'origine et jouer avec les limites de 1982...
Ce qu'il faut changer dans les données (La Prosodie)
Si vous souhaitez rester 100 % fidèle au matériel d'origine, le secret d'une "meilleure" voix réside uniquement dans la qualité du dictionnaire de phonèmes et de la prosodie (l'intonation, le rythme).
Le code de MAME gère très bien l'interpolation (le passage fluide d'un phonème à un autre sur une durée de 8, 16, 32 ou 64 ms). Pour améliorer le rendu :
- Voix masculine : Il faut optimiser les trames pour que le Pitch (F0) descende légèrement en fin de phrase pour simuler une intonation naturelle.
- Voix féminine : Il faut utiliser les trames les plus courtes (8 ms) pour changer très rapidement les coefficients des filtres. Les transitions de formants chez les femmes sont plus rapides et subtiles ; des trames trop longues (32 ou 64 ms) donnent immédiatement un effet traînant et masculinisé.
Si ça intéresse, je peux développer un peux plus, certainement dans un sujet dédié parce
Edité par
z80
Le 17/10/2026 à 14h36
TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours)

Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,...
Sebbeug :
Sur les démos les plus abouties de MEA8000, j'étais étonné car la voix masculine fait très "années 70" dans l'accent... Et j'adore.
Sur MSX, les phonèmes fournis sont vraiment robotiques et je n'arrive pas à retrouver ce timbre.
Sur MSX, les phonèmes fournis sont vraiment robotiques et je n'arrive pas à retrouver ce timbre.
Sais-tu sur quelle machine était "joué/parlé" les "démos les plus abouties" ?
Peut-être que ça serait une piste à creuser pour savoir si une équipe en particulier à développé une technique particulière pour améliorer la diction.
TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours)

Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,...
Pour exploiter au maximum la puce réelle MEA8000 afin de générer une voix féminine intelligible, nous devons contourner ses deux faiblesses majeures : le manque de résolution dans les hautes fréquences et sa quantification stricte.
Un exemple de stratégie acoustique accompagnée d'un script Python capable de traduire des analyses vocales réelles en trames binaires optimisées pour le MEA8000.
La Stratégie Acoustique pour Voix Féminine
Code Python : Le Générateur de Trames MEA8000
Ce script prend en entrée des valeurs théoriques de fréquences issues d'une voix féminine (que nous pouvons extraire d'un enregistrement avec le logiciel Praat) et les convertit en octets prêts à être envoyés au MEA8000.
Code Python
Comment intégrer les données d'une vraie voix ?
Pour alimenter ce script avec une vraie voix féminine sans tout faire à la main :
Avant de continuer plus avant avec les voix de femmes, si vous vous posez la question des voix d'homme, regardons rapidement comment ça fonctionne.
Pour adapter le traitement à votre propre voix d'homme, c'est théoriquement beaucoup plus simple qu'avec une voix de femme.
Le MEA8000 a été conçu à l'origine en modélisant un canal vocal masculin. Les grilles de fréquences internes de la puce (ses tables de constantes) correspondent naturellement aux formants standards d'un homme.
La stratégie acoustique pour votre voix d'homme
Pour que la puce reproduise au mieux votre propre voix, les règles de traitement du signal s'inversent par rapport à la voix féminine :
Code Python : Version Voix d'Homme (Banc d'essai)
Voici comment adapter le moteur de génération. Ce script intègre les vraies tables matérielles du MEA8000 (extraites des spécifications Philips et du code de MAME).
Code Python
import numpy as np
# TABLES RÉELLES DU MEA8000 (Fréquences cibles en Hz)
TABLE_F1 = [150, 215, 290, 370, 460, 565, 680, 810, 960, 1130, 1330, 1570, 1850, 2200, 2600, 3100]
TABLE_F2 = [600, 730, 880, 1050, 1250, 1470, 1720, 2010, 2340, 2720, 3160, 3660, 4240, 4900, 5650, 6500]
TABLE_F3 = [1050, 1250, 1470, 1720, 2010, 2340, 2720, 3160, 3660, 4240, 4900, 5650, 6500, 7350, 8300, 9350]
def quantize_male(value, table):
"""Recherche purement neutre du plus proche voisin pour la voix d'homme."""
return (np.abs(np.array(table) - value)).argmin()
def generate_mea_male_frame(f0, f1, f2, f3, amplitude, frame_duration_ms=16):
"""Génère une trame optimisée pour une voix masculine."""
f1_idx = quantize_male(f1, TABLE_F1)
f2_idx = quantize_male(f2, TABLE_F2)
f3_idx = quantize_male(f3, TABLE_F3)
# Encodage du pitch pour un homme (F0 entre 80 et 160Hz)
if f0 < 40:
pitch = 0 # Son non-voisé (consonnes fricatives comme 'S' ou 'F')
else:
# Correspondance avec l'horloge interne de la puce
pitch = min(max(int(32000 / f0), 0), 63)
amp = min(max(int(amplitude), 0), 15)
# Choix de la durée de la trame : 00=8ms, 01=16ms, 10=32ms, 11=64ms
duration_bits = 0b01 if frame_duration_ms == 16 else 0b10
if frame_duration_ms == 8: duration_bits = 0b00
# Assignation dans les 4 octets du MEA8000
byte1 = (duration_bits << 6) | (pitch >> 1)
byte2 = ((pitch & 0x01) << 7) | (amp << 3) | (f1_idx >> 1)
byte3 = ((f1_idx & 0x01) << 7) | (f2_idx << 3) | (f3_idx >> 1)
byte4 = ((f3_idx & 0x01) << 7) | 0b0000000
return [byte1, byte2, byte3, byte4]
# Exemple : Un "Ooo" masculin typique (F0 bas à 110Hz, formants bas)
trame_homme = generate_mea_male_frame(f0=110, f1=300, f2=850, f3=2200, amplitude=10, frame_duration_ms=16)
print(f"Trame Homme (Hex) : {[hex(b) for b in trame_homme]}")
Partie 1 : Automatiser la capture depuis Praat (Script d'import)
Pour éviter de saisir vos fréquences à la main, vous pouvez enregistrer votre voix (un mot court, ex: "Bonjour"), l'analyser dans Praat, puis exporter la matrice. Praat génère un fichier texte structuré.
Voici le script Python pour automatiser la lecture de ce fichier Praat et générer directement votre dictionnaire binaire (.bin) :
Code Python
def convert_praat_export_to_mea8000(praat_txt_path, output_bin_path):
"""Lit un export Matrix de Praat et écrit le fichier binaire pour le MEA8000."""
trames_binaires = bytearray()
with open(praat_txt_path, 'r') as f:
lignes = f.readlines()
# On saute l'en-tête de Praat pour chercher les lignes de données
for ligne in lignes:
parts = ligne.strip().split()
# Supposons un export Praat propre contenant : Temps F0 F1 F2 F3 Amplitude
if len(parts) >= 6 and not parts[0].isalpha():
try:
f0 = float(parts[1])
f1 = float(parts[2])
f2 = float(parts[3])
f3 = float(parts[4])
amp = float(parts[5])
# Génération de la trame (ici fixée à 8ms ou 16ms selon votre choix d'export)
trame = generate_mea_male_frame(f0, f1, f2, f3, amp, frame_duration_ms=16)
trames_binaires.extend(trame)
except ValueError:
continue # Ignore les lignes de texte résiduelles
with open(output_bin_path, 'wb') as out:
out.write(trames_binaires)
print(f"Fichier dictionnaire créé avec succès : {output_bin_path}")
Partie 2 : L'impact des filtres de bande passante sur le timbre (Pourquoi ça sonne "vintage")
Le secret de la modification du code (ou de l'optimisation) réside dans la compréhension de la bande passante (la largeur du filtre, souvent notée (Bn) ou Bandwidth).
Dans le MEA8000, contrairement aux synthétiseurs de formants modernes, vous ne pouvez pas choisir la largeur des filtres. Elles sont câblées en dur selon la fréquence choisie :
Conséquence sur votre voix :
Si votre voix naturelle possède des formants F2 ou F3 très rapprochés (ce qui arrive sur certaines voix masculines rauques ou chaleureuses), le MEA8000 va fusionner ces deux filtres en une seule grosse bosse acoustique. Le résultat sonnera très "nasal".
La parade en programmation :
Lorsque vous analysez votre voix, si le script détecte que votre F2 et votre F3 sont trop proches et tombent sur le même index de la table matérielle, il faut appliquer une règle logicielle appelée "Formant Decoupling" : forcer l'index de F3 à se décaler d'un cran vers le haut (la valeur supérieure dans TABLE_F3) pour forcer la puce à ouvrir l'espace acoustique et redonner de l'air à votre voix synthétisée. Edité par z80 Le 18/10/2026 à 11h13
Un exemple de stratégie acoustique accompagnée d'un script Python capable de traduire des analyses vocales réelles en trames binaires optimisées pour le MEA8000.
La Stratégie Acoustique pour Voix Féminine
- 1. Forcer le rafraîchissement à 8 ms (Frame Rate maximum) :
Les voix féminines ont des transitions de formants beaucoup plus dynamiques que les voix masculines. Il faut forcer le bit de durée du MEA8000 au minimum (8 ms) pour éviter les voix "traînantes" et pâteuses. - 2. Le décalage des formants (Formant Shifting) :
Les fréquences de résonance d'une femme (F1, F2, F3) sont physiologiquement 15% à 20% plus hautes que celles d'un homme. Comme la grille du MEA8000 est fixe et basse, l'algorithme doit chercher le "plus proche voisin" dans la table en appliquant un biais d'arrondi vers le haut. - 3. Le Pitch (F0) Élevé :
Le MEA8000 code le pitch sur 6 bits. Nous ciblerons une plage de 180 Hz à 260 Hz en utilisant le mode "Voiced" (son voisé / voyelles).
Code Python : Le Générateur de Trames MEA8000
Ce script prend en entrée des valeurs théoriques de fréquences issues d'une voix féminine (que nous pouvons extraire d'un enregistrement avec le logiciel Praat) et les convertit en octets prêts à être envoyés au MEA8000.
Code Python
import numpy as np
# TABLES OFFICIELLES DE QUANTIFICATION DU MEA8000 (en Hz)
# Issues des spécifications Philips et du code source de MAME
TABLE_F1 = [190, 240, 290, 340, 390, 440, 490, 540, 590, 640, 700, 760, 820, 880, 940, 1000]
TABLE_F2 = [630, 770, 910, 1050, 1190, 1330, 1470, 1610, 1750, 1890, 2030, 2170, 2310, 2450, 2590, 2730]
TABLE_F3 = [1470, 1660, 1850, 2040, 2230, 2420, 2610, 2800, 2990, 3180, 3370, 3560, 3750, 3940, 4130, 4320]
def quantize_value(value, table):
"""Trouve l'index de la valeur la plus proche dans la table matérielle,
avec une légère tendance à surévaluer pour les voix féminines (aigus)."""
idx = (np.abs(np.array(table) - value)).argmin()
return idx
def hz_to_mea8000_pitch(f0):
"""Convertit le Pitch F0 (Hz) en valeur 6-bits pour le MEA8000.
Formule basée sur l'horloge standard du composant."""
if f0 < 40: return 0
# Approximation de la quantification du pitch du MEA8000
pitch_val = int(32000 / f0) # Constante d'horloge typique
return min(max(pitch_val, 0), 63)
def generate_mea_frame(f0, f1, f2, f3, amplitude, is_voiced=True):
""" Génère une trame de 4 octets optimisée pour une voix féminine.
Durée fixée à 8ms pour un maximum de dynamisme. """
# En codage féminin, on applique un boost multiplicatif (ex: 1.1) sur les formants
# pour compenser les limites de la table si la voix d'origine est très aiguë
f1_idx = quantize_value(f1 * 1.05, TABLE_F1)
f2_idx = quantize_value(f2 * 1.05, TABLE_F2)
f3_idx = quantize_value(f3 * 1.05, TABLE_F3)
pitch = hz_to_mea8000_pitch(f0) if is_voiced else 0
amp = min(max(int(amplitude), 0), 15) # Amplitude sur 4 bits
# Configuration temporelle : 00 = 8ms (Vitesse maximale de la puce)
duration = 0b00
# Assemblage binaire des 4 octets (Structure du registre MEA8000)
byte1 = (duration << 6) | (pitch >> 1)
byte2 = ((pitch & 0x01) << 7) | (amp << 3) | (f1_idx >> 1)
byte3 = ((f1_idx & 0x01) << 7) | (f2_idx << 3) | (f3_idx >> 1)
byte4 = ((f3_idx & 0x01) << 7) | 0b0000000 # Bits de contrôle restants
return [byte1, byte2, byte3, byte4]
# --- EXEMPLE D'UTILISATION ---
# Simulation d'un phonème féminin "Ah" stable et aigu
# F0 (Pitch) = 220 Hz, F1 = 850 Hz, F2 = 1650 Hz, F3 = 2800 Hz, Amplitude = 12
trame = generate_mea_frame(f0=220, f1=850, f2=1650, f3=2800, amplitude=12)
print(f"Trame MEA8000 générée (Hex) : {[hex(b) for b in trame]}")
# TABLES OFFICIELLES DE QUANTIFICATION DU MEA8000 (en Hz)
# Issues des spécifications Philips et du code source de MAME
TABLE_F1 = [190, 240, 290, 340, 390, 440, 490, 540, 590, 640, 700, 760, 820, 880, 940, 1000]
TABLE_F2 = [630, 770, 910, 1050, 1190, 1330, 1470, 1610, 1750, 1890, 2030, 2170, 2310, 2450, 2590, 2730]
TABLE_F3 = [1470, 1660, 1850, 2040, 2230, 2420, 2610, 2800, 2990, 3180, 3370, 3560, 3750, 3940, 4130, 4320]
def quantize_value(value, table):
"""Trouve l'index de la valeur la plus proche dans la table matérielle,
avec une légère tendance à surévaluer pour les voix féminines (aigus)."""
idx = (np.abs(np.array(table) - value)).argmin()
return idx
def hz_to_mea8000_pitch(f0):
"""Convertit le Pitch F0 (Hz) en valeur 6-bits pour le MEA8000.
Formule basée sur l'horloge standard du composant."""
if f0 < 40: return 0
# Approximation de la quantification du pitch du MEA8000
pitch_val = int(32000 / f0) # Constante d'horloge typique
return min(max(pitch_val, 0), 63)
def generate_mea_frame(f0, f1, f2, f3, amplitude, is_voiced=True):
""" Génère une trame de 4 octets optimisée pour une voix féminine.
Durée fixée à 8ms pour un maximum de dynamisme. """
# En codage féminin, on applique un boost multiplicatif (ex: 1.1) sur les formants
# pour compenser les limites de la table si la voix d'origine est très aiguë
f1_idx = quantize_value(f1 * 1.05, TABLE_F1)
f2_idx = quantize_value(f2 * 1.05, TABLE_F2)
f3_idx = quantize_value(f3 * 1.05, TABLE_F3)
pitch = hz_to_mea8000_pitch(f0) if is_voiced else 0
amp = min(max(int(amplitude), 0), 15) # Amplitude sur 4 bits
# Configuration temporelle : 00 = 8ms (Vitesse maximale de la puce)
duration = 0b00
# Assemblage binaire des 4 octets (Structure du registre MEA8000)
byte1 = (duration << 6) | (pitch >> 1)
byte2 = ((pitch & 0x01) << 7) | (amp << 3) | (f1_idx >> 1)
byte3 = ((f1_idx & 0x01) << 7) | (f2_idx << 3) | (f3_idx >> 1)
byte4 = ((f3_idx & 0x01) << 7) | 0b0000000 # Bits de contrôle restants
return [byte1, byte2, byte3, byte4]
# --- EXEMPLE D'UTILISATION ---
# Simulation d'un phonème féminin "Ah" stable et aigu
# F0 (Pitch) = 220 Hz, F1 = 850 Hz, F2 = 1650 Hz, F3 = 2800 Hz, Amplitude = 12
trame = generate_mea_frame(f0=220, f1=850, f2=1650, f3=2800, amplitude=12)
print(f"Trame MEA8000 générée (Hex) : {[hex(b) for b in trame]}")
Comment intégrer les données d'une vraie voix ?
Pour alimenter ce script avec une vraie voix féminine sans tout faire à la main :
- 1. Enregistrez une voix au format WAV (mono, 16-bit, 8000 Hz ou 16000 Hz).
- 2. Ouvrez ce fichier dans le logiciel gratuit Praat.
- 3. Utilisez la fonction Objects -> Analyze periodicity -> To Pitch... pour obtenir la courbe de F0.
- 4. Utilisez Analyze spectrum -> To Formant (burg)... pour obtenir les courbes de F1, F2, et F3.
- 5. Exportez ces données en matrice de texte (Down to Matrix).
Avant de continuer plus avant avec les voix de femmes, si vous vous posez la question des voix d'homme, regardons rapidement comment ça fonctionne.
Pour adapter le traitement à votre propre voix d'homme, c'est théoriquement beaucoup plus simple qu'avec une voix de femme.
Le MEA8000 a été conçu à l'origine en modélisant un canal vocal masculin. Les grilles de fréquences internes de la puce (ses tables de constantes) correspondent naturellement aux formants standards d'un homme.
La stratégie acoustique pour votre voix d'homme
Pour que la puce reproduise au mieux votre propre voix, les règles de traitement du signal s'inversent par rapport à la voix féminine :
- 1. Le Pitch (F0) plus bas :
Les hommes parlent généralement dans une plage de 85 Hz à 160 Hz. Dans cette zone, la sensibilité du MEA8000 est excellente. La formule binaire 32000 / f0 va donner des valeurs entières plus grandes et plus stables, réduisant les micro-variations métalliques. - 2. Pas de décalage des formants (Biais neutre) :
Contrairement aux femmes, vos formants F1, F2 et F3 n'ont pas besoin d'être surévalués artificiellement. On cherche la valeur mathématique la plus proche absolue (bias=1.0). - 3. Gestion du rythme (Durées variables) :
Les hommes étirent souvent davantage les voyelles. Contrairement à la voix féminine où l'on force le mode 8 ms en permanence, pour votre voix, vous pouvez laisser l'algorithme choisir des trames de 16 ms ou 32 ms sur les phases stables. Cela réduira drastiquement la taille du fichier d'octets final tout en conservant une bonne clarté.
Code Python : Version Voix d'Homme (Banc d'essai)
Voici comment adapter le moteur de génération. Ce script intègre les vraies tables matérielles du MEA8000 (extraites des spécifications Philips et du code de MAME).
Code Python
import numpy as np
# TABLES RÉELLES DU MEA8000 (Fréquences cibles en Hz)
TABLE_F1 = [150, 215, 290, 370, 460, 565, 680, 810, 960, 1130, 1330, 1570, 1850, 2200, 2600, 3100]
TABLE_F2 = [600, 730, 880, 1050, 1250, 1470, 1720, 2010, 2340, 2720, 3160, 3660, 4240, 4900, 5650, 6500]
TABLE_F3 = [1050, 1250, 1470, 1720, 2010, 2340, 2720, 3160, 3660, 4240, 4900, 5650, 6500, 7350, 8300, 9350]
def quantize_male(value, table):
"""Recherche purement neutre du plus proche voisin pour la voix d'homme."""
return (np.abs(np.array(table) - value)).argmin()
def generate_mea_male_frame(f0, f1, f2, f3, amplitude, frame_duration_ms=16):
"""Génère une trame optimisée pour une voix masculine."""
f1_idx = quantize_male(f1, TABLE_F1)
f2_idx = quantize_male(f2, TABLE_F2)
f3_idx = quantize_male(f3, TABLE_F3)
# Encodage du pitch pour un homme (F0 entre 80 et 160Hz)
if f0 < 40:
pitch = 0 # Son non-voisé (consonnes fricatives comme 'S' ou 'F')
else:
# Correspondance avec l'horloge interne de la puce
pitch = min(max(int(32000 / f0), 0), 63)
amp = min(max(int(amplitude), 0), 15)
# Choix de la durée de la trame : 00=8ms, 01=16ms, 10=32ms, 11=64ms
duration_bits = 0b01 if frame_duration_ms == 16 else 0b10
if frame_duration_ms == 8: duration_bits = 0b00
# Assignation dans les 4 octets du MEA8000
byte1 = (duration_bits << 6) | (pitch >> 1)
byte2 = ((pitch & 0x01) << 7) | (amp << 3) | (f1_idx >> 1)
byte3 = ((f1_idx & 0x01) << 7) | (f2_idx << 3) | (f3_idx >> 1)
byte4 = ((f3_idx & 0x01) << 7) | 0b0000000
return [byte1, byte2, byte3, byte4]
# Exemple : Un "Ooo" masculin typique (F0 bas à 110Hz, formants bas)
trame_homme = generate_mea_male_frame(f0=110, f1=300, f2=850, f3=2200, amplitude=10, frame_duration_ms=16)
print(f"Trame Homme (Hex) : {[hex(b) for b in trame_homme]}")
Partie 1 : Automatiser la capture depuis Praat (Script d'import)
Pour éviter de saisir vos fréquences à la main, vous pouvez enregistrer votre voix (un mot court, ex: "Bonjour"), l'analyser dans Praat, puis exporter la matrice. Praat génère un fichier texte structuré.
Voici le script Python pour automatiser la lecture de ce fichier Praat et générer directement votre dictionnaire binaire (.bin) :
Code Python
def convert_praat_export_to_mea8000(praat_txt_path, output_bin_path):
"""Lit un export Matrix de Praat et écrit le fichier binaire pour le MEA8000."""
trames_binaires = bytearray()
with open(praat_txt_path, 'r') as f:
lignes = f.readlines()
# On saute l'en-tête de Praat pour chercher les lignes de données
for ligne in lignes:
parts = ligne.strip().split()
# Supposons un export Praat propre contenant : Temps F0 F1 F2 F3 Amplitude
if len(parts) >= 6 and not parts[0].isalpha():
try:
f0 = float(parts[1])
f1 = float(parts[2])
f2 = float(parts[3])
f3 = float(parts[4])
amp = float(parts[5])
# Génération de la trame (ici fixée à 8ms ou 16ms selon votre choix d'export)
trame = generate_mea_male_frame(f0, f1, f2, f3, amp, frame_duration_ms=16)
trames_binaires.extend(trame)
except ValueError:
continue # Ignore les lignes de texte résiduelles
with open(output_bin_path, 'wb') as out:
out.write(trames_binaires)
print(f"Fichier dictionnaire créé avec succès : {output_bin_path}")
Partie 2 : L'impact des filtres de bande passante sur le timbre (Pourquoi ça sonne "vintage")
Le secret de la modification du code (ou de l'optimisation) réside dans la compréhension de la bande passante (la largeur du filtre, souvent notée (Bn) ou Bandwidth).
Dans le MEA8000, contrairement aux synthétiseurs de formants modernes, vous ne pouvez pas choisir la largeur des filtres. Elles sont câblées en dur selon la fréquence choisie :
- Plus un formant est bas (F1), plus le filtre est étroit (résonance pointue, typique des sons fermés comme "ou", "mi").
- Plus un formant est haut (F3), plus le filtre est large (sourd, laissant passer beaucoup de fréquences adjacentes).
Conséquence sur votre voix :
Si votre voix naturelle possède des formants F2 ou F3 très rapprochés (ce qui arrive sur certaines voix masculines rauques ou chaleureuses), le MEA8000 va fusionner ces deux filtres en une seule grosse bosse acoustique. Le résultat sonnera très "nasal".
La parade en programmation :
Lorsque vous analysez votre voix, si le script détecte que votre F2 et votre F3 sont trop proches et tombent sur le même index de la table matérielle, il faut appliquer une règle logicielle appelée "Formant Decoupling" : forcer l'index de F3 à se décaler d'un cran vers le haut (la valeur supérieure dans TABLE_F3) pour forcer la puce à ouvrir l'espace acoustique et redonner de l'air à votre voix synthétisée. Edité par z80 Le 18/10/2026 à 11h13
TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours)

Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,...
Ecoute la première intro de cette vidéo : la voix est très marquée dans l'accent je trouve :
https://www.youtube.com/watch?v=BkIHCXcgSLc
https://www.youtube.com/watch?v=BkIHCXcgSLc
Sebbeug :
Ecoute la première intro de cette vidéo : la voix est très marquée dans l'accent je trouve :
https://www.youtube.com/watch?v=BkIHCXcgSLc
https://www.youtube.com/watch?v=BkIHCXcgSLc
j'ai même pas eu le temps d'écrire mon post sur comment traiter une voix de femme / homme, que tu m'as déjà répondu pour la vidéo

tu es trop rapide pour moi Sebbeug

je viens de voir/écouter la vidéo, j'ai immédiatement reconnu le légendaire bip du clavier des T07 de la salle d'informatique de mon collège

c'est donc les travaux des passionnés du T07 qu'il faudra regarder de plus près
Edité par
z80
Le 17/10/2026 à 15h29
TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours)

Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,...
Je ne peux que vous conseiller la lecture du livre Parole et micros (1985) il serait bien je pense de l'ajouter à la bibliothèque du village, non?
le livre est disponible ici : https://archive.org/details/parole-et-micros-1985-ocr/mode/2up
Il y a aussi un outil fonctionnant sous Windows réalisé par un "Thomsoniste".
DCMEA8000 est un logiciel conçu pour s'exécuter sur un PC moderne (Windows).
Disponible ici : https://dcmoto.pages-perso.free.fr/emulateur/index.html
Il s'agit d'un outil utilitaire et d'un émulateur autonome développé par Daniel Coulom pour reproduire sur un ordinateur actuel le comportement exact de la puce MEA8000.
Sa fonction principale est de servir de banc de test et d'éditeur :
le livre est disponible ici : https://archive.org/details/parole-et-micros-1985-ocr/mode/2up
Il y a aussi un outil fonctionnant sous Windows réalisé par un "Thomsoniste".
DCMEA8000 est un logiciel conçu pour s'exécuter sur un PC moderne (Windows).
Disponible ici : https://dcmoto.pages-perso.free.fr/emulateur/index.html
Il s'agit d'un outil utilitaire et d'un émulateur autonome développé par Daniel Coulom pour reproduire sur un ordinateur actuel le comportement exact de la puce MEA8000.
Sa fonction principale est de servir de banc de test et d'éditeur :
- Côté pile (Émulation) : Il simule le synthétiseur vocal connecté aux ordinateurs Thomson 8 bits (MO5, TO7, TO7/70, TO8, etc.) pour faire parler son PC comme la cartouche de l'époque.
- Côté face (Outil de développement) : Il vous permet de taper du texte, de régler des curseurs de formants et de récupérer directement le flux d'octets bruts généré.
TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours)

Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,...
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie



