HARDWAREMONTAGES ★ Der Laberkasten Sprach-Synthesizer für die CPC's|CPC Amstrad International) ★

Sprach-Synthesizer (CPC Amstrad International)Hardware Montages
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

“Guten Morgen! Heute ist Mittwoch, der 11.9.; draußen sind 10 Grad Celsius; es ist kurz vor Sieben... Guten Morgen! Heute ist Mittwoch,...“. Mit freundlicher Stimme wiederholt ein Computer den Text zum Aufwecken - auf die Mitteilung “Du hast nur noch 20 Minuten Zeit! Beeil Dich!“ steht der übernächtigte Computerfreak auf und stürzt sich in den neuen Tag.

Science Fiction meinen Sie? Nein, Sprechi, der Sprach-Synthesizer.

Bevor wir jedoch zum konkreten Aufbau und Test von SPRECHI kommen, möchten wir Sie mit den elementaren Grundlagen der Sprachsynthese vertraut machen:

Die intensive Beschäftigung, wie und wo die Sprache entsteht, ist aber auch den Entwicklern heutiger Sprachchips zugute gekommen, auch wenn sie die Sprache total anders ablegen und wiedergeben: Die Speicherung geschieht nämlich digital, also in Nullen und Einsen, und nicht analog wie auf Schallplatte oder Kassette.

Die fertig aufgebaute Platine des Sprachsynthesizers >>

Da die Sprache selbst jedoch analog und nicht digital ist, denn sie hat ja große Dynamikschwankungen, feine Nuancen, etc. und nicht nur “an“ und “aus“, muß die analoge Information zur Speicherung irgendwie ins digitale System übersetzt werden, denn die Sprache kann nur auf digitaler Basis (zumindest halbwegs) verständlich reproduziert werden. Diese Digitalisierung der Sprache bringt, besonders wegen der großen Dynamikschwankungen und schnellen Übergängen zum Teil erhebliche Probleme mit sich, weshalb man spezielle Methoden zur Sprachdigitalisierung für Sprachsynthesizer anwendet:

1. Die “Wellenform-Codierung“:

Bei dieser Methode wird die Amplitude des Sprachsignals in bestimmten Zeitabständen abgetastet und der zu diesem Zeitpunkt vorliegende Wert gespeichert. Logischerweise wird die Genauigkeit, mit der das ursprüngliche, analoge Sprachsignal wiedergegeben wird, mit steigender Abtastfrequenz ebenfalls größer, weil einfach mehr Werte vorliegen. Aber auch die Datenmenge nimmt (sogar extrem) zu, weshalb viel Speicherplatz nötig ist. Wenn der Synthesizer also immer dasselbe sagen soll, z.B.“Sie haben Ihr Licht noch an“, “Der Tank ist bald leer“, ist diese Methode gut geeignet (wenn genug Speicher vorhanden ist), denn die Sprache wird quasi fotografiert. Fast zwangsläufig denkt man da an die CD, die die Musik ja auch “abfotografiert“. Tatsächlich wird die Musikinformation mit der Wellenform-Codierung gespeichert, wobei das Signal 44100mal pro Sekunde abgetastet wird und so auf jeder CD ca. 16 GigaBit gespeichert sind...

2. Die “Formantenfrequenz- Analyse“:

Diese Methode mit dem langen Namen wird für die heutzutage erhältlichen Sprachchips benutzt: sie beruht auf der genauen Kenntnis der Grundelemente der Sprache, die PHONEME genannt werden. Ein Phonem ist also die kleinste Einheit, in die die Sprache zerlegt werden kann. Diese Phoneme werden nun einzeln synthetisiert, also schließlich digital abgespeichert, und können dann in beliebiger Reihenfolge aneinandergereiht werden. So können neue Worte einfach programmiert werden, auch wenn sie nie synthetisiert wurden, denn sie entstehen nur noch durch das Aneinanderreihen der Phoneme. Deshalb kann SPRECHI auch jeden beliebigen Text deutsch, englisch, oder sonstwie sprechen, wenn ein entsprechendes Treiberprogramm den eingegebenen Text in die entsprechenden Phoneme um wandelt und an SPRECHI weitergibt.

Zur Programmierung von SPRECHI (ohne die RSX-Befehle) ist also die Kenntnis der Phonemnummern des SSI 263 (der Sprachchip, den wir in SPRECHI benutzt haben; mehr dazu später) unbedingt nötig, weshalb eine Tabelle aller Phoneme mit Beispiel worten natürlich nicht fehlen darf (wer mal einen Blick riskieren will: in Tabelle 1 sind alle Phoneme, die SPRECHI zur Verfügung stehen, aufgelistet).

Der eigentlich unendlich große Wortschatz wird aber bei der Phonem-Methode (bzw. bei der Formantenfrequenz-Analyse) dadurch erkauft, daß bei Aneinanderreihung einzelner Phoneme eine Stimme entsteht, die sehr derjenigen ähnelt, die allgemein als “Roboterstimme“ bezeichnet wird. Dieses Manko wird beim SSI 263 (also dem Chip, den wir benutzen) durch die vom Benutzer frei setzbaren Register für Filterfrequenz, Tonhöhe, Geschwindigkeit, etc. (nähere Erläuterung s.u.) fast behoben.

3. Mathematische Modelle der Sprache:

Der Vollständigkeit halber möchten wir Ihnen noch die wahrscheinlich in der Zukunft benutzten Sprachsynthesemethoden kurz nennen, die letztlich bessere Ergebnisse als die Phonemmethode liefern werden: die “Linear PredictiveCoding“ (LPC) Methode und die schon etablierte “Fourieranalyse“. Beide Methoden benutzen zur Beschreibung der Sprache komplizierte mathematische Formeln, die auch “Schuld daran“ sind, daß diese Technik nicht schon heute verfügbar ist: die heutigen Chips rechnen einfach immer noch nicht schnell genug! Nach diesen allgemeinen Grundlagen der Sprachsynthese kommen wir nun zur Praxis, nämlich zum Aufbau, Test und schließlich der Programmierung von SPRECHI. Doch beginnen wir mit dem Aufbau des Sprachsynthesizers...

