★ HARDWARE ★ MONTAGES ★ Der Laberkasten Sprach-Synthesizer für die CPC's|CPC Amstrad International) ★![]() |
| Sprach-Synthesizer (CPC Amstrad International) | Hardware Montages |
“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: An Bauteilen benötigen Sie Folgendes: Widerstände: Kondensatoren: (Die Bezeichnung uF steht für Mikrofarad) 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. 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 &89EDNun 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!"Auch längere Texte sind kein Problem: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PHONEMLISTE SSI 263 | ||||||
| Hex-Code | Symbol | Belspielwort (in Englisch) | Hex-Code | Symbol | Belspielwort (in Englisch) | |
| 00 | PA | (Pause) | 20 | L | ||
| 01 | E | 21 | L1 | |||
| 02 | E1 | 22 | LF | |||
| 03 | Y | 23 | W | |||
| 04 | Y1 | 24 | B | |||
| 05 | AY | 25 | D | |||
| 06 | IE | 26 | KV | |||
| 07 | I | 27 | P | |||
| 08 | A | 28 | T | |||
| 09 | AI | 29 | K | |||
| 0A | EH | 2A | HV | |||
| 0B | EH1 | 2B | HVC | |||
| 0C | AE | 2C | HF | |||
| 0D | AE1 | 2D | HFC | |||
| 0E | AH | 2E | HN | |||
| 0F | AH! | 2F | Z | |||
| 10 | AW | 30 | S | |||
| 11 | O | 31 | J | |||
| 12 | OU | 32 | SCH | |||
| 13 | OO | 33 | V | |||
| 14 | IU | 34 | F | |||
| 15 | IU1 | 35 | THV | |||
| 16 | U | 36 | TH | |||
| 17 | U1 | 37 | M | |||
| 18 | UH | 38 | N | |||
| 19 | UH1 | 39 | NG | |||
| 1A | UH2 | 3A | :A | |||
| 1B | UH3 | 3B | :OU | |||
| 1C | ER | 3C | :U | |||
| 1D | R | 3D | :UH | |||
| 1E | R1 | 3E | E2 | |||
| 1F | R2 | 3F | LB | |||
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:
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:
Wiederum ein Beispiel:
|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:
Dazu ebenfalls ein Beispiel:
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:
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.
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
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:
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:
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
RETUnd hier in BASIC:
Assembler:
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:
phon1:
DEFB 0, #2C, #D, ;zu sprechende Phoneme #21,#12
DEFB #FF ; #FF kennzeichnet das EndeNach 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:
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:
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
| ![]() |
|