Zeichnen Sie eine Rede: Software Automatic Mouth

Ich habe den letztjährigen Artikel "Wir zeichnen Ton" mit der Anerkennung abgeschlossen: "Ist es möglich, Ton von einem leeren Blatt zu zeichnen, ohne das Spektrogramm der Audioaufnahme zu verfolgen? Ehrlich gesagt war ich nicht erfolgreich. " Aber kürzlich habe ich von SAM erfahren - es wurde 1982 von Don't Ask Software veröffentlicht und war das erste kommerziell erfolgreiche PC-Sprachsyntheseprogramm. Mitte der 2000er Jahre nahmen die deutschen Demo-Gutachter Tobias Korbmacher und Sebastian Macke eine SAM-Assembler-Liste für Commodore 64 und wandelten sie in unlesbaren, aber funktionsfähigen C-Code um. dann in 2014 die versuchten britische Vidar Hokstad den C - Code in eine lesbare Form zu bringen - manuell den Variablen sinnvolle Namen geben und ersetzengotoauf Schleifen und Zweigen; und schließlich schrieb 2017 ein anderer deutscher Christian Schiffler Code von C nach JavaScript um. Sie können es in Aktion als "Black Box" auf discordier.imtqy.com/sam ausprobieren .

Meiner Meinung nach ist ein primitiver JavaScript-Sprachsynthesizer das bequemste experimentelle Modell für diejenigen, die verstehen möchten, wie die Sprachsynthese im Allgemeinen funktioniert. Meine SAM-Gabel mit im Wesentlichen bereinigtem Code und Kommentaren ist unter github.com/tyomitch/sam verfügbar . Leider ist es den früheren Autoren gelungen, das Interesse an SAM zu verringern, und jetzt sind sie nicht mehr in der Lage, Pull-Anfragen in einem Hobbyprojekt von vor vielen Jahren zu analysieren.

SAM besteht aus vier Funktionskomponenten:

  1. Reciter übersetzt den englischen Text in ein Phonem Datensatz: beispielsweise „ein wenig zu niedrig“ (ein Beispiel aus dem Demo - Programm zu SAM befestigt ) wird zu „AH LIHTUL TUW5 LOW“.
  2. Parser verwandelt eine phonemische Aufzeichnung in eine phonetische: aus "AH LIHTUL TUW5 LOW" stellt sich heraus " AH, ,L,IH,DX,AX,LX, ,T,*,*,UX,WX, ,L,OW,WX". Für jeden angezeigten Hintergrund legt Parser auch die Dauer und den Ton fest.
  3. Der Renderer erstellt aus der phonetischen Aufzeichnung eine Reihe von Frequenzen, Amplituden und anderen akustischen Eigenschaften.
  4. Die letzte anonyme Komponente (Funktion ProcessFrames) wandelt ein Array von Frequenzen und Amplituden in einen PCM-Stream für die Audioausgabe um.

In diesem Artikel werde ich nacheinander alle vier Komponenten analysieren.

Rezitator


Reciter wurde als separates Programm an SAM angehängt: Die Ersteller gaben an, dass die im Reciter festgelegten Ausspracheregeln von Reciter 469 etwa 90% der englischen Wörter korrekt transkribieren. Dies bedeutet, dass die Transkription jedes zehnten Wortes manuell bearbeitet werden muss, bevor es an die Eingabe der folgenden Komponenten gesendet wird.

SAM verwendet ein eigenes Transkriptionssystem , bei dem englische Phoneme durch separate Zeichen aus einem Satz [A-Z/]oder in Paaren von zwei solchen Zeichen angezeigt werden :
PhonemBezeichnungPhonemBezeichnungPhonemBezeichnungPhonemBezeichnung
/ b /B/ p /P/ v /V/ f /F
/ d /D/ t /T/ z /Z/ s /S
/ dʒ /J/ tʃ /CH/ ʒ /ZH/ ʃ /SH
/ g /G/ k /K/ h //H/ ð /DH
/ m /M/ n /N/ ŋ /NX/ θ /TH
/ l /L/ r /R/ j /Y/ w /W
/ æ /AE/ ɛ /EH/ ɪ /IH/ ich /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
Zusätzlich zu den Phonemen werden in der SAM-Transkription die Zahlen 1–8 verwendet, um Stress und Ton zu bezeichnen : 1 bedeutet „sehr emotionalen“ Stress, 4 bedeutet normalen Stress, 6 bedeutet neutralen Ton, 8 bedeutet „extremer Abfall des Tons“.