Der Aufbau von SPRECHI

Der Hardwareaufbau besteht aus drei Gruppen:
1. PIO (Ein- und Ausgabe-Schnittstelle)
2. Sprachchip
3. Verstärker

An Bauteilen benötigen Sie Folgendes:

Widerstände:
R1a,b = 4.7 K
R1 a ist in den Bestückungsplan mit eingebaut, R1b sollte eingebaut werden, falls der Synthesizer nicht richtig funktioniert.
R2 = 3k9 (3.9 Kiloohm)
R3 = 10 Ohm
Poti TRI = 25 kOhm/linear

Kondensatoren:
C1 = 100uF/16V
C1 wird parallel zur externen Spannungsversorgung geschaltet.
C2 = 0.22uF
C3 = 220 uF/16V
C4 = 0.068uF

(Die Bezeichnung uF steht für Mikrofarad)
Halbleiter:
IC 1 = Z80A PIO
IC 2 = SN 74LS32
IC 3 = SSI 263
IC 4 = SN 74LS74
IC 5 = LM 386
IC- Sockel

Expansionport-Stecker (bei 464 und 664 Platinenstecker, beim 6128 CENTRONICS-Adapter), dünner isolierter Draht.

3.5 mm Klinkensteckerbuchse, falls Sie Sprechi an Ihre Stereoanlage anschließen wollen, schließen Sie die Buchse direkt an den Ausgang des Synthesizers an.
8 Ohm-Lautsprecher 0.5 W
Lötstifte 1mm

Das Ein-/Ausgabeinterface besteht hauptsächlich aus der mittlerweile sehr günstig zu erhaltenden Z80A PIO, die speziell für den Betrieb mit dem Z80 Prozessor (der ja auch im CPC seinen Dienst tut) entwickelt wurde. Sie bietet 16 frei programmierbare Ein- bzw. Ausgänge, die in die Ports A und B aufgeteilt sind.

In unserer Schaltung wurde Port A an die Datenleitungen des Sprachchips gelegt, Port B Bit 7 mit dem A/R Eingang, Bit 6 mit CSO und die Bits 3 bis 5 mit den Anschlüssen RSO bis RS2 verbunden. Die Bits 0,1 und 2 sind frei, so daß an sie noch Geräte angeschlossen werden können.

Das vom Chip kommende Audiosignal (also die Sprache bzw. Musik oder Musikeffekte) kann entweder direkt über die 3.5mm Klinkensteckerbuchse abgenommen oder über den internen Verstärker auf den Lautsprecher gegeben werden. Dieser Verstärker besteht aus einer Beschaltung des allgemein bekannten LM 386 und stellt somit eine Standardschaltung dar. Kommen wir nun zum Erstellen der Platine:

Nach dem Fotopositiv-Verfahren wird auf übliche Weise das Layout auf die Platine gebracht. (Sie können vom Layout eine Folie hersteilen lassen, und diese zum Belichten der Platine benutzen, erfahrene Hobby-Elektroniker können diese Schaltung jedoch auch auf einer Lochraster-Platine aufbauen.)

Wenn nach dem Ätzen die Leiterbahnen fehlerfrei übriggeblieben sind und die Platine gereinigt worden ist, werden an allen Lötaugen Bohrungen mit einem 0.8mm-Bohrer vorgenommen. Damit sind die Arbeiten an der Platine beendet und wir können selbige nun bestücken:

Das Einsetzen der Bauteile

Zuerst setzen Sie die Brücken, die Widerstände und Kondensatoren ein (in dieser Reihenfolge), die Brücken zuerst, da einige unter den ICs liegen. Danach löten Sie die Sockel der ICs ein und überprüfen die Schaltung auf fehlerhafte Lötstellen. Nun bringen Sie das Poti und den Lautsprecher mit flexiblem Draht an die Lötnägel.

Haben Sie diese “Tortur“ hinter sich, können Sie zum Schluß die ICs in ihre Fassungen setzen, wobei Sie darauf achten müssen, die beiden LS-Typen nicht zu vertauschen!

Jetzt sollten Sie die fertig bestückte Platine noch einmal überprüfen und auch darauf achten, daß alle ICs ihre Kerbe auf der richtigen Seite haben.

Wenn Sie alles richtig gemacht haben, und das Listing 1 (“SPRTEST.BAS“) eingegeben und gestartet haben, müßte Ihr SPRECHI Sie nun mit einem sonoren “Hallo, User! “ begrüßen. Nachdem Sie nun mit SPRECHI einen leistungsfähigen Sprachsynthesizer aufgebaut und an Ihrem CPC angeschlossen haben, können wir zur Programmierung des sprechenden Genossen kommen.

Die Programmierung

Wichtigster Bestandteil jedes Sprachsynthesizers ist ganz offensichtlich der eingesetzte Sprachchip. Bei SPRECHI haben wir den SSI 263 von Silicon Systems, einen Sprachchip der dritten Generation benutzt: Er beherrscht sogar die deutschen Umlaute und kann auch ein (immer noch etwas amerikanisch klingendes) deutsches “R“ sprechen. Außerdem kommt er mit einer sehr niederigen Daten-Rate aus (12 Byte pro Sekunde; bei hochster Sprachqualität kann sich dieser Wert verfünffachen), so daß er auch von BASIC angesteuert werden kann.

