Dessiner un discours: Software Automatic Mouth

J'ai conclu l' article de l'année dernière «Nous dessinons du son» par la reconnaissance: «Est-il possible de dessiner le son d'une feuille vierge sans tracer le spectrogramme de l'enregistrement audio? Franchement, je n'ai pas réussi. " Mais j'ai récemment entendu parler de SAM - sorti en 1982 par Don't Ask Software, c'était le premier programme de synthèse vocale sur PC à succès commercial. Au milieu des années 2000, les évaluateurs de démonstration allemands Tobias Korbmacher et Sebastian Macke ont pris une liste SAM assemblée pour Commodore 64 et l'ont convertie en code C illisible, mais réalisable; puis en 2014, le britannique Vidar Hokstad a essayé de mettre le code C sous une forme lisible - en donnant manuellement aux variables des noms significatifs et en remplaçantgotosur les boucles et les branches; et enfin, en 2017, un autre allemand Christian Schiffler a réécrit le code de C en JavaScript. Vous pouvez l'essayer en action sous forme de "boîte noire" sur discordier.imtqy.com/sam .

À mon avis, un synthétiseur vocal JavaScript primitif est le modèle expérimental le plus pratique pour ceux qui veulent comprendre comment fonctionne la synthèse vocale en général. Ma fourchette SAM avec du code et des commentaires considérablement nettoyés est disponible sur github.com/tyomitch/sam . Malheureusement, les auteurs précédents ont réussi à dissiper l'intérêt pour SAM, et maintenant ils n'ont pas le temps d'analyser les demandes de tirage pour un projet de loisir de longue date.

SAM se compose de quatre composants fonctionnels:

  1. Reciter traduit le texte anglais en un enregistrement de phonème: par exemple, «A LITTLE TOO LOW» (un exemple du programme de démonstration joint à SAM ) se transforme en «AH LIHTUL TUW5 LOW».
  2. L'analyseur transforme un enregistrement phonémique en enregistrement phonétique: à partir de "AH LIHTUL TUW5 LOW" il s'avère " AH, ,L,IH,DX,AX,LX, ,T,*,*,UX,WX, ,L,OW,WX". Pour chaque arrière-plan affiché, l' analyseur définit également la durée et la tonalité.
  3. Renderer construit un tableau de fréquences, d'amplitudes et d'autres caractéristiques acoustiques à partir de l'enregistrement phonétique;
  4. Le dernier composant (fonction ProcessFrames) anonyme transforme un tableau de fréquences et d'amplitudes en un flux PCM pour la sortie audio.

Dans cet article, je vais analyser les quatre composants tour à tour.

Récitant


Reciter était rattaché à SAM en tant que programme distinct: les créateurs ont déclaré que les règles de prononciation du Reciter 469 énoncées dans le Reciter transcrivaient correctement environ 90% des mots anglais. Cela signifie que la transcription de chaque dixième mot nécessitait une édition manuelle avant de le soumettre à l'entrée des composants suivants.

SAM utilise son propre système de transcription , où les phonèmes anglais sont indiqués par des caractères séparés d'un ensemble [A-Z/]ou par paires de deux de ces caractères:
PhonèmeLa désignationPhonèmeLa désignationPhonèmeLa désignationPhonèmeLa désignation
/ b /B/ p /P/ v /V/ F /F
/ ré /D/ t /T/ z /Z/ s /S
/ dʒ /J/ tʃ /CH/ ʒ /ZH/ ʃ /SH
/ g /G/ k /K/ h //H/ ré /DH
/ m /M/ n /N/ ŋ /NX/ θ /TH
/ l /L/ r /R/ j /Y/ w /W
/ æ /AE/ ɛ /EH/ ɪ /IH/ je /IY
/ ʌ /AH/ ɔ /AO/ ʊ /UH/ u /UX
/ ɒ /OH/ ɑ /AA/ ə /AX/ ɜ /ER
/ eɪ /EY/ aɪ /AY/ ɔɪ /OY/ aʊ /AW
/ oʊ /OW[l̩]UL[m̩]UM[n̩]UN
En plus des phonèmes, les nombres 1 à 8 sont utilisés dans la transcription SAM pour désigner le stress et le ton : 1 signifie un stress «très émotionnel», 4 signifie un stress normal, 6 signifie un ton neutre, 8 signifie «une baisse extrême du ton».