Der Rezitator ist ganz einfach angeordnet: Kontextsensitive Regeln aus der Liste werden abwechselnd auf die Eingabezeile angewendet. Beispielsweise ersetzt die Regel " (IR)#=AYR" den Text "ir" vor dem Vokal durch / aɪr /; die Regel " .(S) =Z" ersetzt ⟨s⟩ zwischen dem stimmhaften Konsonanten und dem Leerzeichen (Wortende) durch / z /; Die Regel " (U)^^=AH5" ersetzt ⟨u⟩ vor zwei Konsonanten hintereinander durch / ʌ / und betont die Silbe. Es ist wichtig zu beachten, dass Reciter in vielen Worten keinen Vokal hervorhebt und in einigen Worten mehrere Vokale gleichzeitig notiert: zum Beispiel:das Wort "provozieren" wird zu "PRUW4VOW5KIHNX", dh / ˈpruˈvoʊkɪŋ /. Ein aufmerksamer Leser wird feststellen, dass unnötiger Stress nicht der einzige Fehler in dieser Transkription ist.

Ich entschied, dass die Transkription der am wenigsten interessante Teil des Sprachsynthesizers ist, und entschied mich angesichts der relativ geringen Qualität der Transkription am Reciter-Ausgang Es gibt mehrere frei verfügbare Internetdienste zum Transkribieren von Auszügen englischer Texte. Anstelle heuristischer Regeln verwenden diese Dienste ziemlich große Wörterbücher. Nach meiner Erfahrung ist die Transkription von bester Qualität für tophonetics.com und photransedit.com;; Gleichzeitig weist die zweite eine Reihe von Nachteilen auf: Sie verwendet nicht ganz die Standard-Phonemnotation, merkt Stress selbst in einsilbigen Wörtern an und ist am unpraktischsten - sie ist in ASP.NET geschrieben und erfordert korrekte Werte in POST-Anforderungen __VIEWSTATEund __EVENTVALIDATIONerschwert die Verwendung durch Dritte Websites. Daher habe ich bei meiner Demonstration des Geräts und der Arbeit von SAM, die auf tyomitch.imtqy.com verfügbar ist , die Transliteration über https://cors-anywhere.herokuapp.com/https://tophonetics.com/ verwendet.

Parser


Im Gegensatz zu Reciter, das von den Entwicklern von SAM so genannt wurde, wurden die Parser- und Renderer-Komponenten von deutschen Reverse Engineers benannt, sodass diese Namen den Zweck dieser Komponenten nicht ganz genau widerspiegeln.

Parser hat drei Hauptaufgaben:

  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 unterstützt 81 Hintergründe, von denen 61 Namen haben und in Phonemaufnahmen verwendet werden können, um Parser zu „überlisten“ und sofort den gewünschten Sound einzustellen. Die restlichen 20 Hintergründe sind namenlos. 18 von ihnen können nur als Ergebnis der Arbeit von Parser erscheinen, und Hintergründe mit den Codes 46 und 47 können in keiner Weise erscheinen und wurden wahrscheinlich durch ein Versehen der SAM-Entwickler unbestimmt.

Hintergründe mit den Codes 0-4 ( .?,-) entsprechen der Stille; Der Rest ist in der folgenden Tabelle zusammengefasst:
Der CodeBezeichnungKlangDer CodeBezeichnungKlang
5IY[ich]42CH[t] in der Zusammensetzung / tʃ /
6IH[ɪ]43*[ʃ] als Teil von / tʃ /
7EH[ɛ]44J[d] in der Zusammensetzung / dʒ /
8AE[æ]45*[ʒ] von / dʒ /
9AA[ɑ]48EY~ [ɜ] in / eɪ /
10AH[ʌ]49AY~ [ɑ] in / aɪ /
elfAO[ɔ]fünfzigOY[ɔ] von / ɔɪ /
12UH[ʊ]51AW[ɑ] in / aʊ /
dreizehnAX[ə]52OW[ɔ] als Teil von / oʊ /
14IXkürzer [ɪ]53UW~ [u]
fünfzehnER[ɜ]54B[b]
SechszehnUX[u]55*
17OH[Ö]56*
achtzehnRX[ɹ]57D[d]
neunzehnLX[ɫ]58*
zwanzigWXkurz [ʊ] in Diphthongs59*
21YXkurz [ɪ] in Diphthongs60G[G]
22WHlänger [w]61*
23R[ɹ̠]62*
24L[l]63GX[G]
25W[w]64*
26Y[j]65*
27M[m]66P[p]
28N[n]67*
29NX[ŋ]68*
dreißigDX[ɾ]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[ð]80UN[n̩]