Ein weiterer wichtiger Vorteil des SSI 263 ist, daß dem Programmierer nahezu alle Möglichkeiten der Sprachmanipulation offenstehen. Sowohl die Lautstärke als auch die Tonhöhe sind in weiten Grenzen recht fein einstellbar, weshalb man Sprache mit großer Dynamik oder sogar Gesangsstücke mit dem SSI 263 produzieren kann (ein Beispiel ist das Demoprogramm “7BR.BAS“, das SPRECHI dazu veranlaßt, den Refrain von Peter Maffays “Über sieben Brücken mußt du geh'n... “ zu singen !). Auch Szenen, in denen man z.B. ein junges Mädchen, einen jungen Mann und einen alten Mann sprechen hört, sind relativ leicht zu verwirklichen. Durch weitere Manipulationen z.B. an Sprachgeschwindigkeit und -artikula-tion kann man auch eine Micky-Maus-ähnliche Stimme aus SPRECHI hervorzaubern oder einen leicht angetrunkenen Herren simulieren (s. Demoprogramm “SPRDEMO.BAS“). Der SSI 263 stellt auch die einzelnen Phoneme nicht einfach hintereinander, sondern verbindet sie mit einer vom Programmierer festlegbaren Geschwindigkeit, steuert z.B. beim Heben der Stimme die neue Frequenz schrittweise an, und kann noch vieles mehr, so daß die menschliche Sprache (bei genügend Programmieraufwand) ganz gut verständlich synthetisiert werden kann...

Sie merken sicher, daß man bei den Möglichkeiten, die der SSI 263 bietet, ins Schwärmen geraten kann; um SPRECHI hundertprozentig auszunutzen zu können, muß man ihn (hauptsächlich wegen der Geschwindigkeit) auf Assemblerebene programmieren, da einem erst dort alle Möglichkeiten (auch in bezug auf die Geschwindigkeit) offenstehen.

Weil es aber sicher nicht jedermanns Sache ist, SPRECHI (und damit den SSI 263) direkt mit Phonem- und Register-Daten zu “füttern“ (was letztlich die bessere Qualität bringt), haben wir eine RSX- Befehlserweiterung entwickelt, die es auch Einsteigern ermöglicht, schnell und einfach tolle Sachen mit SPRECHI zu machen.

Oft wird es passieren, daß - nach einigem “Einspielen“ mit den RSX-Befehlen - eigene Ideen verwirklicht werden sollen (z.B. ein Treiber-programm, das einen eingegebenen Text englisch ausspricht, ein neues Lied, ...). Dann kann es sein, daß die Umsetzung mit den RSX-Befehlen nicht ganz gelingt, weshalb eine

genaue Kenntnis des Innenaufbaus und der direkten Programmierung SPRECHIs (z.B. von Assembler aus) sehr von Vorteil ist, da man durch sie eigene, etwas kompliziertere Ideen meistens besser umsetzen kann. Zu diesem wichtigen Teil kommen wir später; erstmal wollen wir Ihnen Gelegenheit geben, sich mit den RSX-Befeh-len “auszutoben“ und erste Erfahrungen mit SPRECHI zu machen. Wenn Sie dann an dem oben beschriebenen Punkt angelangt sind, Sie also eine Idee nicht zur vollen Zufriedenheit mit den RSX-Befehlen umsetzen können, lesen Sie sich die Beschreibung der “direkten“ SPRECHI-Pro-grammierung durch und sollten dann in der Lage sein, Ihre Idee selber optimal verwirklichen zu können.

Wir wollen Sie nun nicht länger auf die Folter spannen und gleich Beschreiben, wie Sie SPRECHI mit den RSX-Befehlen das Sprechen beibringen: Tippen Sie zuerst das BASIC-Programm “SPRECHI.BAS“ ab, das aus den DATAs das Binärfile “SPRECHI.RSX“ generiert, wenn alle DATAs in Ordnung waren. Dieses “SPRECHI.RSX“ enthält viele leistungsfähige RSX-Befehle zur leichten Ansteuerung SPRECHIs von BASIC aus. (Einige dieser Befehle werden in den Demoprogrammen “ROTKAEPP.BAS“ und “SPRDEMO.BAS“ benutzt, weshalb diese Demos nur funktionieren, wenn dieses File “SPRECHI.RSX“ von Diskette bzw. Kassette nachgeladen werden kann!)

Um die neuen Befehle zur Verfügung zu haben, gehen Sie so vor: Setzen Sie zunächst Ihren CPC mit < CTRL> + < SHIFT > + < ESC > zurück und laden und initialisieren Sie hierauf “SPRECHI.RSX“ und mit folgendem Einzeiler:

MEMORY &7FFF: LOAD“SPRECHI.RSX“: CALL &89ED

Nun stehen Ihnen, wie schon oft gesagt, zahlreiche RSX-Befehle zur Verfügung, die wir nun beschreiben wollen (denken Sie bitte immer daran, daß alle RSX-Befehle mit dem “senkrechten Strich“, den man mit < SHIFT+Klammeraffe > erzeugt, beginnen).

Die Befehle

Der wichtigste Befehl ist natürlich

|SAG,@a$ bzw.  |SAY,@a$,

denn dieser schickt den Text, den die Textvariable a$ enthält, zu SPRECHI, der diesen Text dann ausspricht. (CPC 664/6128- und Besitzer eines VORTEX-Laufwerkes können statt '|SAG,@a$' auch '|SAG,“Text“' eingeben). Wenn Sie sich also mit “Guten Tag, Boss!“ von SPRECHI begrüßen lassen wollen, gehen Sie so vor:

10 a$=“GutenTag Boss!"
20 |SAY,@a$

Auch längere Texte sind kein Problem:

10 text$="Hia ist SPRECHI, der PE TSE INTERNATSIONAL Sprachsyntee saiser guten Tag und viil Spass beim Äxperimentieren.“
20 |SAG,@a$

Wie Sie am zweiten Beispiel sehen (besser: hören), ist SPRECHI oft leichter und besser zu verstehen, wenn man die Rechtschreibungsregeln etwas vernachlässigt und dafür mehr auf die Aussprache achtet.

Sicher haben Sie außerdem bemerkt, daß wir versucht haben, dem berühmt-berüchtigten eintönigen “Gebrabbel“ jedes

PHONEMLISTE SSI 263
Hex-CodeSymbolBelspielwort (in Englisch) Hex-CodeSymbolBelspielwort (in Englisch)
00PA(Pause) 20L
01E 21L1
02E1 22LF
03Y 23W
04Y1 24B
05AY 25D
06IE 26KV
07I 27P
08A 28T
09AI 29K
0AEH 2AHV
0BEH1 2BHVC
0CAE 2CHF
0DAE1 2DHFC
0EAH 2EHN
0FAH! 2FZ
10AW 30S
11O 31J
12OU 32SCH
13OO 33V
14IU 34F
15IU1 35THV
16U 36TH
17U1 37M
18UH 38N
19UH1 39NG
1AUH2 3A:A
1BUH3 3B:OU
1CER 3C:U
1DR 3D:UH
1ER1 3EE2
1FR2 3FLB

Sprachsynthesizers keine Chance zu geben, indem wir eine gewisse Sprachmelodie in jeden Satz hereinzubringen versuchten: so wird die Stimme z.B. zum Punkt hin gesenkt; wenn jedoch ein Fragezeichen den Satz abschließt, wird sie immer etwas gehoben! (Wie Sie so etwas selber programmieren können, beschreiben wir später kurz in dem Abschnitt über den inneren Aufbau und die Programmierung SPRECHIs von Assembler aus.)

Auf die Dauer ist es aber ziemlich langweilig, immer dieselbe Stimme sprechen zu hören, und der verwendete Sprachchip SSI 263 hat auch (wie oben schon angedeutet) noch viele Möglichkeiten zur Veränderung der Aussprache, weshalb es geradezu verschwenderisch wäre, sich mit dem bisher Erreichten, das ja jeder anständige normale Sprachsynthesizer bietet, zufrieden zu geben! Die folgenden RSX-Befehle ermöglichen es Ihnen deshalb, von BASIC aus die internen Register des SSI 263 zu verändern (und so z.B. Micky Maus sprechen zu lassen. ..). Dadurch können Sie den Stimmcharakter leicht ändern, doch sehen bzw. hören Sie selbst:

Mit |VOLUME,x oder dem kürzeren |VOL,x können Sie die Lautstärke im Bereich von Null bis 15 einstellen, wobei 15 sehr laut und Null extrem leise ist.

Ein Beispiel:

10 a$=“Hallo, Boss.“
20 |VOLUME,4
30 |SAG,@a$
40 FOR 1=1 TO 200:NEXT 'tfarteschleife
50 |VOLUME,15
60 |SAG,@a$
70 b$=“Hallo, Maler
80 |VOLUME,9
90 |SAG,@b$

Hier hören wir, wie jemand erst leise und dann laut den Boss begrüßt, der dann mittellaut antwortet.

Das Beispielgespräch wird noch realistischer, wenn wir dem Boss eine ziemlich tiefe Stimme geben und die Rufe mit zwei verschieden hohen Stimmen erschallen lassen. Dies ist mit dem Befehl ITONHOEHE,x bzw. dem kürzeren ITH,x kein Problem mehr; die Variable x enthält die neue Tonhöhe, die ab 32 in Achterschritten immer höher wird. Dies ist jedoch etwas kompliziert - vereinfachend kann man sagen, daß x aus dem Breich Null bis 255 kommen kann und der Wert Null die tiefste; 255 die höchste Stimme erzeugt.

Beispiel:

10 a$=“Hallo, Boss.“:b$=“Bist du es?“:c$=“Alles klar, ich bins.“
20 |VOLUME, 7: |TONHOEHE, 150: |SAY, @a$
30 |VOLUME, 10: |TH,56: |SAY,@b$
40 FOR i=1 TO 200:NEXT 'Warteschleife
50 |VOLUME, 12: |TH, 0: |SAY, @c$

Kann man Lautstärke und Höhe der Stimme verändern, so ist es fast klar, daß man auch die Sprechgeschwindigkeit einstellen kann. Der RSX-Befehl dafür heißt |GESCHWINDIGKEIT,x bzw. |SPEED,x (beides ist gültig), x muß dabei zwischen Null und 15 (inklusive) liegen. Nach |SPEED, 15 spricht SPRECHI sehr schnell; nach |GESCHWINDIGKEIT,0 scheint er jedoch dem Einschlafen nahe.

Wiederum ein Beispiel:

10 text$=“Lalalalalololililalelelelolali“
20 |VOLUME, 13: |TH, 160: |SAY, @text$
30 |GESCHWINDIGKEIT, 1:|SAY,@text$
40 FOR 1=1 T0 200:NEXT 'Warteschleife
50 |SPEED,8:|SAY,@text$

Die bisher beschriebenen RSX-Befehle sind sicher leicht verständlich, denn ihre Wirkungen sind leicht versteh- und voraussehbar. Etwas anders verhält es sich mit den folgenden Befehlen, die ganz speziell den SSI 263 beeinflussen. Bei ihm hat man nämlich zur möglichst realistischen Wiedergabe der menschlichen Sprache den Vokaltrakt des Menschen durch diverse elektronische Filter und ähnliches möglichst gut nachzubilden versucht. Diese Filtervorrichtungen können mit den RSX-Befehlen, die wir nun beschreiben, auch von BASIC aus manipuliert werden:

|FILTERFREQUENZ,x bzw. |FFQ,x setzt die Filterfrequenz; x kann Werte von Null bis 255 enthalten. Der Normalwert ist 231, was einer Filterfrequenz von ca. 20 Khz entspricht (die genaue Berechnung erklären wir später - spielen Sie ruhig mal mit verschiedenen Werten !). Die geschickte Veränderung der Filterfrequenz während des Sprechens macht die Sprache sehr lebendig und kann auch den Stimmcharakter verändern.

Auch hierzu ein Beispiel:

10 a$=“Hallo du da !“
20 |FILTERFREQUENZ,131: |SAY,@ a$
30 |FFQ,241:|SAY,@a$

Bei dem Befehl IARTIKULATION,x bzw. IART,x darf x Werte von Null bis Sieben annehmen. Der durch x übergebene Wert gibt an, wie schnell der SSI 263 eine neue Zielfrequenz ansteuern soll; so kann man zum Beispiel erreichen, daß die Stimme bei Eingabe einer niedrigen Tonhöhe nicht gleich “in den Keller sackt“, sondern die neue Tonhöhe schnell (wenn x=0) oder langsam (wenn x=7) angesteuert wird. Diese Besonderheit des SSI 263 trägt ebenfalls zu der guten Sprachqua-lität bei.

Dazu ebenfalls ein Beispiel:

10 a$=“Dummdididummdidi dämm“
20 |TH,200: |ARTIKULATION,7:|SPEED,9: |SAY,@a$
30 |TH, 32: |SAY, @a$
40 |TH,200:|ART, 1: |SAY, @a$

Mit |MODE,x (x von Eins bis Drei) können Sie einstellen, ob die Zielfrequenz, wie oben beschrieben, gemäß der Artikulationsrate mehr oder weniger schnell angesteuert werden soll oder ob der neue Wert sofort eingestellt wird. Die sofortige Ansteuerung der neuen Tonhöhe ermöglicht es z.B., Lieder singen zu lassen, während die schrittweise Ansteuerung die Sprachqualität entscheidend verbessert. Je nach dem Wert von x wird der Modus ausgewählt:

x = 0: NICHT BENUTZEN, da dann die Schnittstellenlogik blockiert wird (durch |NORMAL (s.u.) kann man sich aber noch retten !))
x = 1: feste Phonemdauer, Zielfrequenz sofort
x = 2: Phonemdauer einstellbar, Zielfrequenz sofort
x = 3: Phonemdauer einstellbar, schrittweiserUbergang zur Zielfrequenz