Le récitateur est organisé très simplement: les règles contextuelles de la liste sont appliquées alternativement à la ligne d'entrée , par exemple, la règle " (IR)#=AYR" remplace le texte ⟨ir⟩ avant la voyelle par / aɪr /; la règle " .(S) =Z" remplace ⟨s⟩ entre la consonne voisée et l'espace (fin du mot) par / z /; la règle " (U)^^=AH5" remplace ⟨u⟩ devant deux consonnes consécutives par / ʌ /, et accentue la syllabe. Il est important de noter que dans de nombreux mots, Reciter ne met l'accent sur aucune voyelle, et dans certains, il note plusieurs voyelles à la fois: par exemple,le mot "provoquer" se transforme en "PRUW4VOW5KIHNX", c'est-à - dire / ˈpruˈvoʊkɪŋ /. Un lecteur attentif remarquera qu'un stress inutile n'est pas la seule erreur dans cette transcription.

J'ai décidé que la transcription est la partie la moins intéressante du synthétiseur de parole; et étant donné la qualité relativement faible de la transcription à la sortie Reciter, j'ai décidé Il existe plusieurs services Internet disponibles gratuitement pour la transcription d'extraits de textes anglais; au lieu de règles heuristiques, ces services utilisent des dictionnaires assez volumineux. D'après mon expérience, la meilleure transcription de qualité est pour tophonetics.com et photransedit.com; en même temps, le second a un certain nombre d'inconvénients: il utilise une notation phonémique pas tout à fait standard, souligne les notes même dans les mots monosyllabiques, et ce qui est le plus gênant - il est écrit en ASP.NET et nécessite des valeurs correctes dans les requêtes POST __VIEWSTATEet __EVENTVALIDATION, ce qui complique son utilisation par des tiers des sites. Par conséquent, dans ma démonstration du périphérique SAM et de son fonctionnement, disponible sur tyomitch.imtqy.com , j'ai utilisé la translittération via https://cors-anywhere.herokuapp.com/https://tophonetics.com/

Analyseur


Contrairement à Reciter, ainsi appelé par les créateurs de SAM, les composants Parser et Renderer ont reçu des noms d'ingénieurs inverses allemands, de sorte que ces noms ne reflètent pas assez précisément le but de ces composants.

L'analyseur a trois tâches principales:

  1. «» (, ) . ( ) «-» UL, UM, UN, [l̩, m̩, n̩]. , /əl, əm, ən/; Parser , AXL, AXM, AXN .
  2. , .. . «AH LIHTUL TUW LOW» , /t/ [ɾ] (DX) [t] (T,*,*) . ( .) , /l/ [ɫ] (LX) , [l] (L) .
  3. .

SAM prend en charge 81 arrière-plans, dont 61 ont des noms et peuvent être utilisés dans les enregistrements de phonèmes pour «déjouer» l'analyseur et définir immédiatement le son souhaité. Les 20 arrière-plans restants sont sans nom; 18 d'entre eux ne peuvent apparaître que grâce au travail de Parser, et les arrière-plans avec les codes 46 et 47 ne peuvent en aucun cas apparaître, et sont probablement restés indéterminés par une surveillance des développeurs SAM

Les arrière-plans avec les codes 0-4 ( .?,-) correspondent au silence; les autres sont résumés dans le tableau suivant:
Le codeLa désignationDu sonLe codeLa désignationDu son
5IY[je]42CH[t] dans la composition / tʃ /
6IH[ɪ]43*[ʃ] dans le cadre de / tʃ /
7EH[ɛ]44J[d] dans la composition / dʒ /
8AE[æ]45*[ʒ] de / dʒ /
9AA[ɑ]48EY~ [ɜ] dans / eɪ /
dixAH[ʌ]49AY~ [ɑ] dans / aɪ /
OnzeAO[ɔ]cinquanteOY[ɔ] de / ɔɪ /
12UH[ʊ]51AW[ɑ] dans / aʊ /
treizeAX[ə]52OW[ɔ] dans le cadre de / oʊ /
14IXplus court [ɪ]53UW~ [u]
quinzeER[ɜ]54B[b]
seizeUX[u]55*
17OH[o]56*
dix-huitRX[ɹ]57D[ré]
dix-neufLX[ɫ]58*
vingtWXcourt [ʊ] en diphtongues59*
21YXcourt [ɪ] en diphtongues60G[g]
22WHplus long [w]61*
23R[ɹ̠]62*
24L[l]63GX[g]
25W[w]64*
26Y[j]65*
27M[m]66P[p]
28N[n]67*
29NX[ŋ]68*
trenteDX[ɾ]69T[t]
31Q[ʔ]70*
32S[s]71*
33SH[ʃ]72K[kʲ]
34F[F]73*
35TH[θ]74*
36/H[ç]75KX[k]
37/X[h]76*
38Z[z]77*
39ZH[ʒ]78UL[l̩]
40V[v]79UM[m̩]
41DH[ré]80UN[n̩]