Die von Parser ausgeführten Aktionen bestehen aus sieben Schritten:

  1. Parsing selbst: In der Eingabezeile werden eine Liste von Hintergrundcodes und eine parallele Liste von Tönen gebildet, die durch Zahlen in der Eingabezeile angegeben werden.
  2. Anwenden eines Satzes von zwei Dutzend Regeln auf die Liste der Hintergründe: zum Beispiel die Substitutionen / t / + / r / → [tʃ] + [ɹ̠] und / k / + / Nicht-Front-Vokal / → [k] + [Vokal]. (/ k / vor den vorderen Vokalen bleiben unverändert und stimmen mit dem Hintergrund überein [kʲ].)
  3. CopyStress: Der für betonte Vokale eingestellte Ton erstreckt sich auf die Konsonanten, die ihnen vorangehen.
  4. SetPhonemeLength: Die Dauer wird für jeden Hintergrund ersetzt (in bedingten "Frames"). Es werden zwei Hintergrundlängengradtabellen verwendet - eine für betonte Silben und eine für nicht betonte.
  5. AdjustLengths: Wendet einen Satz von sieben Regeln zum Anpassen der Hintergrunddauer an. Beispielsweise werden Vokale vor stimmhaften Konsonanten eineinhalb Mal verlängert und aufeinanderfolgende explosive Konsonanten halbiert.
  6. ProlongPlosiveStopConsonants: Explosive Konsonanten vor Vokalen, glatte und frikative Konsonanten werden in drei Hintergründe unterteilt. Der erste Hintergrund in den drei entspricht einer geringeren Schallintensität, der zweite der vollen Intensität, der dritte der Stille.
  7. InsertBreath: Die Phrase wird durch "stille" Hintergründe ( .?,-) bis zu 232 Frames (dies sind ungefähr 2½ Sekunden) in "Ausatmen" unterteilt . In einer SAM-Implementierung für Retro-PCs war eine solche Partition erforderlich, um Speicherplatz zu sparen. In der JavaScript-Version macht es keinen Sinn, und in meiner Gabel wird es gelöscht.

Der Parser gibt drei parallele Listen aus: Hintergrundcodes, ihre Töne und ihre Dauer.

Renderer


Diese Komponente ist für die Sprachsynthese im engeren Sinne des Wortes verantwortlich. Am Eingang erhält es eine Liste von Hintergründen mit bestimmten Tönen und Dauern sowie Parametern, die sich auf die synthetisierte Stimme auswirken. Am Ausgang werden acht parallele Listen erstellt: die Frequenzen der Formanten F 1 –F 3 , ihre Intensitäten (Amplituden), die Hauptfrequenz F 0 (Tonfall) und die Werte sampledConsonant, die nachstehend ausführlicher beschrieben werden.

Unter Bezugnahme auf den SAM-Befehl werden die folgenden Beispiele für Sprachparameterwerte bereitgestellt :
AbstimmungGeschwindigkeitTonhöheKehleMund
Elf7264110160
Kleiner Roboter9260190190
Stuffy Kerl8272110105
Kleine alte Frau8232145145
Außerirdisch10064150200
SAM7264128128
Dalek120100100200
Es ist anzumerken, dass der Geschwindigkeitsparameter nicht in Renderer verwendet wird, sondern bereits in der Phase der Audioerzeugung: Die Dauer des für ein Bild erzeugten Tons hängt von diesem Parameter ab. Zusätzlich zum Parameter Geschwindigkeit hängt die Bilddauer auch von der Art des Tons ab, wie nachstehend erläutert wird.

Die Formant-Sprachsynthese basiert auf der Tatsache, dass jeder Hintergrund den Frequenzen und Amplituden der ersten Formanten zugeordnet ist. Für die Synthese von Vokalen ist die Verwendung von zwei Formanten ausreichend - beispielsweise eine Tabelle mit Formantenhäufigkeiten, die für englische Vokale typisch ist und von der Website der Universität von Manitoba stammt :