Das Beispiel:

10a$=“Dammdududumm dididommdomm bammbumm“:|TH,32
20 |MODE,3:|TH,320
30 |SAY,@a$ 'Stimme hebtsich schrittweise
40 |MODE,1:|TH,32
50 |SAY,@a$ 'Stimme faellt sofort

Schließlich gibt es noch den Befehl |NORMAL, den Sie sicher bald sehr schätzen werden, denn er führt einen “Soft-Reset“ des SSI 263 durch, weshalb nach Eingabe von INORMAL Tonhöhe, Modus, Filterfrequenz, und all das wieder wie am Anfang eingestellt ist - Sie können also nach Herzenslust experimentieren! Denn wenn Sie sich mal irgendwo “festgefahren“ haben, hilft Ihnen ein simples |NORMAL wieder raus!

So, sicher brennen Sie inzwischen schon darauf, selber mit SPRECHI herumzuexperimentieren, was mit den eben beschriebenen RSX-Befehlen von “SPRECHI.RSX“ auch kein Problem ist; wir wünschen Ihnen jedenfalls dabei viel Spaß. Wenn Sie meinen, ein interessantes Programm geschrieben zu haben, können Sie es ja mal an die PC INTERNATIONAL schicken, damit dann alle Leser von Ihrer tollen Idee profitieren können!