Les actions effectuées par Parser se composent de sept étapes:

  1. Analyse elle-même: une liste de codes d'arrière-plan et une liste parallèle de tonalités données par des nombres dans la ligne d'entrée sont formées sur la ligne d'entrée.
  2. Appliquer un ensemble de deux douzaines de règles à la liste des arrière-plans: par exemple, les substitutions / t / + / r / → [tʃ] + [ɹ̠] et / k / + / voyelle non frontale / → [k] + [voyelle]. (/ k / devant les voyelles de devant reste inchangé et correspond à l'arrière-plan [kʲ].)
  3. CopyStress: Le ton donné pour les voyelles accentuées s'étend aux consonnes qui les précèdent.
  4. SetPhonemeLength: la durée est substituée pour chaque fond (dans des "frames" conditionnelles). Deux tables de longitude d'arrière-plan sont utilisées - une pour les syllabes accentuées et une pour les syllabes non accentuées.
  5. AdjustLengths: Applique un ensemble de sept règles pour ajuster les durées d'arrière-plan. Par exemple, les voyelles avant les consonnes voisées sont allongées une fois et demie et les consonnes explosives consécutives sont divisées par deux.
  6. ProlongPlosiveStopConsonants: consonnes explosives devant les voyelles, les consonnes lisses et fricatives sont divisées en triplets de fonds. Le premier fond dans les trois correspond à une intensité sonore plus faible, le second à la pleine intensité, le troisième au silence.
  7. InsertBreath: la phrase est divisée .?,-en «expirations» par des arrière-plans «silencieux» ( ) jusqu'à 232 images (soit environ 2½ secondes). Dans une implémentation SAM pour rétro-PC, une telle partition était nécessaire pour économiser de la mémoire; dans la version JavaScript, cela n'a aucun sens, et dans ma fourchette, il est supprimé.

L'analyseur génère trois listes parallèles: les codes d'arrière-plan, leurs tonalités et leur durée.

Renderer


Cette composante est responsable de la synthèse de la parole au sens étroit du mot. À l'entrée, il reçoit une liste d'arrière-plans avec des tonalités et des durées spécifiées, ainsi que des paramètres qui affectent la voix synthétisée. En sortie, il produit huit listes parallèles: les fréquences des formants F 1 –F 3 , leurs intensités (amplitudes), la fréquence principale F 0 (ton de voix), et les valeurs sampledConsonant, qui seront décrites plus en détail ci-dessous.

En référence à l'instruction SAM , les exemples suivants de valeurs de paramètres vocaux sont fournis :
VoterLa vitessePasGorgeBouche
Elfe7264110160
Petit robot9260190190
Mec bouché8272110105
Petite vieille dame8232145145
Extra-terrestre10064150200
SAM7264128128
Dalek120100100200
Il est à noter que le paramètre Speed ​​n'est pas utilisé dans Renderer, mais déjà au stade de la génération audio: la durée du son généré pour une image dépend de ce paramètre. En plus du paramètre Speed, la durée d'image dépend également du type de son, comme expliqué ci-dessous.

La synthèse de la parole des formants est basée sur le fait que chaque fond est associé aux fréquences et amplitudes des premiers formants. Pour la synthèse des voyelles, l'utilisation de deux formants est suffisante - par exemple, un graphique des fréquences des formants typiques des voyelles anglaises tiré du site Web de l'Université du Manitoba :


Pour synthétiser les consonnes, des formants supplémentaires sont nécessaires. De plus, comme je l'ai mentionné dans l'article de l'année dernière , les consonnes bruyantes sont caractérisées par des "salves" dans une large bande de fréquence:



Ces "rafales" ne peuvent pas être obtenues par pure synthèse de formants, donc SAM reproduit les sons des consonnes bruyantes de la table d'échantillons. Les valeurs mentionnées ci-dessus sampledConsonantsélectionnent la partie du tableau correspondant à la consonne bruyante particulière.

Les actions effectuées par Renderer se composent de cinq étapes:

  1. SetMouthThroat: pour les voyelles et les arrière-plans sonores (codes 5-29 et 48-53), les valeurs tabulées des fréquences F 1 et F 2 sont respectivement multipliées par les paramètres Bouche et Gorge.
  2. CreateFrames: . , (1–8) Pitch (1 → −32, 6 → 0, 8 → +12). , ( 30 ) , .
  3. CreateTransitions: F0–F3 F1–F3 . , , .
  4. F0 F1, «pitch contour», .
  5. , () , PCM.


D'un point de vue physique, la parole est un train d'impulsions glottales créé par les cordes vocales (voir. Fig.), Qui le long de la sortie passent par la bouche et le nez ( voie de la parole ), et celles comme le résonateur amplifient certaines harmoniques dans l'onde du larynx. La fréquence de l'onde laryngée - c'est la fréquence principale de la voix F 0 . En règle générale, ses valeurs sont comprises entre 100 et 400 Hz: plus faibles pour les hommes, plus élevées pour les femmes, encore plus élevées pour les enfants. Le modèle de voix utilisé dans la synthèse des formants est que plusieurs filtres passe-bande sont appliqués à l'onde du larynx, chacun distinguant un formant. La largeur de la bande allouée dépend de la fréquence du formant, et selon les données expérimentales, elle peut atteindre 200 Hz: dans ma démonstration SAM sur tyomitch.imtqy.com







cette approche est utilisée: avec la valeur par défaut du paramètre Bande passante = 3, chaque formant introduit des harmoniques F 0 dans le signal audio résultant à ± 5,9% de la fréquence du formant. Cela correspond à peu près aux graphiques ci-dessus: le formant avec une fréquence de 3 KHz alloue une bande passante de 177 Hz. Dans l'implémentation SAM classique, la génération du nombre requis d'harmoniques a été abordée de manière plus inventive: pour chaque formant une onde est générée, mais la phase de cette onde est mise à zéro avec une fréquence F 0 . Dans ma démo, vous pouvez passer au mode qui synthétise une onde pour chaque formant (mais sans mettre à zéro la phase) en décochant le paramètre Pitch.

La fonction ProcessFramesdans le SAM classique traite les consonnes sourdes et vocales séparément de tous les autres arrière-plans:

  • . , Speed. ([s]) 105 , ([p] [t]) — 10.4 .
  • Speed16250PCM-, : () F1 F2, ( ) F3. , Speed=72 10.6 .
  • , , 34Speed16250PCM-, . , Speed . , Pitch=64, 1.6 , .. 9.5 .

Pour les consonnes bruyantes, cinq tables d'échantillonnage sont utilisées: une pour l'alvéolaire ([t, s, z]), une pour la chambre alvéolaire ([ʃ, ʒ]), une pour la labiale et la dentaire ([p, f, v, θ, ð ]) et un pour [ç] et [h]. Les échantillons liés au même tableau ne diffèrent les uns des autres que par leur durée et leur intensité.

Dans ma démo, par souci de simplicité, un son de durée égale est généré pour toutes les images, et cette durée ne dépend que du paramètre Speed: à sa valeur par défaut, une image correspond à 10,4 ms de son. Comme le montrent les expériences, ce «en moyenne» correspond au SAM classique, bien qu'en ce qui le concerne, les sons individuels dans la phrase synthétisée peuvent «se déplacer» pendant des unités de ms vers l'avant ou vers l'arrière.

En conclusion, je vais démontrer trois spectrogrammes de la phrase de bienvenue créée par le générateur audio SAM classique et mon générateur audio avec la synthèse de tonalité activée et désactivée:



Comme vous pouvez le voir, la désactivation de la synthèse de tonalité réalise un compromis entre la qualité sonore et la visibilité des formants sur le spectrogramme.

All Articles