Zur Synthese von Konsonanten werden zusätzliche Formanten benötigt. Darüber hinaus sind verrauschte Konsonanten , wie ich im letztjährigen Artikel erwähnt habe , durch "Bursts" in einem breiten Frequenzband gekennzeichnet:



Diese "Bursts" können nicht durch reine Formantensynthese erhalten werden, daher reproduziert SAM die Geräusche von verrauschten Konsonanten aus der Probentabelle. Die oben genannten Werte sampledConsonantwählen den Teil der Tabelle aus, der dem jeweiligen verrauschten Konsonanten entspricht.

Die vom Renderer ausgeführten Aktionen bestehen aus fünf Schritten:

  1. SetMouthThroat: Für Vokale und Sonor-Hintergründe (Codes 5–29 und 48–53) werden die tabellarischen Werte der Frequenzen F 1 und F 2 mit den Parametern Mund bzw. Hals multipliziert.
  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.


Aus physikalischer Sicht ist Sprache eine Stimmritzenfolge, die von den Stimmbändern erzeugt wird (siehe Abb.), Die auf dem Weg nach draußen durch Mund und Nase ( Sprachpfad ) verläuft, und solche wie der Resonator verstärken bestimmte Harmonische in der Kehlkopfwelle. Die Frequenz der Kehlkopfwelle - dies ist die Hauptfrequenz der Stimme F 0 . In der Regel liegen die Werte zwischen 100 und 400 Hz: niedriger für Männer, höher für Frauen, noch höher für Kinder. Das bei der Formantensynthese verwendete Sprachmodell besteht darin, dass mehrere Bandpassfilter auf die Kehlkopfwelle angewendet werden, von denen jedes einen Formanten unterscheidet. Die Breite des zugewiesenen Bandes hängt von der Frequenz des Formanten ab und beträgt nach experimentellen Daten bis zu 200 Hz: In meiner SAM-Demonstration auf tyomitch.imtqy.com







Dieser Ansatz wird verwendet: Mit dem Standardwert des Parameters Bandbreite = 3 führt jeder Formante innerhalb von ± 5,9% der Formantenfrequenz Harmonische F 0 in das resultierende Audiosignal ein . Dies entspricht in etwa den obigen Grafiken: Der Formante mit einer Frequenz von 3 kHz weist eine Bandbreite von 177 Hz zu. In der klassischen SAM-Implementierung wurde die Erzeugung der erforderlichen Anzahl von Harmonischen erfinderischer angegangen: Für jeden Formanten wird eine Welle erzeugt, aber die Phase dieser Welle wird mit einer Frequenz F 0 auf Null gesetzt . In meiner Demo können Sie in einen Modus wechseln, der eine Welle für jeden Formanten synthetisiert (ohne jedoch die Phase auf Null zu setzen), indem Sie den Parameter Pitch deaktivieren.

Die Funktion ProcessFramesim klassischen SAM verarbeitet gehörlose und stimmhafte verrauschte Konsonanten getrennt von allen anderen Hintergründen:

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

Für verrauschte Konsonanten werden fünf Probentabellen verwendet: eine für den Alveolar ([t, s, z]), eine für den Kammeralveolar ([ʃ, ʒ]), eine für den labialen und zahnmedizinischen ([p, f, v, θ, ð ]) und eine für [ç] und [h]. Proben, die sich auf dieselbe Tabelle beziehen, unterscheiden sich nur in Dauer und Intensität voneinander.

In meiner Demo wird der Einfachheit halber für alle Frames ein Sound von gleicher Dauer generiert, und diese Dauer hängt nur vom Parameter Speed ​​ab: Mit seinem Standardwert entspricht ein Frame 10,4 ms Sound. Wie Experimente zeigen, entspricht dies "im Durchschnitt" dem klassischen SAM, obwohl sich in Bezug darauf einzelne Klänge in der synthetisierten Phrase für Einheiten von ms vorwärts oder rückwärts "bewegen" können.

Abschließend werde ich drei Spektrogramme der Begrüßungsphrase zeigen, die vom klassischen SAM-Audiogenerator und meinem Audiogenerator bei ein- und ausgeschalteter Tonsynthese erstellt wurden:



Wie Sie sehen, wird durch Ausschalten der Tonsynthese ein Kompromiss zwischen der Klangqualität und der Sichtbarkeit der Formanten auf dem Spektrogramm erzielt.

All Articles