Als kleine, aber äußerst nützliche, Gedächtnisstütze und -hilfe hier nochmal eine Auflistung aller Befehle und ihrer Wirkungen in Kurzform:

|SAY,@a$ (bei CPC 464 mit VDOS, CPC 664/6128 geht auch |SAY, “Text“)
|SAG,@a$ wie |SAY
|VOLUME,x stellt die Lautstärke softwaremäßig ein (Bereich 0-15)
|VOL,x wie |VOLUME,x
|TONHOEHE,x setztdie Tonhöhe (Bereich0-255, effektiv ber “nur“ 32 bis 255 in Achterschritten)
|TH,x wie |TONHOEHE,x
|GESCHWINDIGKEIT,x setztdie Sprachgeschwindigkeit (Bereich 0-15)
|SPEED,x wie |GESCHWIND!GKEIT,x
|FILTERFREQUENZ,x setzt die Filterfrequenz (Bereich 0-255)
|FFQ,x wie IFILTERFREQUENZ,x
|ARTIKULATION,x setzt die Artikulationsrate (Bereich 0-7)
|ART,x wie |ART1KULATION,x
|MODE,x setzt den Modus des Chips (Bereich1-3)
|NORMAL setzt die Anfangsdaten für Tonhöhe,etc., sozusagen ein “SoftReset “ des Chips

Das wäre also die SPRECHI-Programmierung von BASIC mit den RSX-Befehlen.

Für kompliziertere Programme (z.B. ein Programm, das SPRECHI auf ENGLISCH reden läßt) ist jedoch die Kenntnis des inneren Aufbaus und der “direkten“ Programmierung unbedingt nötig ...

Die “direkte“ Programmierung von SPRECHI

Bitte haben Sie Verständnis dafür, daß wir hier nicht alle Fachworte erklären können und die Materie ziemlich komprimiert beschreiben, denn für ausführliche Erklärungen braucht man schon ein Buch, um alles unterzubekommen.

Betrachten wir zunächst den Innenaufbau des SSI 263: Die anliegenden acht Datenbits D0 bis D7 werden in fünf Registern (für Tonhöhe, Phonem, etc.) gespeichert, die durch RSO bis RS2 adressiert werden. Die Sprache wird nun in Abhängigkeit der Register in einem analogen Modell des menschlichen Sprachtraktes erzeugt, wobei - je nach Phonem - Rauschen zugemischt wird oder nicht.


Layout und Bestückungsplan

Das anliegende Datenbyte kann also, je nach Zustand von RSO, RS1 und RS2, eine Phonemnummer oder z.B. die neue Zielfrequenz sein. Um nun das anliegende Byte in das entsprechende Register zu laden, muß CSO (wenige Mikrosekunden lang) logisch 1 sein und danach wieder logisch 0 werden. Beispiel: Adressieren RSO bis RS2 das Register 0, während CSO kurz auf logisch 1 liegt, und liegen alle Datenbits derweil ebenfalls auf Null, wird eine Pause “gesprochen“, da Register 0 für Phonem-nummem zuständig ist und das Phonem mit der Nummer Null eine Pause ist (s. Tab. 1 “Phonemliste“).

Die Nummern der Phoneme und die Phoneme selbst finden Sie, jeweils mit einem Beispiel, in Tabelle 1 aufgelistet.

Neben dem CSO-Eingang des SSI 263 (zum Schreiben von Daten kurz auf logisch 1 zu legen), den nun bekannten Registern (durch RSO, RS1 und RS2 andressiert) und dem Datenbus (DO bis D7) ist nur noch ein Bit für die Programmierung wichtig: das A/R (Acknowledge/Request)-Bit, das logisch 1 ist, solange der SSI 263 beschäftigt ist und danach auf 0 geht. Über dieses Bit erfolgt also das “Händeschütteln“. Eine Berücksichtigung des Handshake-Signals A/R ist vor der Initialisierung des SSI 263 nicht ratsam, da es unter Umständen schon auf 1 liegen kann und so nie initialisiert werden könnte (was auch passiert, wenn man MODUS Null wählt!!); nach der Initialisierung sollte A/R aber immer beachtet werden, wenn man verständliche Sprache produzieren will (für spezielle Effekte kann man A/R natürlich ignorieren).

Jetzt kennen Sie bereits alle wichtigen Grundlagen zur Programmierung des SSI 263, aber Sie müssen auch noch wissen, wie Sie mit dem “Ding“ in Verbindung treten: dazu ist die Pa-rallel-Schnittstelle mit der Z80A PIO (s. “Aufbau von SPRECHI“, Schaltplan) nötig, die wie folgt zu initialisieren ist:

Zuerst in Assembler

;PIO-Initialisierung

LD A ,207
LD BC , #F8F2
OUT (C),A
SUB A
OUT (C),A
LD BC , #F8F3
LDA ,207
OUT (C),A ; Port A(&F8F0) : Datenbyte
LD A , 128 ;Port B(&F8F1) : Register und Handshake
OUT (C),A

Das Ganze nun in BASIC:

1' PIO-Initialisierung
10 OUT &F8F2,207
20 OUT &F8F2,0
30 OUT &F8F3,207
40 OUT &F8F3,128

Nach Ausführung dieser Initialisierungsroutine ist die PIO bereit: Port A mit der Adresse &F8F0 ist mit dem Datenbus des SSI 263 verbunden; PORT B (Adresse &F8F1) erhält im siebten Bit das A/R-Signal für den Handshake. Bit 6 liegt am CSO-Eingang des SSI 263 und wird als Schreibsingnal benötigt. Die Bits 3,4 und 5 sind mit RSO, RS1 und RS2 des SSI 263 verbunden, wählen also das Register des SSI 263 an, in das das Datenbyte geladen werden soll. An die noch freien Bits 0,1 und 2 können Sie eigene Erweiterungen anschließen, abfragen und Steuerimpulse ausgeben.

Mit diesem Wissen können wir nun - nach der Initialisierung der PIO —den SSI 263 (und damit unseren lieben kleinen SPRECHI) voll ausreizen, und wir wollen Ihnen nun zum schnellen und leichten Einstieg elementare Routinen für Programme, die mit SPRECHI arbeiten sollen vorstellen. Selbstverständlich werden wir diese Progrämmchen erklären, so daß Sie diese Routinen selber verändern und in Ihren Programmen einsetzen können. (Anregungenund Verbesserungsvorschlä-ge sind natürlich immer willkommen...)

Die wichtigste Routine ist sicher die, die ein Datenbyte in ein Register des SSI 263 lädt, denn nur so kann man Sprache oder Musikeffekte erzeugen. Wir haben dafür das folgende Programm entwickelt, bei dem - je nach Einsprungadresse - mit oder ohne Handshake (also mit oder ohne Warten, bis der SSI 263 nicht mehr beschäftigt ist) ein Datenbyte in ein Register geladen wird. (Normalerweise muß das Busy-Signal (Handshake) beachtet werden, bei der Initialisierung jedoch sollte man es sicherheitshalber ignorieren... (s.o.)). Die BASIC- und die Assembler-Routine haben genau dieselben Übergabeparameter:

H enthält die Registerauswahl (s. Tabelle 2) und L enthält das Datenbyte, das in das ausgewählte Register geladen werden soll.

Ein “CALL daus“ in Assembler bzw. “GOSUB 1020“ in BASIC bewirken, daß das Datenbyte OHNE Rücksicht auf das Handshake-Signal an den SSI 263 geschickt wird (was bei der Initialisierung sehr ratsam ist). Mit “GOSUB 1010“ in BASIC bzw. “CALL aus“ in Assembler wird das Byte erst dann in das Register geschrieben, wenn der Chip bereit ist (im normalen Betrieb benutzt man diese Übergabemethode). Da die Sprache bekanntlich über Phoneme (s.Tabelle 1) synthetisiert wird, muß man zur Ausgabe eines Phonems also H=0 und L=“Phonemnummer“ setzen. Wie wir alle wissen, sind Programmierer faule Leute und deshalb bauten wir in Assembler die Routine “paus“ ein (in BASIC mit “GOSUB 1000“ zu erreichen), die H automatisch auf Null setzt, so daß man sich in Assembler das lästige “LD H,0“ und in BASICdas “h=0“ bei jedem Phonem spart, was sowohl Zeitvorteile als auch Speicherplatzgewinn bringt. Doch nun zur Routine:

Übergabe eines Datenbytes in ein Register des SSI263

Zuerst in Assembler:

; Datenbyte (L) in
;h=Datenbyte,
;SSI 263-Register (H) laden
;l=Register-Selekt

paus:

LD H,0 ;PhonemAUSgeben, Register 0:
LD BC,&F8F1 ;Handshake über Port B
IN A,(C) ;Zustandeinlesen
CP128 ;SSI 263 busy?
JR Z,wait ;wenn ja, weiter abfragen
daus:
LD BC,&F8F0 ;Port A = Datenbyte
LD A,L
OUT (C),A ;Datenbyteausgeben
LD BC,&F8F1 ;PortB = Reg. + Handshake
LD A,H
OR 64 ;CS0 auf logisch 1
OUT (C),A ;Register auswählen
LD A,H
AND 56 ;CS0 wieder aufNull
OUT (C),A
RET

Und hier in BASIC:

1000 h = 0
1010 IF INP(&F8F1) = 128 THEN 1010 :'Handshakewait
1020 OUT &F8F0,1
1030 OUT &F8F1,h OR 64
1040 OUT &F8F1 ,h AND 56
1050 RETURN

Soll der Busy-Zustand NICHT beachtet werden, so ist in Assembler “daus“ und in BASIC Zeile 1020 anzuspringen. Nachdem wir jetzt mit Hilfe der Datenbyte-Übergabe-Routi-ne recht einfach mit dem SSI 263 kommunizieren können, ist die Initialisierung des Chips kein Problem mehr: Nach dem Einschalten des CPC befindet sich der SSI 263 in irgendeinem, nicht vorhersehbaren Zustand; um nun Daten austauschen zu können und somit Sprache bzw. Musikeffekte zu produzieren, muß sich jener SSI 263 in einem bestimmten Zustand befinden, den die folgende Initialisierungsroutine herstellt. Dazu wird (wie zu allem, was den SSI 263 betrifft) die oben beschriebene Datenbyte-Übergabe-Routine wird benötigt. Da der Zustand des SSI 263, wie schon gesagt, unbestimmt ist, wird das Busy-Signal nicht berücksichtigt, da es sonst passieren kann, daß man “ewig“ darauf wartet, daß der Chip frei ist!

Assembler:

; Initialisierung des SSI 263
LD L, 128 ;CTL=1
LD H, 24 ; Ampi., Art., Control
CALL daus ;direkt ausgeben
LD L, 192 ; Modus 3
LD H,0 ; Datenbus
CALL daus ; “Busy“ NICHT abfragen
LD L, 127 ;CTL=0
LD H, 24 ;Ampi.,Art., Control
CALL daus ; direkt ausgeben
; fertig !!

BASIC:

1 ' Initialisierung des SSI 263
10 l=128:h=24:GOSUB 1020
20 l=192:h=0:GOSUB 1020
30 l=127 :h=24: GOSUB 1020
40 'SSI263 ist initialisiert
50 'jetzt kann man z.B. Tonhoehe,
60 'setzen (s.“HALLO.BAS“ !)

Zum Schluß möchten wir Ihnen ein kleines Modell unseres “Text to Speech“-Programms, das SPRECHI deutsch reden läßt, vorstellen (da solche Programme mit der Zeit recht kompliziert und relativ lang werden, sollte man sie gleich in Assembler programmieren, was dann auch Vorteile wie größere Geschwindigkeit und weniger Speicherplatz bringt):

Zuerst muß der vom Benutzer eingegebene Text in Phoneme übersetzt werden. Diese Phoneme sollten hintereinander stehen, so daß am Ende des Übersetzungs- bzw. Compiliervor-gangs der eingegebene Text als Phonemfolge vorliegt. Bei deutschem Text muß man natürlich berücksichtigen, daß “SCH“ nicht als “S“,“C“,“H“, sondern eben als “SCH“ (Phonemnummer &32) vorliegen muß, daß einem Vokal folgendes “H“ nicht gesprochen wird, und, und, und ... (jede Sprache hat da ihre Eigenheiten). Allein die Erkundung von Regeln in einer Sprache macht schon Spaß (und Mühe); am schönsten ist es aber, wenn ein selbst geschriebenes Programm einen Text so super in Phoneme übersetzt, daß fast jeder eingegebene Text richtig (also halbwegs verständlich) ausgesprochen wird! Hat man einmal so ein Programm, kann man sich daran machen, weitere Sprachcharakteristika wie Sprachmelodie, Sprachge-schwindigkeit, usw. mit zu berücksichtigen, so daß die Stimme zum Beispiel zum Punkt hingesenkt, zum Fragezeichen hin jedoch gehoben wird!

Sie sehen also, daß das Übersetzungsprogramm am wichtigsten (und damit auch am kompliziertesten und längsten) ist, weshalb wir hier kein konkretes Beispiel geben können (der Assembler-Quellcode unseres Übersetzungsprogramms ist knapp 12K lang!).

Die Ausgabe einer bereits compilierten Phonemfolge an den SSI ist dagegen nicht allzu schwer und auch als Demonstration dafür geeignet, wie man SPRECHI zum Reden bringen kann: (Die Datenbyte-Übergabe-Routine wird natürlich auch hier benötigt)

talk:

LD HL,phonl ;HL zeigt auf den Anfang der Phonemliste speak:
LD A,(HL)
CP #FF ;fertig?
RETZ
LD L,A ;L enthält die Phonemnummer
CALL paus ;über “paus“ an den SSI 263 aus-geben
INC HL ;HLauf nächstes Phonem
JR speak

phon1:
DEFB 0, #2C, #D, ;zu sprechende Phoneme #21,#12
DEFB #FF ; #FF kennzeichnet das Ende

Nach Anspringen von “talk“ mit “CALL talk“ bzw. “JP talk“ werden die ab “phonl“ abgelegten Phoneme unter Berücksichtigung des Busy-Signals an den SSI 263 gesendet. (Dadurch wird sichertgestellt, daß erst dann ein neues Phonem gesprochen wird, wenn das aktuelle fertig ausgesprochen wurde). Ein weiteres besonderes Feature von SPRECHI darf nicht unerwähnt bleiben: die Möglichkeit, ihn SINGEN zu lassen (s. DEMO “Über sieben Brücken mußt Du geh'n ...“). Dazu wählt man Modus 1 oder 2 an, damit die Zielfrequenz sofort eingestellt wird - sich die Stimme also nicht, wie beim normalen Sprechen, schrittweise der Zielfrequenz annähert. Da man normalerweise die Noten des Liedes kennt und dadurch (mit Hilfe der Tabelle “Noten und Tobperioden“ im Anhang des Handbuches) auch die entsprechenden Frequenzen ermitteln kann, muß man diese nur noch dem Tonhöhenregister des SSI 263 übermitteln. Dafür haben wir folgende Formel entwickelt:

SSIData=-62500/(Frequenz/7) + 4096

In Zeile 240 des Demoprogramms “Über sieben Brücken... “ ist die Anwendung dieser Formel im Zusammenhang zu sehen. Das “Filtern“ der Bits 3 bis 10 für das Tonhöhenregister erledigt der lange Ausdruck mit “a=VAL(“&X“4-MID$(.. denn die Bits 0,1,2 und 11 sind hierbei vemachlässigbar. (Wenn dies nicht der Fall ist, müßten sie gesondert in das Register für “Tonhöhe und Artikulation“ geschrieben werden).

Wie die Tonhöhe kann auch die Filterfrequenz, die normalerweise bei 20 Khz liegt, verändert werden. Auch hier hat man eine Frequenz, die einem vorschwebt - sie muß nur dem SSI 263 irgendwie übermittelt werden ... dafür haben wir folgende Formel für Sie:

FF = -1E6/(2*Filterfrequenz) + 256

“FF“ ist der Wert, der in das Filterfrequenz-Register des SSI 263 geschrieben werden muß (von BASIC mit unserem RSX-Befehl “|FILTERFREQUENZ,FF“ bzw. “|FFQ,FF“ möglich). (Stören Sie sich nicht an dem “-1E6“; dies ist nur eine Kurzform für “-1000000“, die sicher schneller und fehlerfreier eingegeben wird.)

So, jetzt wissen Sie eigentlich alles Wesentliche über SPRECHI und auch über Sprachsynthese, -programme und -proble-me. Wahrscheinlich haben Sie schon irgendwelche Ideen (ein DATA-Zeilen-Vorleser, eine Brief-Vorleserin,...), die Sie sicher auch bald umsetzen werden.

Doch erfreuen Sie sich nicht allein an Ihren Kostbarkeiten, sondern lassen Sie die gesamte PC INTERNATIONAL-Leser-schaft daran teilhaben, indem Sie Ihre SPRECHI-Programme an die Redaktion schicken!

Sollten Sie sich jedoch noch genauer über Sprachsynthese im allgemeinen und den SSI 263 im besonderen informieren wollen, so können wir Ihnen folgende Literatur empfehlen, die auch als Quelle der hier veröffentlichten Schaltung zu nennen sind:

1. Häder,D-P/Götzlaff,W: "Sprechen mit dem Mikro “ ausdem Vogel-Buchverlag, Würzburg1986 (erschienen in der Reihe “CHIP Wissen") ISBN 3-8023-0882-4
2. Silicon Systems: Datenblatt SSI 263, SSI263A Tust in, Kalifornien: SiliconSystems Inc., 1984 (oder Händler,die den SSI 263(A)flihren)
3. Ciarcia,S.: “Buildathird generation phonetic speech synthesi-zeruBYTE, März 1984, S.28-42
Den einzigen Spezialchip, den SPRECHI enthält, ist der SSI 263; alle anderen Bauteile sind in jedem gut sortierten Elektronikladen (bzw. Versand) erhältlich. Diesen SSI 263(A) bekommen Sie bei:

Dr. Otto Soskuty Reis Straße 16 6200 Wiesbaden
Atlantik Electronic GmbH Fraunhoferstr. 11a 8033 Martinsried
Silicon Systems Inc. 14351 Myford Road

Tustin, CA 92680 Tel. (06121) 463822 Tel (089)857208689 U.S.A. (wenn möglich sollten Sie sich einen SSI 263A beschaffen, da dieser etwas besser klingt als der SSI 263, aber sehr groß ist der Unterschied wirklich nicht).

Die kleine Verstärkungs-Schaltung mit dem NF-Verstärker LM 386 wurde dem Buch

Siegfried Wirsum

Praktizierte Elektronik

Franzis ' Verlag 1982 in Grundzügen entnommen.

(Jan-Mirko Maczewski/Jens Heimsoeth/jb), CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1988
★ CONFIG: ???
★ LANGUAGE:
★ LiCENCE: FREEWARE
★ COLLECTION: CPC AMSTRAD INTERNATIONAL-SONDERHEFT
★ AUTHORS: Jan-Mirko MACZEWSKI , Jens HEIMSOETH
★ NOTE (Achtung Hardware-Freunde!!) : In letzter Minute hat sich ein Fehler gezeigt!! Die Stromversorgung des CPC reicht nicht aus!! Trennen Sie bitte den Anschluß vom Rechner an PIN 27 auf (+ 5 V intern) und legen Sie eine externe 5 Volt-Spannung an diesen P/N.
 



★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
  » Sprach-Synthesizer    (CPC  Amstrad  International-Sonderheft  7)    GERMANDATE: 2025-11-14
DL: 16
TYPE: ZIP
SiZE: 10Ko
NOTE: Supplied by hERMOL ; 40 tracks
.DSK: √

  » Sprach-Synthesizer    (CPC  Amstrad  International-Sonderheft  7)    GERMAN    LISTINGDATE: 2025-11-14
DL: 17
TYPE: PDF
SiZE: 2186Ko
NOTE: Supplied by archive.org ; 5 pages/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Hardware » Reset ohne Datenverlust (Happy Computer)
» Hardware » Amstrad Synthesiser Interface (Practical Electronics)
» Hardware » Platinen maßgeschneidert (Happy Computer)
» Hardware » A-D-Wandler (Happy Computer)
» Hardware » Sound - Sound Player 2
» Hardware » Speicheroszilloskop selbstgebaut (Happy Computer)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 396 millisecondes et consultée 69 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.